以下は、リンクされたリストの 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)
しますが、別の関数を呼び出してリストを出力すると、代わりにランダムなアドレスが出力されます。
整数値23、24、25、および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 よりも多くのガベージ番号)
私の質問は、最初のノードも削除できるようにコードを変更するにはどうすればよいですか?