2016-11-22 10 views
0

は、私はそれがどのように動作するかを理解しようとしていますCリンクリストから削除する(ポインタはポインタに)

void 
remove_ll(struct link_list **head, int key) 
{ 
     struct link_list **cur; 
     for(cur = head; *cur;) { 
       struct link_list *entry = *cur; 
       if (entry->key == key) { 
         *cur = entry->next; 
         free(entry); 
       } else { 
         cur = &entry->next; 
       } 
     } 
} 

リストから要素を削除し、C言語で以下のコードを発見しました。

これは私の考えです。

List example: 

    0x1f7d018    0x1f7d038    0x1f7d078 
+++++++++++++++++++  +++++++++++++++++++  +++++++++++++++++++ 
|0x2174010:  |  |0x1f7d070:  |  |0x1f7d090:  | 
|key = 10   |  |key = 34   |  |key = 90   | 
|&next = 0x1f7d038|++++>|&next = 0x1f7d078|++++>|&next = NULL  | 
|     |  |     |  |     | 
+++++++++++++++++++  +++++++++++++++++++  +++++++++++++++++++ 

After deleting the value 34 

    0x1f7d018    0x1f7d038 
+++++++++++++++++++  +++++++++++++++++++ 
|0x2174010:  |  |0x1f7d090:  | 
|key = 10   |  |key = 90   | 
|&next = 0x1f7d038|++++>|&next = NULL  | 
|     |  |     | 
+++++++++++++++++++  +++++++++++++++++++ 

これは間違いありませんか?

+0

実行して参照してください。 – kaylum

+2

私はいくつかのひどいブレーススタイルを見ましたが、これはケーキを取ります。 – EOF

答えて

1

そうみたいで、より正確である:

List example: 

    0x1f7d018    0x1f7d038    0x1f7d078 
+++++++++++++++++++  +++++++++++++++++++  +++++++++++++++++++ 
|0x2174010:  |  |0x1f7d070:  |  |0x1f7d090:  | 
|key = 10   |  |key = 34   |  |key = 90   | 
|&next = 0x1f7d038|++++>|&next = 0x1f7d078|++++>|&next = NULL  | 
|     |  |     |  |     | 
+++++++++++++++++++  +++++++++++++++++++  +++++++++++++++++++ 

After deleting the value 34 

    0x1f7d018          0x1f7d078 
+++++++++++++++++++        +++++++++++++++++++ 
|0x2174010:  |        |0x1f7d090:  | 
|key = 10   |        |key = 90   | 
|&next = 0x1f7d078|++++++++++++++++++++++++++++>|&next = NULL  | 
|     |        |     | 
+++++++++++++++++++        +++++++++++++++++++ 
+0

値34を削除した後に、 &0x1f7d078というのはなぜですか? – Victor

+0

リンクされたリスト内のノードを本当に削除するには、前のノードの次のノードが次のノードを指すように設定する必要があります。次に、ターゲットノードを安全に削除できます。リンクリスト、特に自家製のリンクリストでは、常にメモリリークを調べなければなりません。 – MiltoxBeyond

+0

[link] https://meta.slashdot.org/story/12/10/11/0030249/linus-torvalds-answers-your-questions 「お気に入りのハック」のセクションで、 – Victor

0

は、あなたがリンクされたリストから任意のノードを削除する場合は、あなたが実際にメモリを解放している&次

1

の値にもっと注意を払いますそのノードによって割り当てられる。

リンクされたリストを維持するには、Node2の直前のNode1(削除される予定)がNode2の隣にあるNode3を直接指しているように注意する必要があります。

ノード1 - >ノード2 - >ノード3

と仮定、我々はそうノード1の次のポインタは、ノード3のアドレスを指している必要がありますノード2

を削除しています。また、メモリリークを回避するためにNode2によって割り当てられたメモリを解放することを忘れないでください。

二重リンクされたリストの場合は、次のポインタとprevポインタを注意する必要があります。二重リンクされたリストを実装することができます。それはあなたがよりよく理解するのに役立つでしょう。 :)

関連する問題