1

リンクされたリストに関する次のコードについて助けが必要です。

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

struct nodo {
    int d;
    struct nodo *next;
};

struct nodo *full();

int main()
{
    struct nodo *l;
    /* l=(struct nodo *)malloc(sizeof(struct nodo)); */
    l = full();
    while(l!=NULL) {
        printf("-->%d\n", l->d);
        l  =l->next;
    }
    system("PAUSE");
}
struct nodo *full()
{
    int i;
    struct nodo *head, *nes;
    head = (struct nodo *)malloc(sizeof(struct nodo));
    head->next = NULL;
    for(i = 1; i < 5; i++) {
        nes = (struct nodo *)malloc(sizeof(struct nodo));
        printf("Insert the %d element:\n", i);
        scanf("%d", &nes->d);
        nes->next = head;
        head = nes;
    }
    return head;
}

たとえば、入力しようとすると1, 2, 3, 4、次の出力が得られます。

 -->4
 -->3
 -->2
 -->1
 -->9708864

最後の番号を取得するのはなぜですか? コードの何が問題になっていますか?

4

2 に答える 2

3

@Vinska がコメントで指摘したように、3 行目full()は必要ありません。余分なノードを作成しています。

問題の行は

head = (struct nodo *)malloc(sizeof(struct nodo));

代わりに言う

head = NULL

既存のコードでは、リンク リストには 5 つの要素があります。最初のものは、前述の行で作成されます。残りの 4 つの項目は、予想どおりループ内に作成され、合計 5 つの要素になります。

9708864数値はガベージ値です。を呼び出したときにたまたまメモリにあったものですmalloc()。これが、すべての変数を初期化する必要がある理由です! または、この場合、memset()またはcalloc()を使用して、これらのブロックを適切な値に設定します。(ただし、とにかく、その行はここでは完全に不必要です。)

幸運を!

于 2012-07-13T12:27:06.423 に答える
0

あなたのコードでは、リンクされたリストの開始を保持しているとは思いません。私はこれをします:

struct nodo *full()
{
    int i;
    struct nodo *head, *nes;
    head = (struct nodo *)malloc(sizeof(struct nodo));
    nes = head;

    for(i = 1; i < 5; i++) {
        nes->next = (struct nodo *)malloc(sizeof(struct nodo));
        printf("Insert the %d element:", i);
        scanf("%d", &nes->d);
        printf("%s","\n");
        nes = nes->next;
    }
    return head;
}

これにより、リストの先頭が作成されますが、「実行中」または「現在の」リスト ポインター (nes) がリスト クリエーターとして使用されます。

リストを作成している間、head はリストの先頭を指したままです。

番号を入力した後に行末記号が表示されるように、別の変更を加えました。

于 2012-07-13T12:31:20.617 に答える