【发布时间】:2016-05-30 16:47:32
【问题描述】:
我正在尝试在 C 中构建自己的 LinkedList 几个小时,但我无法使其正常工作。请指出此代码出错的位置和原因。对于实际行为,向下滚动到“main”。
struct List {
struct Node * head;
} list;
struct Node {
int data;
struct Node * next;
} node;
void
add(struct List* list, int z){
//add as first element
if(list -> head == NULL){
list -> head = malloc(sizeof(struct Node));
(list -> head) -> data = z;
(list -> head) -> next = NULL;
return;
}
//add to tail
struct Node * curr = list -> head;
while((curr -> next) != NULL){
curr = curr -> next;
}
list -> head = malloc(sizeof(struct Node));
(list -> head) -> data = z;
(list -> head) -> next = NULL;
return;
}
void
printNode(struct Node * node){
if(node == NULL){
printf("NULL\n");
return;
}
printf("%d -> ", node->data);
printNode(node->next);
}
void
printList(struct List * list){
if(list->head == NULL)
printf("empty\n");
else
printNode(list->head);
}
由于某种原因,“添加”似乎确实以某种方式改变了传递的列表,使得只有最后一个元素保留在那里。我已经多次重写了程序——递归和迭代——结果似乎总是这样。
int
main(){
struct List myList;
myList.head = NULL;
printList(&myList); // empty
add(&myList, 1);
printList(&myList); // 1 -> NULL
add(&myList, 2);
printList(&myList); // 2 -> NULL, should be 1 -> 2 -> NULL
add(&myList, 3);
printList(&myList); // 3 -> NULL, should be 1 -> 2 -> 3 -> NULL
add(&myList, 4);
printList(&myList); // 4 -> NULL, should be 1 -> 2 -> 3 -> 4 -> NULL
}
我什至用其他语言重新创建了该程序,以查看程序中是否存在任何突破性的逻辑缺陷,但在其他地方我立即让它工作。
【问题讨论】:
-
只要拿一张纸,为
add()中的每个变量写列,然后为add()中的每一行代码写行。每个步骤中每个变量的值是多少。你很快就会看到。 -
johannes 的回复是正确的,但你的程序也非常低效。您应该将新元素添加到列表的开头,或者将指针存储到列表结构中的最后一个节点。这就是列表的全部意义所在。
-
调试器.......................
标签: c singly-linked-list