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

次のtemp2を頭に設定してから、 に向かいtemp2ます。実際、次のノードはtemp2ですtemp2。そのため、無限ループが発生します。

于 2013-08-22T12:50:37.887 に答える
1

メインには一時へのポインターが1つあり、同じノードを挿入し続けると、最終的にそれ自体を指します。循環リストができたので、無限ループが発生します。

于 2013-08-22T12:52:11.693 に答える
0

ノードが 1 つしかないため、無限ループが発生しています。実行してtemp->data = 5;からtemp->data = 6;新しいノードを作成しません。したがって、同じノードをリストに再度追加すると、ノード内のnextポインターはそれ自体を指します。nextしたがって、ノードは常に現在のノードであるため、表示中の while ループは決して終了しません。

于 2013-08-22T12:50:09.050 に答える