删除链表中的所有节点

时间:2015-04-08 14:37:00

标签: c linked-list

任何人都知道这种重复功能有什么问题吗?它不会删除所有节点

struct contact
{
    char FirstName[41];
    char LastName[41];
    int id;
    struct contact *next;
};

void ClearList (struct contact *person)
{
    struct contact *temp = person;
    if (person == NULL) return;
    else
    {
        person = person->next;
        free(temp);
        ClearList(person);
    }
}

这是我的主要功能

void main()
{
    struct contact *person = malloc(sizeof(struct contact));
    strcpy (person->FirstName, "John");
    strcpy (person->LastName, "Doe");
    person->id = 10;

    person->next = malloc(sizeof(struct contact));
    strcpy (person->next->FirstName, "Will");
    strcpy (person->next->LastName, "Smith");
    person->next->id = 20;
    person->next->next = NULL;

    PrintList(person);
    ClearList(person);
    PrintList(person);
}

当我在调用ClearList后调用PrintList时,它仍会打印出一些杂乱的东西,我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:4)

删除所有节点 ,但您永远不会清除任何指针。所以你正在做的是取消引用导致undefined behavior的无效指针。

free函数不会自动设置指向NULL的指针。

答案 1 :(得分:2)

我真的不喜欢你的链表上的递归删除。如果您的链接列表包含100个元素,那么您将在堆栈中深入了100个函数并且可能会崩溃。

我建议像这样重写:

void ClearList (struct contact *person)
{
   while( person != NULL )
   {
        struct contact * temp = person
        person = person->next;
        free(temp);
   }
}

约阿希姆有正确的答案。虽然我们已经清除了那个人所指向的记忆,但是#34; ClearList"没有权限将原始指针设置为NULL。所以要么你需要使ClearList采用双指针,所以它可以将指针设置为NULL,或者只是设置" person"调用ClearList后为NULL。

双指针示例,使用ClearList(& person)调用;

void ClearList (struct contact ** list)
{
   struct contact *person = *list;
   while( person != NULL )
   {
        struct contact * temp = person
        person = person->next;
        free(temp);
   }
   *list = NULL;
}