将元素添加到c中的列表开头的代码 - 错误是什么?
我被告知,这将无法正确地将节点添加到列表中,但我已经测试它,它似乎工作。任何人都可以让我知道这段代码中的错误吗?将元素添加到c中的列表开头的代码 - 错误是什么?
struct node {
int num;
struct node* next;
};
void add_first(struct node* head, struct node* new_node) {
new_node->next = head;
head = new_node;
}
我试图回答的具体问题是:
一)此功能将无法得到期望的结果(即,添加节点)。什么是问题,什么时候发生?
为了尝试找到问题,我创建了四个节点,在它们上使用add_first函数,然后显示结果。不过,我似乎得到了正确的输出结果。这是我整个编写的程序,不包括上述功能:
void display(struct node* head) {
printf("%d ", head->num);
if(head->next == NULL) {
return;
}
display(head->next);
}
int main() {
struct node* n1;
struct node* n2;
struct node* n3;
n1 = (struct node*)malloc(sizeof(struct node*));
n2 = (struct node*)malloc(sizeof(struct node*));
n3 = (struct node*)malloc(sizeof(struct node*));
n1->num = 1;
n2->num = 2;
n3->num = 3;
add_first(n1, n2);
add_first(n2, n3);
display(n3);
return 0;
}
我得到的输出是:
这似乎是正确的。所以,如果我得到正确的输出,为什么函数不能给出预期的结果?我没有看到它的问题。
功能和测试程序是不正确的。
节点n1
应该是不是头呢?但是,您显示的是通过节点n3
而不是节点n1
而不是节点的列表。
实际上,您建立了一个列表,其头部为n3
,并将n2和n1添加到列表的尾部。
与功能
void add_first(struct node* head, struct node* new_node) {
new_node->next = head;
head = new_node;
}
的问题是,指针到节点head
通过值传递。所以这个声明
head = new_node;
处理一个原始头n1
的副本。实际上该功能不会改变n1
。
您必须通过参考n1
的头部。
正确的代码可以看至少像
void add_first(struct node **head, struct node *new_node)
{
new_node->next = *head;
*head = new_node;
}
考虑到,你必须设置数据成员添加的节点旁NULL帐户。这是主要的,你必须为每个创建的节点
n1->num = 1;
n1->next = NULL;
n2->num = 2;
n2->next = NULL;
n3->num = 3;
n3->next = NULL;
函数本身写将被称为像
add_first(&n1, n2);
和
add_first(&n1, n3);
在这种情况下,功能显示可称为正确传递给它的实际头
display(n1);
考虑到,像这样
n1 = (struct node*)malloc(sizeof(struct node*));
^^^^^
声明是无效的。而不是指针,你必须分配的节点本身是
n1 = (struct node*)malloc(sizeof(struct node));
^^^^
非常感谢!我错过了该函数正在处理复制而不是原始值的事实。你的解释非常有帮助。 – Kendra
@Kendra根本没有。不用谢。:) –
add_first(node,NULL)
将擦除头指针数据并给出错误。
和第二情况下,如果头是NULL add_first(NULL,node);
majar问题是,你不能更新调用者的节点。尝试更改API以使其更像'n1 = add_first(n1,n2);'(返回头部)并且其他问题是'sizeof(struct node *)' - >'sizeof(struct node)'并且'next'没有被初始化。 E.g'n1-> num = 1;' - >'n1-> num = 1; n1-> next = NULL;' – BLUEPIXY