1

以下は、リンクされたリストの n 番目のノードを削除するように設計された関数です。たとえば、これを呼び出すdeleteN(head, 2)と、リストの 2 番目のノードが削除されます。

node *deleteN(node *head, int n)
{

    if (head == NULL)
        return NULL;


    if (n == 1)
    {
        node *temp = head;
        //printf("the element is %d\n", temp->data);
        head = temp->next;
        free(temp);
        return head;
    }

    head->next = deleteN(head->next, n-1);

    return head;

}

たとえば、リストの最初のノードを削除するはずの を呼び出さない限り、正常に動作deleteN(head, 1)しますが、別の関数を呼び出してリストを出力すると、代わりにランダムなアドレスが出力されます。

整数値232425、および26を順番に含む4 つのノードのリストで何が起こっているかの例(メインで呼び出されてから出力されるもの):

テスト ケース 1 (合格):

deleteN(head, 2);

printList(head);

出力:

23

25

26

テスト ケース 2 (合格):

deleteN(head, 3);

printList(head);

出力:

23

24

26

テスト ケース 3 (合格):

deleteN(head, 4);

printList(head);

出力:

23

24

25

テスト ケース 4 (不合格):

deleteN(head, 1);

printList(head);

出力:

34223223

34234242

34342343

34343434

34234434

(segfault よりも多くのガベージ番号)

私の質問は、最初のノードも削除できるようにコードを変更するにはどうすればよいですか?

4

2 に答える 2

2

あなたの質問からは明らかではありませんが、deleteN() を呼び出すときに、頭を更新していないと思われます。

これはうまくいくはずです:

head=deleteN(head,1);
printList(head);

これがあなたがしていることだと思います:

deleteN(head,1);
printList(head);
于 2013-06-27T23:02:22.890 に答える