静态链表相当于是用一个数组来实现线性表的链式存储结构,在静态链表中操作的是数组。
结构体数组
一、静态链表的插入操作
静态链表的插入操作包含两部分,首先是获得空闲量的下标,程序代码如下;
int getCur(StaticLinkList tan)
{
int i = tan[0].cur;
if(tan[0].cur)tan[0].cur = tan[i].cur;
return i;
}
要想更好的理解,最好结合一个静态列表的实例来掌握,下面给出一静态列表
每当进行插入时,便可以从备用链表上取得第一结点下作为待插入的新结点,下面给出在静态链表中第i个元素之前插入新的数据e的代码。
int ListInsert(StaticLinkList tan,int i,ElemType e)//静态链表中第i个元素之前插入新的数据e
{
int l,j,k;
k = MAXSIZE -1;//数组最后一个元素的下标
if(i < 1|| i > ListLength(L)+ 1)//ListLength为计算链表长度的函数
return error;
j = getCur(tan);
if(j)
{
tan[j].data = e;
for(l = 1;l <= i - 1;l++)
{
k = tan[k].cur;
}
tan[j].cur = tan[k].cur;
tan[k].cur = j;
return bingo;
}
return error;
}
二、静态链表的删除操作
为了很好的表示静态链表的删除操作,下面给出一静态链表的实例。
假设删除静态链表中下标为2的元素,即为链表中第3个元素
void recycleNode(StaticLinkList tan,int i)//将下标为k的空闲结点回收到备用链表
{
tan[i].cur = tan[0].cur ;
tan[0].cur = i;
}
int ListDelete(StaticLinkList tan,int i)//删除链表中第i个数据元素
{
int j,k;
if(i < 1 || i > ListLength(L))return error;
k = MAXSIZE - 1;
for(j = 1;j <= i -1;j++)
{
k = tan[k].cur;//得到删除元素前一个元素的下标
}
j = tan[k].cur;//将要删除元素的下标
tan[k].cur = tan[j].cur;
recycleNode(tan,j);
return bingo;
}
总结下静态链表的优缺点:
优点:在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要大量移动元素的缺点。
缺点:1)失去了顺序存储结构随机存取的特性。2)没有解决连续存储分配(数组)带来的表长难以确定的问题。