[英]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.