c - 在 C 中释放链表

标签 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 应该使指针指向一些我无法访问的内存地址,对吗?我在本地或全局范围内进行操作有何重要意义。

提前谢谢你们。

最佳答案

我可能会非递归地这样做

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

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

递归通常比循环慢。如果您可以尝试在没有递归例程的情况下进行设计。

关于c - 在 C 中释放链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637430/

相关文章:

C 尝试添加撇号

c - busybox 中的 TCP/IP 堆栈

c# - 获取 LinkedList<T> 的第一个元素

c - C中的插入排序链表

c - 在C中删除链表中的重复项不起作用

c - 我如何从c文件中读取一行?

c - inotify_rm_watch 总是返回 EINVAL

C:就缓冲而言,输出例程的效率如何?

c++ - 初学者 C++ 程序上的 APPCRASH,调用函数上的公共(public)方法

c - 打印链表的float元素显示不正确?