当我销毁我的链表时程序不断崩溃

时间:2015-02-04 01:18:05

标签: c linked-list destroy

出于某种原因,我的代码一直在崩溃。 如果有人能帮我找出原因,我会非常感激。

int destroy(struct node *p)
{
    struct node * temp = p;
    struct node * next;

    while (temp->next != NULL)
    {
        next = temp->next;
        free(temp);
        temp = next;
    }
    p = NULL;

    return 1;
}

1 个答案:

答案 0 :(得分:4)

您需要针对null-ness测试temp,而不是temp->next

void destroy(struct node *p)
{
    struct node *temp = p;

    while (temp != NULL)
    {
        struct node *next = temp->next;
        free(temp);
        temp = next;
    }
}

您也不需要将p设置为null(它没有做任何有用的事情)。返回状态不是一个好主意。你的调用者要么必须测试它(但是永远不会看到除1以外的任何东西,所以测试毫无意义),或者他们必须忽略它(在这种情况下,为什么还要费心去返回呢?)。您也可以不使用变量temp

void destroy(struct node *list)
{
    while (list != NULL)
    {
        struct node *next = list->next;
        free(list);
        list = next;
    }
}

如果您确实想将指针设置为null,则必须更改符号:

void destroy(struct node **list)
{
    struct node *node = *list;
    while (node != NULL)
    {
        struct node *next = node->next;
        free(node);
        node = next;
    }
    *list = NULL;
}

而不是:

struct node *root = ...;
...
destroy(root);

你必须写:

struct node *root = ...;
...
destroy(&root);