2017-01-03 15 views
0

リンクリスト内のノードの操作を削除する実行している間、私は多くの場合、コードに遭遇した:ノードはリンクリストでどのように削除されますか?

「頭」は、リンクされたリストで、「次へ」のすべてをリンクリンクリストの要素である
**head=head->next** 

をノード。

このコードは実際にリンクリストのメンバーを変更します(メンバーを削除します)。

+0

2つのアスタリスクを使用する言語はわかりません。あなたは* head = * head-> nextを意味しますか? – synchronizer

答えて

2

@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ではなく、そのコピーにアクセスするための二重のポインタをデリファレンス:ダブルポインタで

。そうすることで、元のポインタを再表示することができます。

+1

delete関数は、必要に応じて更新されたヘッドポインタを返すことができます。この呼び出しは、その値を持つ最初のノードを削除するhead = delete(head、value)か、別の例としてhead = deletefirst(head)となります。内部的にダブルポインタを使用すると、コードは単純化されますが、単一のポインタをパラメータとして渡すことができます。 – rcgldr

+0

@ rcgldr代わりの答えをありがとう。 – synchronizer

1

このコードは、リンクリストの最初の要素を削除します。

'head'がリストの最初の要素である場合、 'head-> next'が2番目の要素です。 'head = head-> next'を実行すると、2番目の要素が最初の位置に移動します。このようにして、次回に 'head'でリンクリストにアクセスすると、2番目の要素が取得され、古い最初の要素はリストにもうありません。

関連する問題