【发布时间】:2017-03-22 18:42:45
【问题描述】:
我刚刚尝试在 C 中实现一个递归链表追加,出于某种原因,无论我做什么,我都会保持为 NULL,即使我在遇到 NULL 值时进行 malloc。
以下代码不打印任何内容。有什么想法吗?
#include <stdlib.h>
#include <stdio.h>
typedef struct node {
unsigned v;
struct node* next;
} node;
void insert(unsigned x, node* l) {
if (l == NULL){
node* new_node = (node*)malloc(sizeof(node));
new_node->v = x;
new_node->next = NULL;
l = new_node;
}
else {
insert(x, l->next);
}
}
void print(node *l) {
if (l == NULL) return;
printf("%d\n", l->v);
print(l->next);
}
int main(){
node* l = NULL;
insert(1, l);
insert(2, l);
print(l);
return 0;
}
非常感谢您的帮助。
编辑:即使我初始化它,它仍然是一样的。
【问题讨论】:
-
l未初始化。 -
你从来没有将
l指向任何东西——如果它是空的,你(不)幸运,因为它是一个未初始化的指针。您还会遇到insert()函数的问题,该函数无法防止尝试重新插入已包含在列表中的节点。 -
l = new_node;不会像您认为的那样做 - 您需要传入指向指针的指针作为参数 (node** l) 并分配*l = new_node; -
@UnholySheep 亲爱的上帝......谢谢你。我在这上面浪费了我生命中的 3 个小时。请问旧代码到底是什么问题..我仍然不明白为什么它不起作用。
-
将
node* l作为参数意味着您的函数有一个本地指针变量,该变量指向与您传入的指针相同的地址。但是仅更改它指向的内容(通过l = new_node;)更改函数内的指针指向的内容,它不会影响您作为参数传递的指针。 - 这就是为什么你需要一个指向指针的指针
标签: c recursion linked-list