单链表销毁与清空

snfeng 2009-12-22 11:14:31
销毁:
Status DestroyList(LinkList *L)
{ /* 初始条件:线性表L已存在。操作结果:销毁线性表L */
LinkList q;
while(*L)
{
q=(*L)->next;
free(*L);
*L=q;
}
return OK;
}
清空:
Status ClearList(LinkList L) /* 不改变L */
{ /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */
LinkList p,q;
p=L->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
L->next=NULL; /* 头结点指针域为空 */
return OK;
}
针对上面两个函数有以下几个问题:
1、销毁函数中头指针的空间怎么释放的?
2、链表的清空和销毁区别是什么?请详细讲一下上面两个函数的原理。
越详细越好 ,谢谢!
...全文
5223 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
biao_happy 2010-11-22
  • 打赏
  • 举报
回复
不错,嘿嘿。。。
fenglingxiaowu 2009-12-23
  • 打赏
  • 举报
回复
顶~~~~
fenglingxiaowu 2009-12-23
  • 打赏
  • 举报
回复
顶~~~~
warsour 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 snfeng 的回复:]
引用 1 楼 warsour 的回复:
你可以仔细看看代码嘛
销毁的时候,是先销毁了链表的头,然后接着一个一个的把后面的销毁了,这样这个链表就不能再使用了
清空的时候,是先保留了链表的头,然后把头后面的所有的都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用

while(*L)  不是把链表的头给保留了吗
{
    }

[/Quote]

while(*L)
{
q=(*L)->next;
free(*L);
*L=q;
}

这里while只是判断这个是否存在,如果存在就运行里面的free(*L)把它释放掉
snfeng 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 warsour 的回复:]
你可以仔细看看代码嘛
销毁的时候,是先销毁了链表的头,然后接着一个一个的把后面的销毁了,这样这个链表就不能再使用了
清空的时候,是先保留了链表的头,然后把头后面的所有的都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用
[/Quote]
while(*L) 不是把链表的头给保留了吗
{
}
WizardOz 2009-12-22
  • 打赏
  • 举报
回复

Status DestroyList(LinkList *L)
{ /* 初始条件:线性表L已存在。操作结果:销毁线性表L */
LinkList* q;
while(L)
{
q=L->next;
free(L);
L=q;
}
return OK;
}
WizardOz 2009-12-22
  • 打赏
  • 举报
回复
1. 这个函数针对的链表没有头指针,一般人们实现链表有两种习惯,一种有头结点,一种没有,你的问题属于后者。
2. 清空指的是释放链表的 node->data 域所指向的空间,销毁是释放链表各个node 的空间。
warsour 2009-12-22
  • 打赏
  • 举报
回复
你可以仔细看看代码嘛
销毁的时候,是先销毁了链表的头,然后接着一个一个的把后面的销毁了,这样这个链表就不能再使用了
清空的时候,是先保留了链表的头,然后把头后面的所有的都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用
dskit 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 snfeng 的回复:]
销毁:
Status DestroyList(LinkList *L)
{ /* 初始条件:线性表L已存在。操作结果:销毁线性表L , 为不带头结点的链表,释放所有空间 */
  LinkList q;
  while(*L)
  {
    q=(*L)->next;
    free(*L);
    *L=q;
  }
  return OK;
}
清空:
Status ClearList(LinkList L) /* 不改变L */
{ /* 初始条件:线性表L已存在。操作结果:将L重置为空表带头结点的链表,释放出头结点外的空间,保留头结点 */
  LinkList p,q;
  p=L->next; /* p指向第一个结点 */
  while(p) /* 没到表尾 */
  {
    q=p->next;
    free(p);
    p=q;
  }
  L->next=NULL; /* 头结点指针域为空 */
  return OK;
}
针对上面两个函数有以下几个问题:
1、销毁函数中头指针的空间怎么释放的?
2、链表的清空和销毁区别是什么?请详细讲一下上面两个函数的原理。
越详细越好 ,谢谢!
[/Quote]

1、销毁函数中头指针的空间怎么释放的?
从前往后依次释放。

2、链表的清空和销毁区别是什么?请详细讲一下上面两个函数的原理。
越详细越好 ,谢谢! 看注释中红色部分

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧