【问题标题】:Deallocate Nodes in Linked List取消分配链表中的节点
【发布时间】:2014-02-07 05:17:07
【问题描述】:

假设我在 C 中有以下链表的实现:

List *create_node(int v) {
    List *node = malloc(sizeof(List));
    free(node);
    node->value = v;
    node->next = NULL;
    return node;
}

List *add_node(List *h, int v) {
    List *node = create_node(v);
    node->next = h;
    return node;
}

我想释放列表中的所有节点;我尝试编写函数

List *remove_list(List *h) {
    while(h != NULL) {
            List *x;
            x = h;
            h =  h->next;
            free(x);
    }
    free(x);

}

但它不起作用。如何释放链表中的所有节点?

【问题讨论】:

  • 天啊!!这是什么:List *node = malloc(sizeof(List)); free(node); node->value = v;
  • free 在你不再需要它的时候,而不是在你需要的时候。不知道那个无关的free() 来自哪里,但可能只是一个错误或复制粘贴问题。在create_node 中丢失free()。除了你的 remove_list 中的外部 free(x) 之外,其余的看起来都不错,它甚至没有机会编译,更不用说导致任何好的结果了。
  • 编译时出现此错误:/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../libcygwin.a(libcmain.o): (.text+0xa9): undefined reference to `_WinMain@16' collect2: ld returned 1 exit status
  • @Mat.S 与您发布的问题完全不同。
  • @Mat.S 不知道你的代码是否正确。如果您解决了前面描述的问题,它可能更接近。而且您刚刚发布的不是编译问题,而是 link 问题,很可能是因为子系统类型未设置为控制台应用程序(至少 MS 的 cl 是这样工作的,不知道mingw 上的 gcc,但我想他们有类似的东西)。

标签: c memory linked-list


【解决方案1】:

您必须在 create_node 代码本身中遇到 Seg Fault 作为您取消引用的已分配内存:

...
List *node = malloc(sizeof(List));
free(node);
node->value = v;
...

你已经freed 你创建的所有节点,然后取消引用该位置,你的remove_list 甚至不会被调用。

【讨论】:

  • @MatS:好吧,您的remove_list 似乎是正确的,只需在循环后删除多余的free
【解决方案2】:

我相信 remove_list 中的最后一个 free(x) 应该是 free(h),假设您想删除列表标题本身。

但 List* 的返回表明您可能想在此处执行 return(h)。

不清楚你想在这里做什么......

【讨论】:

  • 所以你想在循环之后说free(h),这意味着free(NULL),因为循环终止条件。
  • @MadHatter 除了有点毫无意义之外,free(NULL) 还可以,并且记录在案。它没有害处,但在这种情况下也没有任何意义。
  • @WhozCraig :但free(NULL) 不会导致 Seg-Fault。
  • @MadHatt 没有。它是无操作的。就像 C++ 中 nullptr 上的 delete p 一样。
【解决方案3】:

假设你的 linlllist 是这样的

1 -> 2 -> 3 -> 4 -> NULL

删除任何节点时,您应该确保您有下一个节点的引用。

删除节点 1 时存储节点 2 的引用,以便在下次删除时,一旦遇到 NULL,您可以使用它在列表停止中进一步移动。

【讨论】:

    【解决方案4】:
    List *create_node(int v) {
        List *node = malloc(sizeof(List));
        if(node){
            node->value = v;
            node->next = NULL;
        }
        return node;
    }
    
    void remove_list(List *h) {
        while(h != NULL) {
            List *x;
            x = h;
            h =  h->next;
            free(x);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2012-06-20
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 2019-06-09
      • 2017-07-14
      • 2021-03-30
      • 2016-03-07
      相关资源
      最近更新 更多