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; }
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); } }
int main(){ int i=100; int j=0; My402List list; //========== initialization part starts========== memset(&list,0,sizeof(My402List)); My402List *pList = NULL; pList = &list; My402ListElem *ptrToAnchor = &(pList->anchor); ptrToAnchor->next = ptrToAnchor; ptrToAnchor->prev = ptrToAnchor; //=========== initialization part ends============ My402ListElem *current = ptrToAnchor; for(; j<10;j++){ My402ListInsertAfter(&list,(void *)&i,current); i= i+10; current = current->next; } NL printf("Appneded the whole list"); NL for(current=My402ListFirst(pList); current != NULL; current=My402ListNext(pList,current) ){ printf("%d -->", *((int *)current->obj)); } NL }
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); } }
// Append the item to the list int My402ListAppend(My402List* myList, void* elem) { My402ListElem *newElement = NULL; My402ListElem *anchorElement = &myList->anchor; newElement = (My402ListElem *)malloc(sizeof(My402ListElem)); if(newElement != NULL) { if(My402ListEmpty(myList)) { newElement->prev = anchorElement; newElement->next = anchorElement; anchorElement->next = newElement; anchorElement->prev = newElement; newElement->obj = elem; myList->num_members++; return TRUE; } else { return My402ListInsertAfter(myList,elem,My402ListLast(myList)); } } return FALSE; }
// Prepend the item to the list int My402ListPrepend(My402List* myList, void* elem) { return My402ListInsertAfter(myList,elem,My402ListFirst(myList)->prev); }
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; } } } }