此代码删除除最后一个节点之外的所有节点。但我希望它删除所有节点。谁能告诉我我做错了什么?
deleteall(struct node **start)
{
struct node*temp,*curr;
while ((*start)->next!=NULL)
{
temp=*start;
*start=(*start)->next;
free(temp);
curr=(*start);
}
if ((*start)->next==NULL)
{
free(curr);
}
}
答案 0 :(得分:2)
我创建了链表的基本实现并测试了您的代码。它不是特别漂亮,但它有效:
#include <stdlib.h>
#include <stdio.h>
struct node { struct node *next; };
struct node* create_node(struct node *next) {
struct node* node = malloc(sizeof(struct node));
node->next = next;
printf("created %p\n", node);
return node;
}
void deleteall(struct node **start)
{
struct node*temp,*curr;
while ((*start)->next!=NULL)
{
temp=*start;
*start=(*start)->next;
free(temp);
printf("free'd %p\n", temp);
curr=(*start);
}
if ((*start)->next==NULL)
{
free(curr);
printf("free'd %p\n", curr);
}
}
int main(int argc, char** argv) {
// create root node
struct node * ll = create_node(0);
// insert three nodes
ll->next = create_node(ll->next);
ll->next = create_node(ll->next);
ll->next = create_node(ll->next);
// delete all nodes (including root)
deleteall(&ll);
return 0;
}
输出结果为:
$ gcc test.c && ./a.out
created 0xc3c010
created 0xc3c030
created 0xc3c050
created 0xc3c070
free'd 0xc3c010
free'd 0xc3c070
free'd 0xc3c050
free'd 0xc3c030
如您所见,所有分配的节点实际上都是免费的。
也许您对以下事实感到困惑:根节点未设置为0,而是apparantly still contains the remains of the object previously located at that place。如果在释放节点后将0分配给起始指针,则可以解决此问题:*start = 0;
(或通过消除the other answer}中建议的其他curr
指针。
考虑您可以选择性地删除列表中的节点:
void delete_node_recursively(struct node *node) {
if (node) {
delete_node_recursively(node->next);
free(node)
}
}
如果您希望最后将根节点设置为0,则可以添加包装器:
void delete_list(struct node **root) {
delete_node_recursively(*root);
*root = 0;
}
答案 1 :(得分:0)
试试这个:
这是为了简化您的代码
最后*start
成为NULL
。 (您的代码不会成为NULL
)
deleteall(struct node **start){
struct node *temp;
while(*start){
temp = *start;
*start=(*start)->next;
free(temp);
}
}