Chinaunix

标题: 请教释放链表的函数 [打印本页]

作者: linux_ha    时间: 2007-04-16 14:02
标题: 请教释放链表的函数
请教
int freeLink(NODELINK head)
的实现
作者: zx_wing    时间: 2007-04-16 14:05
原帖由 linux_ha 于 2007-4-16 14:02 发表
请教
int freeLink(NODELINK head)
的实现


我想讲c语言的书和数据结构的书都会讲这些,毕竟链表的操作是基础的。
如果想看看优美的实现,去看看linux里的list_head比较好。你可以在《inux kernel development》(中文译名《linux内核设计与实现》)的附录中看到详细的讲解。
作者: linux_ha    时间: 2007-04-16 14:24
我写的一个例子,我觉得应该可以释放掉链表head,但测试一下发现链表依然存在,高手请指点:
void freeLink(LINKNODE head)
{
        LINKNODE t = head;
        LINKNODE p = head;

        while ((t = p->next) != NULL)
        {
                free(p);
                p = NULL;
                p = t;               
        }
}
作者: linux_ha    时间: 2007-04-16 15:14
急,没人知道吗?
作者: 1jjk    时间: 2007-04-16 15:36
http://lxr.linux.no/source/include/linux/list.h
这里有没有LZ 想要的呢?
作者: deadlylight    时间: 2007-04-16 16:01
原帖由 linux_ha 于 2007-4-16 14:24 发表
我写的一个例子,我觉得应该可以释放掉链表head,但测试一下发现链表依然存在,高手请指点:
void freeLink(LINKNODE head)
{
        LINKNODE t = head;
        LINKNODE p = head;

        while ((t = p->next) != NULL)
         ...


最后一个节点没有释放吧
最后再加一个free(p)

还有啊,你是怎么测试得到链表依然存在呢?

[ 本帖最后由 deadlylight 于 2007-4-16 16:05 编辑 ]
作者: linux_ha    时间: 2007-04-16 16:19
freeLink后遍历一下链表head就可以了,比如打印每个节点的字符串元素
作者: deadlylight    时间: 2007-04-16 16:54
这个好像又涉及比较复杂的问题了
free到底在做什么

free之后的内存有可能仍然是可以访问的,而且值也保留了下来
这是实现的问题,并不代表free失败,也不要再使用free过的那些值

所以你检测到节点的字符串,不代表他没有被free掉
作者: linux_ha    时间: 2007-04-16 17:04
恩,好思路,不过,您的意思是可能,最好还是确切一些,毕竟编程不需要可能的状态,而是需要明确的思路.模糊不清要不得
作者: zx_wing    时间: 2007-04-16 17:18
原帖由 linux_ha 于 2007-4-16 14:24 发表
我写的一个例子,我觉得应该可以释放掉链表head,但测试一下发现链表依然存在,高手请指点:
void freeLink(LINKNODE head)
{
        LINKNODE t = head;
        LINKNODE p = head;

        while ((t = p->next) != NULL)
         ...


如果你执行p=NULL是设置链表中的指针,参数传递应用二级指针。但free函数确实释放调了链表中的内存(最后少一个free(p))。
有一本书,叫什么《程序员面试指南》,上面有很多初级例子,可以参考一下。

[ 本帖最后由 zx_wing 于 2007-4-16 17:23 编辑 ]
作者: 高峰    时间: 2007-04-16 18:02
看看我的博客文章,献丑了,呵呵
http://blog.chinaunix.net/u/12175/showart.php?id=219046
作者: W.Z.T    时间: 2007-04-16 18:08
lz的最后一个节点没有释放掉




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2