我很困惑,为什么我的代码在尝试在链表末尾添加节点时不会打印好结果。我想了解它背后的逻辑,我将向您展示两个不同的代码第一个只会打印第一个节点,即使列表包含'不止一个节点,第二个节点完全符合预期,但我不明白为什么或如何工作。
第一个代码 :(令人困惑的一个)
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node *next;
};
typedef struct Node Node;
Node *head;
void insertNode(int value){
Node *t = head;
//t = head;
if (head == NULL){
Node *tmp = malloc(sizeof(Node));
tmp->data = value;
tmp->next = NULL;
head = tmp;
}
else{
while (t != NULL) {
t = t->next;
}
Node *tmp = malloc(sizeof(Node));
tmp->data = value;
tmp->next = NULL;
t = tmp;
}
}
void showNode(){
Node *tmp = head;
while (tmp != NULL) {
printf("-> %d",tmp->data);
tmp = tmp->next;
}
}
int main(){
int n,value;
head = NULL;
printf("Node number: ");scanf("%d",&n);
for (int i = 0; i < n; i++) {
scanf("%d",&value);
insertNode(value);
}
showNode();
printf("\n");
return 0;
}
第二个代码 :(正确的代码)
唯一的区别在于insertNode函数,
void insertNode(int value){
Node *t = head;
//t = head;
if (head == NULL){
Node *tmp = malloc(sizeof(Node));
tmp->data = value;
tmp->next = NULL;
head = tmp;
}
else{
while (t->next != NULL) {
t = t->next;
}
Node *tmp = malloc(sizeof(Node));
tmp->data = value;
tmp->next = NULL;
t->next = tmp;
}
}
所以,我的问题是两个代码是如何工作的以及第一个代码有什么问题?
谢谢你,:)
答案 0 :(得分:1)
重大变化是while循环中的条件:
while (t != NULL)
和
while (t->next != NULL)
在第一个节点中创建了一个新节点,但没有&#34;链接&#34;对于使用的现有列表,用于遍历节点的指针已经超过了终点。
在第二种情况下使用条件和代码
t->next = tmp;
意味着新的tmp节点确实与现有列表有连接,它并不像第一个案例的新节点那样悬而未决。
答案 1 :(得分:1)
第二个例子有效,因为while
循环不会一直到最后一个节点。请参阅while
条件。第一个示例失败,因为您转到最后一个节点,并根据Node *tmp
循环条件的定义将新分配的NULL
设置为t(while
)。
以图形方式:
当你的while循环中断时:
NODE 1 - &gt; NODE 2 - &gt; NODE 3 - &gt; NODE 4 - &gt; NODE 5 - &gt; NULL
t points here ^(1st case)
NODE 1 - &gt; NODE 2 - &gt; NODE 3 - &gt; NODE 4 - &gt; NODE 5 - &gt; NULL
t points here ^ (2nd case)
(所以,基本上你要为NULL
分配一些东西。NULL
不是你的最后一个节点)。此外,t是局部变量
这是正确的,因为您没有在最后一个节点的末尾分配新节点。
答案 2 :(得分:0)
第一个代码不会在列表中插入多个元素。它只插入一个,这就是为什么它只打印一个。
在此循环结束时while (t != NULL)
,t为NULL。块的其余部分只是创建一个新节点,并将其分配给t,而不更新列表。
在第二个代码中,t指向列表的最后一个元素。因此,在t->next
添加元素会更新列表。