将元素添加到 c 中列表开头的代码 - 错误是什么?
Code to add element to the beginning of a list in c - what's the error?
有人告诉我这将无法正确地将节点添加到列表中,但我已经对其进行了测试并且它似乎可以工作。任何人都可以让我知道这段代码中有什么不正确的地方吗?
struct node {
int num;
struct node* next;
};
void add_first(struct node* head, struct node* new_node) {
new_node->next = head;
head = new_node;
}
我要回答的确切问题是:
a) 该函数将无法给出预期的结果(即添加节点)。问题是什么,何时发生?
为了找出问题所在,我创建了四个节点,对它们使用了 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;
}
我得到的输出是:
3 2 1
这似乎是正确的。那么,如果我得到了正确的输出,为什么函数不能给出预期的结果呢?我看不出有什么问题。
add_first(node,NULL)
将擦除头指针数据并给你错误。
第二种情况如果 head 为 NULL add_first(NULL,node);
函数和测试程序不正确。
节点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 并将实际头部传递给它
display( n1 );
考虑到像这样的陈述
n1 = (struct node*)malloc(sizeof(struct node*));
^^^^^
无效。您必须自己分配节点而不是指针,即
n1 = (struct node*)malloc(sizeof(struct node ));
^^^^
有人告诉我这将无法正确地将节点添加到列表中,但我已经对其进行了测试并且它似乎可以工作。任何人都可以让我知道这段代码中有什么不正确的地方吗?
struct node {
int num;
struct node* next;
};
void add_first(struct node* head, struct node* new_node) {
new_node->next = head;
head = new_node;
}
我要回答的确切问题是:
a) 该函数将无法给出预期的结果(即添加节点)。问题是什么,何时发生?
为了找出问题所在,我创建了四个节点,对它们使用了 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;
}
我得到的输出是:
3 2 1
这似乎是正确的。那么,如果我得到了正确的输出,为什么函数不能给出预期的结果呢?我看不出有什么问题。
add_first(node,NULL)
将擦除头指针数据并给你错误。
第二种情况如果 head 为 NULL add_first(NULL,node);
函数和测试程序不正确。
节点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 并将实际头部传递给它
display( n1 );
考虑到像这样的陈述
n1 = (struct node*)malloc(sizeof(struct node*));
^^^^^
无效。您必须自己分配节点而不是指针,即
n1 = (struct node*)malloc(sizeof(struct node ));
^^^^