int insertionSort(My402List *pList, My402SortElem *pKey){ My402ListElem *current = My402ListLast(pList); My402ListElem *prevCurrent = current; while(current != NULL && current->obj != NULL && ((My402SortElem *)current->obj)->transTime > pKey->transTime){ prevCurrent = current; current = My402ListPrev(pList, current); } if(current != NULL && current->obj != NULL){ if(((My402SortElem *)current->obj)->transTime == pKey->transTime){ fprintf(stderr,"\nTime stamp %lld is repeated for some entries",(long long)pKey->transTime); //clean up an return unlinkSortElements(pList); return FALSE; } } if(current == NULL){ My402ListInsertBefore(pList, pKey, prevCurrent); }else{ My402ListInsertAfter(pList, pKey, current); } return TRUE; }
int sortInsert(My402List *list, ListEntry *Entry) { My402ListElem *temp; ListEntry *tempobj; temp = My402ListNext(list, &list->anchor); while(temp){ tempobj = (ListEntry *) temp->obj; if(Entry->timestamp == tempobj->timestamp) { fprintf(stderr, "Transactions have Identical timestamp %ld\n", Entry->timestamp); return 0; } if(Entry->timestamp < tempobj->timestamp) { if(!My402ListInsertBefore(list, Entry, temp)){ return 0; } return 1; } temp = My402ListNext(list, temp); } if(!My402ListAppend(list, Entry)){ return 0; } return 1; }
static void BubbleForward(My402List *pList, My402ListElem **pp_elem1, My402ListElem **pp_elem2) /* (*pp_elem1) must be closer to First() than (*pp_elem2) */ { My402ListElem *elem1=(*pp_elem1), *elem2=(*pp_elem2); void *obj1=elem1->obj, *obj2=elem2->obj; My402ListElem *elem1prev=My402ListPrev(pList, elem1); /* My402ListElem *elem1next=My402ListNext(pList, elem1); */ /* My402ListElem *elem2prev=My402ListPrev(pList, elem2); */ My402ListElem *elem2next=My402ListNext(pList, elem2); My402ListUnlink(pList, elem1); My402ListUnlink(pList, elem2); if (elem1prev == NULL) { (void)My402ListPrepend(pList, obj2); *pp_elem1 = My402ListFirst(pList); } else { (void)My402ListInsertAfter(pList, obj2, elem1prev); *pp_elem1 = My402ListNext(pList, elem1prev); } if (elem2next == NULL) { (void)My402ListAppend(pList, obj1); *pp_elem2 = My402ListLast(pList); } else { (void)My402ListInsertBefore(pList, obj1, elem2next); *pp_elem2 = My402ListPrev(pList, elem2next); } }
void insert_list(My402List * list, My402TransData * data) { if(My402ListEmpty(list)) (void)My402ListAppend(list, (void*)data); else { My402ListElem * elem = My402ListFirst(list); while(elem) { My402TransData * temp = (My402TransData *)(elem -> obj); if(temp -> timestamp < data -> timestamp) { elem = My402ListNext(list, elem); if(!elem) (void)My402ListAppend(list, (void*)data); } else if(temp -> timestamp > data -> timestamp) { (void)My402ListInsertBefore(list, (void*)data, elem); break; } else print_error("two identical timestamp"); } } }
void insertionSort(My402List *pList, My402SortElem *pKey){ My402ListElem *current = My402ListLast(pList); My402ListElem *prevCurrent = current; while(current != NULL && current->obj != NULL && ((My402SortElem *)current->obj)->transTime > pKey->transTime){ prevCurrent = current; current = My402ListPrev(pList, current); } if(current == NULL){ My402ListInsertBefore(pList, pKey, prevCurrent); }else{ My402ListInsertAfter(pList, pKey, current); } }
void InserstionSort(My402List *list,void *obj_new){ My402ListElem *elem = My402ListFirst(list), *next_elem = NULL; MyDS *key = NULL, *new_key = NULL, *next_key = NULL; long cur_value = 0, new_value = 0, next_value=0; int flag = 0; new_key = obj_new; // when no element in the list if (My402ListEmpty(list)) { My402ListAppend(list,obj_new); } else{ for (elem = My402ListFirst(list); elem != NULL; elem = My402ListNext(list, elem) ) { next_elem = My402ListNext(list, elem); if( next_elem != NULL){ key = elem->obj; next_key = next_elem->obj; next_value = atol(next_key->t_date); cur_value = atol(key->t_date); new_value = atol(new_key->t_date); if(new_value == cur_value){ fprintf(stderr,"Same TimeStamps!!!\n"); exit(1); } if(new_value > cur_value && new_value < next_value ){ flag = My402ListInsertAfter(list, obj_new, elem); if(!flag){ fprintf(stderr,"Error while inserting obj after elem\n"); exit(1); } break; } else if(new_value< cur_value){ flag = My402ListInsertBefore(list, obj_new, elem); if(!flag){ fprintf(stderr,"Error while sorting\n"); exit(1); } break; } } else if(next_elem == NULL){ new_value = atol(new_key->t_date); key = elem->obj; cur_value = atol(key->t_date); if(new_value == cur_value){ fprintf(stderr,"Same TimeStamps!!!\n"); exit(1); } if(new_value < cur_value){ flag = My402ListInsertBefore(list, obj_new, elem); if(!flag) fprintf(stderr,"Error while inserting obj before elem\n"); } else{ flag = My402ListInsertAfter(list, obj_new, elem); if(!flag){ fprintf(stderr,"Error while inserting obj after elem when one element is there!!\n"); } } break; } } } }
void ParseFile(FILE *file){ char buffer[1024]; memset(buffer, 0, sizeof(buffer)); transaction *obj = NULL; My402List list; memset(&list, 0, sizeof(My402List)); (void)My402ListInit(&list); while(fgets(buffer, sizeof(buffer), file) != NULL){ obj = (transaction*)malloc(sizeof(transaction)); if(obj == NULL){ fprintf(stderr, "%s\n", strerror(errno)); } else{ char *start_ptr = buffer; char *tab_ptr = strchr(start_ptr, '\t'); int noofptr = 0; while(tab_ptr != NULL){ noofptr++; tab_ptr++; start_ptr = tab_ptr; tab_ptr = strchr(start_ptr, '\t'); } if(noofptr > 3){ fprintf(stderr, "Too many tabs, Clearing memory and Quiting Program\n"); free(obj); My402ListUnlinkAll(&list); exit(0); } if(noofptr < 3){ fprintf(stderr, "Format Malformed, Clearing memory and Quiting Program\n"); free(obj); My402ListUnlinkAll(&list); exit(0); } start_ptr = buffer; tab_ptr = strchr(start_ptr, '\t'); if(Transaction_Type(obj, start_ptr, tab_ptr) == 0){ fprintf(stderr, "Transaction Type failed, Clearing Memory and Quiting Program\n"); free(obj); My402ListUnlinkAll(&list); exit(0); } tab_ptr++; start_ptr = tab_ptr; tab_ptr = strchr(start_ptr, '\t'); if(Transaction_TimeStamp(obj, start_ptr, tab_ptr) == 0){ fprintf(stderr, "Transaction Time failed, Clearing Memory and Quiting Program\n"); free(obj); My402ListUnlinkAll(&list); exit(0); } tab_ptr++; start_ptr = tab_ptr; tab_ptr = strchr(start_ptr, '\t'); if(Transaction_Amount(obj, start_ptr, tab_ptr) == 0){ fprintf(stderr, "Transaction Amount failed, Clearing Memory and Quiting Program\n"); free(obj); My402ListUnlinkAll(&list); exit(0); } tab_ptr++; start_ptr = tab_ptr; tab_ptr = strchr(start_ptr, '\n'); Transaction_Description(obj, start_ptr, tab_ptr); //Now the struct is filled with the string fields read from the first line of the file if(My402ListLength(&list) == 0) (void)My402ListPrepend(&list, obj); else{ My402ListElem *elem = NULL; for(elem = My402ListFirst(&list); elem != NULL; elem=My402ListNext(&list, elem)){ if((((transaction*)(elem->obj))->trans_time == obj->trans_time)){ fprintf(stderr, "Error - Two entry at same time, Quiting program\n"); free(obj); My402ListUnlinkAll(&list); exit(0); } if((((transaction*)(elem->obj))->trans_time > obj->trans_time)){ (void)My402ListInsertBefore(&list, obj, elem); break; } if(My402ListNext(&list, elem) == NULL){ (void)My402ListAppend(&list, obj); break; } } } } } PrintTransactionList(&list); My402ListUnlinkAll(&list); }