C 取消分配链表中的节点

C 取消分配链表中的节点,c,memory,linked-list,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

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


但它不起作用。如何取消分配链表中的所有节点?

您的
create\u节点中必须存在Seg错误,将其自身编码为解除引用取消分配内存:

...
List *node = malloc(sizeof(List));
free(node);
node->value = v;
...
您已经释放了所有创建的节点,然后取消了对该位置的引用,您的
remove\u列表将不会被调用。

我认为remove\u列表中的最后一个空闲(x)应该是空闲(h),假设您想删除列表头本身

但是列表*的返回意味着你可能想在那里做返回(h)


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

假设你的linllist是这样的

1 -> 2 -> 3 -> 4 -> NULL
删除任何节点时,应确保您具有下一个节点的引用


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

OMG!!这是什么:
List*node=malloc(sizeof(List));自由(节点);节点->值=v
免费
当你不再需要它时,而不是当你需要它时。不知道那无关的
free()
从何而来,但可能只是一个错误或复制粘贴问题。在
create\u节点中丢失
free()
。剩下的看起来不错,除了你的删除列表中的外部
free(x)
,它甚至没有编译的机会,更不用说导致任何好的结果了。我在编译:/usr/lib/gcc/i686 pc cygwin/4.3.4/../../../../libcygwin.a(libcmain.o):(.text+0xa9):未定义对的引用`_WinMain@16'collect2:ld返回了1个出口status@Mat.S与您发布的问题完全不同。@Mat.S不知道您的代码是否正确。如果您解决了前面描述的问题,可能会更接近。您刚才发布的内容不是编译问题,而是链接问题,很可能是因为子系统类型未设置为控制台应用程序(至少MS'cl是这样工作的,不知道mingw上的gcc,但我想他们也有类似的功能)。@MatS:嗯,您的
删除列表
似乎是正确的,只需删除循环后多余的
free
。因此,由于循环条件,您试图在循环后说
free(h)
,这意味着
free(NULL)
。@MadHatter除了有点无意义之外,
free(NULL)
是可以的,并且是这样记录的。它没有任何危害,但是在这种情况下也没有任何意义。@ WooCurig:但是不会<代码> FALL(NULL)< /COD>导致Seg Fault。@ MADHATTER NO.它是NO-OP。就像C++中的NulLPTR中的代码>删除P< /代码>一样。
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);
    }
}