当我们不打算使用某个单链表时,需要把它销毁,也就是在内存中将其释放掉。
算法思路如下:
1. 声明一结点p和q;
2. 将第一个结点赋值给p;
3.循环:
将下一结点值赋值给q;
释放p;
将q值赋值给p
Status ClearList(LinkList *L)
{
LinkList p,q;
p = (*L)->next; //p指向第一个结点
while(p) //没到表尾
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL ; //头结点指针域为空
return OK;
}
这段代码里,常见的错误是有人会觉得q没有必要存在。因此写成 free(p),p=p->next。这样是错误的,为何?
因为p是一个结点,它除了有数据域还有指针域,在删除的时候是对整个结点进行删除和内存释放的工作,如果先free(p)了,删掉了指针域,那么下一个要删除的结点的物理地址是未知的。