0

所以这是一个非常简单的程序来创建和显示一个链表。在这里,我陷入了显示循环,我在屏幕上看到了无限的“2->2->2->...”。

调试后,我可以看到我的程序总是进入if语句,insertNode()而它应该只去那里一次,即当链表被初始化时。

    #include <stdio.h>
#include <stdlib.h>

struct node {
    int data;
    struct node * next;
};

struct node * head = NULL;
struct node * curr = NULL;

void insertNode(struct node * temp2) {
    if (head == NULL) {
        head = temp2;
        head->next = NULL;
    }
    else {
        temp2->next = head;
        head = temp2;
    }
}

void display() {
    curr = head;
    while (curr->next != NULL)
    {   
        printf("%d->",curr->data);
        curr = curr->next;
    }
}

void main() {
    struct node * temp = (struct node *) malloc (sizeof(struct node));
    temp->data = 5;
    insertNode(temp);
    temp->data = 6;
    insertNode(temp);
    temp->data = 1;
    insertNode(temp);
    temp->data = 2;
    insertNode(temp);
    display();

}
4

4 回答 4

2

在将数据插入链表时,您应该为每个数据分配和创建新节点。

void main() {
    struct node * temp = (struct node *) malloc (sizeof(struct node));
    temp->data = 5;
    insertNode(temp);

    temp = malloc (sizeof(struct node));
    temp->data = 6;
    insertNode(temp);

    temp = malloc (sizeof(struct node));
    temp->data = 1;
    insertNode(temp);

    temp = malloc (sizeof(struct node));
    temp->data = 2;
    insertNode(temp);
    display();

}

当您使用相同的节点添加为多个节点时,它会生成循环列表。

insertNode()看起来不错。

于 2013-08-22T12:48:13.910 回答
1

您正在设置 next of temp2to head,然后 head to temp2。所以实际上下一个节点temp2is temp2,这就是你有无限循环的原因。

于 2013-08-22T12:50:37.887 回答
1

在您的 main 中,您有一个指向 temp 的指针,您继续插入同一个节点,它最终指向自身。你现在有一个循环列表,这就是你有一个无限循环的原因。

于 2013-08-22T12:52:11.693 回答
0

你得到一个无限循环,因为你只有一个节点。执行temp->data = 5;然后temp->data = 6;不会创建新节点。所以当你再次将同一个节点添加到列表中时,next节点中的指针指向它自己。因此,您的 while 循环显示永远不会终止,因为该next节点始终是当前节点。

于 2013-08-22T12:50:09.050 回答