簡體   English   中英

從C鏈表中刪除(指向指針的指針)

[英]Deleting from a C Linked List (Pointer to pointer)

我發現以下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;
                }
        }
}

我試圖了解它是如何工作的。

這是我的主意。

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     |
|                 |     |                 |
+++++++++++++++++++     +++++++++++++++++++

這是對的?

最好的祝福。

像這樣更精確:

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     |
|                 |                             |                 |
+++++++++++++++++++                             +++++++++++++++++++

從鏈表中刪除任何節點時,實際上是在釋放該節點分配的內存。

因此,為了維護您的鏈表,您需要注意,位於Node2之前(將要刪除)的Node1應該直接指向位於Node2旁邊的Node3。

節點1->節點2->節點3

假設我們要刪除Node2

因此,Node1的下一個指針應指向Node3的地址。 並記住釋放由Node2分配的內存,以避免內存泄漏。

如果是雙向鏈表,則需要注意下一個以及上一個指針。 您可以嘗試實現雙向鏈表。 它一定會幫助您更好地理解。 :)

多留意&next的價值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM