0
void del (node* list) {
    int a;

    printf("Enter no. to be deleted");
    scanf("%d", &a);

    node* p;
    node* prev;

    p = list;

    while (p != NULL) {
        if (p -> n == a) {
            if (p == list) {
                list = p -> next;
                free (p);
                return;
            }
            else {
                prev -> next = p -> next;
                free (p);
                return;
            }
        }
        else {
            prev = p;
            p = p -> next;
        }
    }
}

このコードは、最初のノードを除くすべてのノードを削除します。最初のノードを削除しようとすると、乱数が出力されます。理由は何ですか?

4

4 に答える 4

1

その理由は、開始ノードが失われ、リンクされたリストを見失うためです。新しい開始ノードを返す必要があります。void del (node* list)する必要がありますnode* del (node* list)

削除するノードが最初のノードの場合は 2 番目のノードのアドレスを返し、それ以外の場合は最初のノードのアドレスを返します。

これがあなたのリストの様子です(仮定)

 +----+-----+   +-----+-----+   +-----+------+
 |  A |     +-->|     |     +-->|     |      |
 +----+-----+   +-----+-----+   +-----+------+
 /
Head is pointing to location A.

2番目Headにポイントします。

 +----+-----+    +-----+-----+   +-----+------+
 |  A |     +-X->|   B |     +-->|     |      |
 +----+-----+    +-----+-----+   +-----+------+
                 /
               Head is now pointing to location B.

次に Free A( で表されるX) を返し、 new を返しHeadます。

于 2013-11-11T10:08:55.510 に答える
0

void del (node* list);

listローカル変数です。それに加えた変更は、関数の外部には入力されません。へのポインターへのポインターを渡す必要がありますnode

void del (node** list);

または、新しいリストの開始を返します。

node *del (node* list);

于 2013-11-11T10:11:05.923 に答える
0

ヘッドが削除されたときにリストの新しい先頭void del (node* list)を返す必要があるため、署名を変更する必要があります。

node * del (node* list)コードの最後に追加することをお勧めしreturn listます。

于 2013-11-11T10:09:19.297 に答える