2016-11-22 84 views
0

我发现在C语言下面的代码片段,从列表中从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  | 
|     |  |     | 
+++++++++++++++++++  +++++++++++++++++++ 

这是正确的?

此致敬礼。

+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后的示例&next = 0x1f7d078? – Victor

+0

要真正删除链接列表中的节点,应该将前一个节点的下一个指向下一个节点。然后你可以安全地删除目标节点。使用链接列表,特别是自制链接列表,您总是必须注意内存泄漏。 – MiltoxBeyond

+0

[link] https://meta.slashdot.org/story/12/10/11/0030249/linus-torvalds-answers-your-questions 在“最受欢迎的黑客” – Victor

1

当你从一个链接列表中删除任何一个节点,那么你实际上是释放内存由该节点分配。

所以为了维护链表,你需要注意Node2之前的Node1(它将被删除)应该直接指向Node2旁边的Node3。

节点1 - >节点2 - >节点3

假设,我们正在删除节点2

所以节点1的下一指针应指向节点3的地址。请记住释放由Node2分配的内存以避免内存泄漏。

如果是双向链表,则需要注意next和prev指针。你可以尝试实施双向链表。它一定会帮助你更好地理解。 :)