假设我在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);
}
但它不起作用。如何释放链表中的所有节点?
答案 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);
}
}