0

リンクされたリストの 3 つのノードを作成する C の関数があります。問題は、関数が余分なノードを追加しているように見え、エラーを見つけられないことです。誰かが出力とコードを見て、私のエラーを教えてもらえますか? 問題は仮想マシンのコンパイル環境にあるのでしょうか? BackTrack Linux を実行している仮想マシンで次のコードをコンパイルしています。

gcc link.c -o リンク

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DELIMITER ,

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

struct node* create()
{
    //define head pointers
    struct node *head = NULL;
    struct node *second = NULL;
    struct node *third = NULL;

    //allocate memory
    head = malloc(sizeof(struct node));
    second = malloc(sizeof(struct node));
    third = malloc(sizeof(struct node));

    //setup fields
    //assign links
    head->data = 15;
    head->next = second;

    second->data = 20;
    second->next = third;

    third->data = 25;
    third->next = NULL;

    return head;
}

int main(int argc, const char *argv[])
{
    int size;
    struct node *head;

    head = create();

    struct node *curr = head;

    while(curr->next != NULL)
    {
        printf("%d\n", curr->data);
        curr++;
    }

    return 0;
}

これは出力です:

15 0 20 0

4

2 に答える 2

1

リンクされたリストを使用する場合、curr++ は標準配列のようには機能しません。リンクされたリストの全体的なポイントは、リスト内のデータが連続していないということです。malloc は、順次呼び出しがメモリの順次セルのアドレスを返すことを保証しないため、単純に curr をインクリメントして、それがリスト内の次の要素を指すと期待することはできません。

あなたが探しているのは

curr = curr->next;

ただし、これにはループを変更する必要もあります。curr->next は最後のノードの 1 つ前に NULL になるため、最後の要素はスキップされます。あなたは条件を満たしている間

curr->next != NULL

上記の調整後、

curr != NULL

さらに、malloc は void ポインターを返します。必須ではありませんが、正しいポインター型にキャストする必要があります。

 //allocate memory
head = (struct node*) malloc(sizeof(struct node));
second = (struct node*) malloc(sizeof(struct node));
third = (struct node*) malloc(sizeof(struct node));
于 2013-10-21T00:35:22.190 に答える
0
while(curr)
{
    printf("%d\n", curr->data);
    curr = curr->next;
}

私はすることを好む

for(curr = head; curr ; curr = curr->next)
{
    printf("%d\n", curr->data);
}
于 2013-10-21T00:34:21.850 に答える