C 取消分配链表中的节点
假设我在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
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);
}
}