C中的链接列表有两种不同的情况

时间:2015-12-11 16:54:10

标签: c

我很困惑,为什么我的代码在尝试在链表末尾添加节点时不会打印好结果。我想了解它背后的逻辑,我将向您展示两个不同的代码第一个只会打印第一个节点,即使列表包含'不止一个节点,第二个节点完全符合预期,但我不明白为什么或如何工作。

第一个代码 :(令人困惑的一个)

#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;
    }
}

所以,我的问题是两个代码是如何工作的以及第一个代码有什么问题?

谢谢你,:)

3 个答案:

答案 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添加元素会更新列表。