【问题标题】:Deleting from a C Linked List (Pointer to pointer)从 C 链表中删除(指向指针的指针)
【发布时间】:2016-11-22 01:04:18
【问题描述】:

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

这是对的吗?

最好的问候。

【问题讨论】:

  • 运行一下看看。
  • 我见过一些可怕的牙套样式,但这个很受欢迎。

标签: c pointers data-structures


【解决方案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     |
|                 |                             |                 |
+++++++++++++++++++                             +++++++++++++++++++

【讨论】:

  • 为什么在示例中删除值 34 后 &next = 0x1f7d078?
  • 要真正删除链表中的一个节点,需要设置前一个节点的next指向下一个节点。然后您可以安全地删除目标节点。使用链表,尤其是自制链表,您总是需要注意内存泄漏。
  • [link]meta.slashdot.org/story/12/10/11/0030249/… 在“最喜欢的黑客”部分中
【解决方案2】:

当您从链表中删除任何节点时,您实际上是在释放该节点分配的内存。

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

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

假设,我们正在删除 Node2

所以Node1的next指针应该指向Node3的地址。并且记得释放 Node2 分配的内存以避免内存泄漏。

在双向链表的情况下,您需要注意 next 和 prev 指针。您可以尝试实现双向链表。它肯定会帮助您更好地理解。 :)

【讨论】:

    【解决方案3】:

    多注意&next的价值

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 2020-06-24
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多