上一篇文章写到单链表的整表创建,这篇文章接着从单链表的整表删除写起
单链表的整表删除
不打算使用这个单链表时,需要销毁它,在内存中将它释放掉,以便于留出空间给其他程序或软件使用。
单链表整表删除的算法思路:
1.声明一结点p和q;
2.将第一个结点赋值给p;
3.循环
1)将下一结点赋值给q
2)释放p
3)将q赋值给p
实现代码的算法:
/*初始条件:顺序线性表L已存在,操作结果:将L重置为空表*/
Status ClearList (LinkList *L)
{
LinkList p,q;
p=(*L)->next;/*p指向第一个结点*/
while(p)/*没到表尾*/
{
q=p->next;
free(p);
p=q;
/*q存在的意义,使p释放后,知道下一个应该释放哪个,而不会乱*/
}
(*L)->next=NULL;/*头结点指针域为空*/
return OK;
}
静态链表
数组描述的链表:静态链表
算法代码实现:
/*线性表的静态链表存储结构*/
#define MAXSIZE 1000 /*假设链表的最大长度是1000*/
typedef stuct
{
ElemType data;
int cur;/*游标(Cur数据结构:线性表链式存储(3)sor),为0时表示无指向*/
}Component,StaticLinkList[MAXSIZE];
静态链表:数组里既存了数据,又存了指向性量cur(游标)。
静态链表的插入操作
将所有未被使用过的及已被删除的分量用游标链成一个备用的链表,每次插入时,便可以从备用链表上取得第一个结点作为待插入的新结点。
/*若备用空间链表非空,则返回分配的结点下标,否则返回0*/
int Malloc_SLL(StaticLinkList space)
{
int i=space[0].cur;//第一个游标存的值,就是要返回的第一个备用空闲链表的下标
if (space[0].cur)
space[0].cur=space[[i].cur;//由于要拿出一个分量来使用了,所以我们就得把它的下一个分量来拿做备用
return i;
}
如何实现插入:待插入元素先在备用链表中找一个位置,然后改变它插入位置前元素的游标指向,然后待插入元素的游标指向它前一个元素的原游标指向。
循环链表:
单链表终端结点的指针端由空指针改为指向头结点,使整个单链表形成一个环。
链表合成也可以用这招,尾结点指向另一链表头结点。
循环链表:从任意一个位置开始遍历整个链表
双向链表
一个数据域+两个指针域