int CircleList_Insert(CircleList *list, CircleListNode *node, int pos) //O(n) { TCircleList *slist = (TCircleList *)list; int ret = (slist != NULL) && (pos >= 0) && (node != NULL); int i = 0; if(ret) { CircleListNode *current = (CircleListNode *)slist; for(i = 0; (i < pos) && (current->next != NULL); i++) { current = current->next; } node->next = current->next; current->next = node; if(slist->length == 0) { slist->slider = node; node->next = node; } slist->length++; if(current == (CircleListNode *)slist) { CircleListNode *last = CircleList_Get(slist,slist->length-1); last->next = current->next; } } return ret; }
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos) // O(n) { TCircleList* sList = (TCircleList*)list; int ret = (sList != NULL) && (pos >= 0) && (node != NULL); int i = 0; if( ret ) { CircleListNode* current = (CircleListNode*)sList; for(i=0; (i<pos) && (current->next != NULL); i++) { current = current->next; } node->next = current->next; current->next = node; if( sList->length == 0 )//修改: 原来node->next = node删除 对插入第一个元素时修正 { sList->slider = node; } sList->length++; if( current == (CircleListNode*)sList )//添加: 判断是不是第0个位置 做出修正 { CircleListNode* last = CircleList_Get(sList, sList->length - 1); last->next = current->next;//修正让最后一个元素的next指向表头的next } } return ret; }
CircleListNode *CircleList_Delete(CircleList *list, int pos) { CircleListNode *ret = NULL; if ( (list!=NULL) && (pos>=0) ) { int i; CircleListNode *cur = (CircleListNode*)list; CircleListNode *first = list->header.next; CircleListNode *last = \ CircleList_Get(list, list->length-1); log("last->itme=%d\n", last->item); for (i=0; i<pos; i++) cur = cur->next; ret = cur->next; cur->next = ret->next; list->length --; log("length=%d\n", list->length); if ( ret == list->slider ) { list->slider = ret->next; } if ( first == ret ) { list->header.next = ret->next; last->next = ret->next; } if ( list->length == 0 ) { list->header.next = NULL; list->slider = NULL; } } return ret; }
int main(int argc, char *argv[]) { CircleList* list = CircleList_Create(); struct Value v1; struct Value v2; struct Value v3; struct Value v4; struct Value v5; struct Value v6; struct Value v7; struct Value v8; int i = 0; v1.v = 1; v2.v = 2; v3.v = 3; v4.v = 4; v5.v = 5; v6.v = 6; v7.v = 7; v8.v = 8; CircleList_Insert(list, (CircleListNode*)&v1, 0); CircleList_Insert(list, (CircleListNode*)&v2, 0); CircleList_Insert(list, (CircleListNode*)&v3, 0); CircleList_Insert(list, (CircleListNode*)&v4, 0); CircleList_Insert(list, (CircleListNode*)&v5, 0); CircleList_Insert(list, (CircleListNode*)&v6, 0); CircleList_Insert(list, (CircleListNode*)&v7, 0); CircleList_Insert(list, (CircleListNode*)&v8, 0); for(i=0; i<CircleList_Length(list); i++) { struct Value* pv = (struct Value*)CircleList_Get(list, i); printf("%d\n", pv->v); } puts(" "); CircleList_joseph(list,0,2); printf("\n"); CircleList_Destroy(list); return 0; }
CircleListNode *CircleList_Delete(CircleList *list, int pos) //O(n) { TCircleList *slist = (TCircleList *)list; CircleListNode * ret = NULL; int i = 0; if((slist != NULL) && (pos >= 0)) { CircleListNode * current = (CircleListNode *)slist; CircleListNode * first = slist->header.next; for(i = 0; i < pos; i++) { current = current->next; } if(current == (CircleListNode *)slist) { CircleListNode * last = (CircleListNode *)CircleList_Get(slist,slist->length - 1); } ret = current->next; current->next = ret->next; slist->length--; if(last != NULL) { slist->header.next = ret->next; last->next = ret->next; } if(slist->slider == ret) { slist->slider = ret->next; } if(slist->length == 0) { slist->header.next = NULL; slist->slider = NULL; } } return ret; }
CircleListNode* CircleList_Delete(CircleList* list, int pos) // O(n) { TCircleList* sList = (TCircleList*)list; CircleListNode* ret = NULL; int i = 0; if( (sList != NULL) && (pos >= 0) && (sList->length > 0) )//合法性判断 提高程序的健壮性 { CircleListNode* current = (CircleListNode*)sList; CircleListNode* last = NULL; for(i=0; i<pos; i++) { current = current->next; } if( current == (CircleListNode*)sList )//是否为表头 { last = (CircleListNode*)CircleList_Get(sList, sList->length - 1); } ret = current->next; current->next = ret->next; sList->length--; if( last != NULL ) { sList->header.next = ret->next; last->next = ret->next; } if( sList->slider == ret ) { sList->slider = ret->next; } if( sList->length == 0 ) { sList->header.next = NULL; sList->slider = NULL; } } return ret; }