为什么拆分列表在此程序中始终为空?(它来自链接列表上维基百科页面上的代码.)
/* Example program from wikipedia linked list article Modified to find nth node and to split the list */ #include#include typedef struct ns { int data; struct ns *next; /* pointer to next element in list */ } node; node *list_add(node **p, int i) { node *n = (node *)malloc(sizeof(node)); if (n == NULL) return NULL; n->next = *p; //* the previous element (*p) now becomes the "next" element */ *p = n; //* add new empty element to the front (head) of the list */ n->data = i; return *p; } void list_print(node *n) { int i=0; if (n == NULL) { printf("list is empty\n"); } while (n != NULL) { printf("Value at node #%d = %d\n", i, n->data); n = n->next; i++; } } node *list_nth(node *head, int index) { node *current = head; node *temp=NULL; int count = 0; // the index of the node we're currently looking at while (current != NULL) { if (count == index) temp = current; count++; current = current->next; } return temp; } /* This function is to split a linked list: Return a list with nodes starting from index 'int ind' and step the index by 'int step' until the end of list. */ node *list_split(node *head, int ind, int step) { node *current = head; node *temp=NULL; int count = ind; // the index of the node we're currently looking at temp = list_nth(current, ind); while (current != NULL) { count = count+step; temp->next = list_nth(head, count); current = current->next; } return temp; /* return the final stepped list */ } int main(void) { node *n = NULL, *list1=NULL, *list2=NULL, *list3=NULL, *list4=NULL; int i; /* List with 30 nodes */ for(i=0;i<=30;i++){ list_add(&n, i); } list_print(n); /* Get 1th, 5th, 9th, 13th, 18th ... nodes of n etc */ list1 = list_split(n, 1, 4); list_print(list1); list2 = list_split(n, 2, 4); /* 2, 6, 10, 14 etc */ list_print(list2); list3 = list_split(n, 3, 4); /* 3, 7, 11, 15 etc */ list_print(list3); list3 = list_split(n, 4, 4); /* 4, 8, 12, 16 etc */ list_print(list4); getch(); return 0; }
Rob Walker.. 5
temp = list_nth(current, ind); while (current != NULL) { count = count+step; temp->next = list_nth(head, count); current = current->next; }
你找到了正确的项目来开始拆分,但是从那时开始看看temp会发生什么......你只需要分配给temp-> next.
您需要跟踪拆分列表的头部和插入新项目的尾部.
temp = list_nth(current, ind); while (current != NULL) { count = count+step; temp->next = list_nth(head, count); current = current->next; }
你找到了正确的项目来开始拆分,但是从那时开始看看temp会发生什么......你只需要分配给temp-> next.
您需要跟踪拆分列表的头部和插入新项目的尾部.