销毁线性表的函数我这样写对么

来源:百度知道 编辑:UC知道 时间:2024/06/07 11:00:53
void DestroyList(struct student *head)/*函数部分*/
{
struct student *p1,*p2;
p2=p1=head;
while(p1->num!=NULL)
{
p1=p2;
free(p1);
p2=p2->next;
p1=p2;
}
free(p1);
}
匿名回答的高手 有3个地方不明白啊 LNode Head, P; 难道不应该是LinkList *Head,*p么?
其2while(!P) 为什么这么写?? 难道不是(*p)么 其3
while(!P)
{
free(Head);
这样不是上来就将头结点释放了么?

销毁线性表要注意一点:
不可以直接释放头结点,必须所有的结点全部释放掉,最后释放头结点。
如果直接将头结点置空,会导致其它结点元素所占空间不被有效释放,产生内存泄露

一个比较正统的清空线性表的代码如下:
void DestroyList(LinkList *L)//初始条件:线性表L已存在。 操作结果:销毁线性表L。
{
LNode Head, P;
if(*L)//若线性表L已存在
{
Head = *L;
P = Head->next;
while(!P) //把链表中除头结点外的所有结点释放
{
free(Head);
Head = P;
P = Head->next;
}
free(Head); //释放头结点
}
}

这个函数有点问题,我给你改了一下,判断结束不能用p->num,而应该用p
void DestroyList(struct student *head)/*函数部分*/
{
struct student *p1,*p2;
p1=head; //p1指向头结点
while(p1) //当p1不为空
{
p2=p1; //用p2记住p1
p1=p1->next; //p1指针下移
free(p2); //销毁p2
}