如何知道链接列表是否被正确删除?

时间:2014-06-24 03:13:16

标签: c linked-list free

我得到了以下算法,但我不确定该函数是否删除它是在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的正确方向,或告诉我代码是否正常将不胜感激。

1 个答案:

答案 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