我得到了以下算法,但我不确定该函数是否删除它是在C中删除整个列表的正确方法,因为我不确定我是否正确地释放了列表中的每个节点。
#include <stdio.h>
#include <stdlib.h>
struct lis
{ int n;
struct lis *next;
};
typedef struct lis *list;
void create (list *l)
{
*l=NULL;
}
int read (void)
{
int num;
puts("ENTER A NUMBER");
scanf ("%d",&num);
return num;
}
void add (int n, list *l)
{
list new,previous,current;
new=malloc (sizeof(list));
(*new).n=n;
(*new).next=NULL;
if (*l==NULL)
{
*l=new;
}
else
{
previous=*l;
current=*l;
while ((current!=NULL) && ((*current).n<(*new).n))
{
previous=current;
current=(*current).next;
}
if (previous==current)
{
(*new).next=*l;
*l=new;
}
else
{
(*previous).next=new;
(*new).next=current;
}
}
}
void insert (list *l)
{
int n;
n=read();
while (n!=0)
{
add(n, &(*l));
n=read();
}
}
void print (list l)
{
if (l!=NULL)
{
while (l!=NULL)
{
printf ("%d\n",(*l).n);
l=(*l).next;
}
}
else
{
puts ("empty list");
}
}
int isempty (list l)
{
return (l==NULL);
}
void erase (list *l)
{
list next;
list current=*l;
while (current!=NULL)
{
next=(*current).next;
free (current);
current=next;
}
*l=NULL;
}
int main ()
{
list l;
create (&l);
insert (&l);
isempty(l)?puts("empty list"):puts("no empty list");
print (l);
erase (&l);
isempty(l)?puts("empty list"):puts("no empty list"); //obviously this return true but just check the header node
return 0;
}
尝试使用gdb,但我甚至不知道如何遵循不是主函数的函数的代码,也不知道如何检查堆中分配的变量是否空闲。 因此,任何答案都指向我使用gdb的正确方向,或告诉我代码是否正常将不胜感激。
答案 0 :(得分:2)
你的erase()
是正确的,虽然你可能会失去其中一个指针而只是这样做:
void erase (list *l)
{
while (*l)
{
list victim = *l;
*l = victim->next;
free (victim);
}
}
假设您已正确插入代码并始终使用NULL终止列表,这就足够了。哦,你的添加功能可以显着减少:
void add (int n, list *l)
{
list p = NULL;
while (*l && (*l)->n < n)
l = &(*l)->next;
p = malloc(sizeof(*p))
p->n = n;
p->next = *l;
*l = p;
}
我保留错误检查以供您实施,但直接回答您的问题是,是的,您的erase
方法会在首先正确构建列表时正确清除列表。
PS:此add(n, &(*l));
add(n, l);
功能只能insert
。