-1
#include<stdio.h>

typedef struct Node
{
        int data;
        struct Node *next;
        struct Node *prev;
} node;

void insert(node *pointer, int data)
{
        while(pointer->next!=NULL)
        {
                pointer = pointer -> next;
        }
        pointer->next = (node *)malloc(sizeof(node));
        (pointer->next)->prev = pointer;
        pointer = pointer->next;
        pointer->data = data;
        pointer->next = NULL;
}

int main()
{
        node *start;
        start = (node *)malloc(sizeof(node));
        int data;
        scanf("%d",&data);
        insert(start,data);
}

さて、私はCのリストの基本を理解しようとしています。ここで1つの質問があります-insert()の下から3行目-これは何のためですか?最初のリストの要素が空のままで、データが2番目のリストに保存されているようです。しかし、これだけが機能します。

main()には、最初の空の要素が作成されていますよね?

要素がnullであるため、while()は実行されません。

次に、2番目の要素が作成されます。(ポインタ-> null)

最初の要素を指すポインターは、2番目の要素(下から3行目)を指すように設定されます

そして、データはその2番目の要素に保存されています。

どこを間違えますか?

4

2 に答える 2

1
pointer = pointer->next;

この行は、集中している現在のノードを、元のリストの最後のノードから、新しく割り当てられた新しいリストの最後のノード (つまり、元のリストの最後のノードの後のノード) に変更します。次に、次の 2 行でそのノードの値を直接設定します。

この行を削除して、その下の 2 行を次のように変更できます。

pointer->next->data = data;
pointer->next->next = NULL;

同じ結果が得られます。

編集:物事をさらに調べると、さらに多くの問題が見られます:

#include <stdlib.h>1)を使用する必要がありますmalloc()
2)start->next = NULL;を呼び出す前に、明示的に設定する必要がありますinsert()

于 2013-01-19T15:58:15.813 に答える
0

insert関数には、次の割り当てがあります。

pointer = pointer->next;

ポインターpointerは値で渡されるため、これは機能しません。これは、関数が戻るときに、値に対するすべての変更が失われることを意味します。

参照によってポインタを渡すことができます:

void insert(node **pointer, int data)
{
    /* ... */
    *pointer = (*pointer)->next;
    /* ... */
}

または、関数からポインターを返します。

node *insert(node *pointer, int data)
{
    /* ... */
    return pointer;
}


node構造体のポインタを初期化しないという問題もあります。これは、node構造体を割り当てると、その中のフィールドが一見ランダムな場所を指していることを意味します。

これは、割り当ての直後にnextandprevポインターを設定するだけで解決されます。NULL

start = malloc(sizeof(node));
start->next = NULL;
start->prev = NULL;
于 2013-01-19T15:36:35.800 に答える