在链接列表中释放节点

时间:2014-02-07 05:17:07

标签: c memory linked-list

假设我在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);

}

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

4 个答案:

答案 0 :(得分:1)

您必须在create_node代码本身中获取Seg Fault作为解除引用的解除分配内存:

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

您已经free d了您创建的所有节点,然后取消引用该位置,您的remove_list甚至都不会被调用。

答案 1 :(得分:0)

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

但是List *的返回表明你可能希望在那里返回(h)。

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

答案 2 :(得分:0)

假设您的linllist就像

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

删除任何节点时,应确保引用了下一个节点。

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

答案 3 :(得分:0)

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);
    }
}