リンクリスト内のノードの操作を削除する実行している間、私は多くの場合、コードに遭遇した:ノードはリンクリストでどのように削除されますか?
「頭」は、リンクされたリストで、「次へ」のすべてをリンクリンクリストの要素である**head=head->next**
をノード。
このコードは実際にリンクリストのメンバーを変更します(メンバーを削除します)。
リンクリスト内のノードの操作を削除する実行している間、私は多くの場合、コードに遭遇した:ノードはリンクリストでどのように削除されますか?
「頭」は、リンクされたリストで、「次へ」のすべてをリンクリンクリストの要素である**head=head->next**
をノード。
このコードは実際にリンクリストのメンバーを変更します(メンバーを削除します)。
@Remy繊毛は正しいですが、あなたのアスタリスクについての何かは、あなたがCでこのような何かを参照していることを示唆している:
int remove_first(node_t** head)
{
if (head == NULL || *head == NULL) return -1;
node_t* save = *head;
*head = save->next;
free(save);
return 0;
}
我々が理由で機能へのダブルポインタを渡しています。我々は単一のポインタを渡した場合、我々はこれをやっていると思います:
はint remove_first(node_t* head)
{
if (head == NULL) return -1;
node_t* save = head;
head = save->next;
free(save); // bad idea
return 0;
}
// before function call:
head->node->next->NULL
// during function call
head->node->next->NULL
head---^
// before return:
head->NULL next->NULL // (anyone can correct this line, but we can still free that node I believe)
head-------------^
// after return:
head->NULL next->NULL
単一のポインタだけ移動したことのないオリジナルを、修正ヘッドポインタのコピー ではなく を作成します。
// before function call:
head->node->next
// during function call
head->node->next
head--^
// before return:
head->next
head--^
// after return:
head->next
ダブルポインタヘッドは、元のヘッドへのアドレスであるので、我々はオリジナルのヘッドponterではなく、そのコピーにアクセスするための二重のポインタをデリファレンス:ダブルポインタで
。そうすることで、元のポインタを再表示することができます。
delete関数は、必要に応じて更新されたヘッドポインタを返すことができます。この呼び出しは、その値を持つ最初のノードを削除するhead = delete(head、value)か、別の例としてhead = deletefirst(head)となります。内部的にダブルポインタを使用すると、コードは単純化されますが、単一のポインタをパラメータとして渡すことができます。 – rcgldr
@ rcgldr代わりの答えをありがとう。 – synchronizer
このコードは、リンクリストの最初の要素を削除します。
'head'がリストの最初の要素である場合、 'head-> next'が2番目の要素です。 'head = head-> next'を実行すると、2番目の要素が最初の位置に移動します。このようにして、次回に 'head'でリンクリストにアクセスすると、2番目の要素が取得され、古い最初の要素はリストにもうありません。
2つのアスタリスクを使用する言語はわかりません。あなたは* head = * head-> nextを意味しますか? – synchronizer