释放C中的链表

时间:2014-02-07 20:46:50

标签: c linked-list

您好我正在尝试编写一个函数,该函数接收链表的头部并释放它分配的所有内存。这是我写的原始代码。

void clear_nodes(List *h) {
    if (!h->next) {
        free(h);
        ***h = NULL;***
    }
    else {
        clear_nodes(h->next);
        clear_nodes(h);
    }
}

然而它不起作用。所以我把它改成了

void clear_nodes(List *h) {
    if (!h->next) {
        free(h);
    }
    else {
        clear_nodes(h->next);
        ***h->next = NULL;***
        clear_nodes(h);
    }
}

现在它奏效了。 注意两者之间的区别,我只是想知道为什么我不能直接指向null。是因为它是一个局部变量还是什么?但是将指针标记为null会使指针指向某些我无法访问的内存地址吗?如果我在本地或全球范围内进行,为什么会这么重要。

提前谢谢你们。

2 个答案:

答案 0 :(得分:2)

我可能不会这么做了

void clear_nodes(List **h) {
    List * copy = *h;        

    while( (copy = (*h)->next) != NULL){
        free(*h);
        *h = NULL;
        *h = copy;
    }
}

递归通常比循环慢。如果你可以尝试设计没有递归例程。

答案 1 :(得分:1)

由于传递了value h而不是location,因此您没有更改指针 - 您正在更改指针的副本。

如果您将功能更改为

void clear_nodes(List **h) {
    if ((*h)->next == NULL) {
        free(*h);
        *h = NULL;
    }
    else {
        clear_nodes(&((*h)->next));
        clear_nodes(h);
    }
}

你可以“在本地”改变它。我认为我得到了第二部分正确...没有尝试编译/运行它。我对第一部分持肯定态度。