静态链表
用数组的方法描述链表叫做静态链表,这种描述方法叫做游标实现法,
我们对数组的第一个和最后一个元素做特殊处理,他们的data不存放数据。我们通常把未使用的数组元素称为备用链表。数组的第一个元素,即下标为0的那个元素的cur就存放备用链表的第一个结点的下标。
数组的最后一个元素,即下标为 MAXSIZE-1的Cur,则存放第一个有数值的元素的下标,相当于单链表
中的头结点作用。有数值的最后一个元素的游标是0;
静态链表如何模拟单链表的插入和删除元素,因为单链表是有数据的时候才有初始化。静态链表要解决的是用静态模拟动态链表的结构。用的时候申请内存不用的时候释放内存。
为了辫明数组中哪些分量未被使用,解决的方法是将所有未被使用过的及已被删除的分量用游标链成一个备用的链表。每当进行插入时,便可以从备用链表上取得第一个结点作为待插入的新结点。
//静态链表的存储结构
#define MAXSIZE 1000
typedef int Status;
typedef struct
{
ElemType data; //数组
int cur; //游标相当于单链表的地址
}component , StaticLinkList[MAXSIZE]; //StaticLinkList结构体数组名
//这个结构体数组有MAXSIZE元素,例如:int a[10]
//a是数组名,这个数组有10个元素
//静态链表的初始化,相当于数组的初始化
Status InitStaticLinkList(StaticLinkList space)//StaticLinkList space这个地方有点疑问
{
int i;
for (i = 0; i < MAXSIZE-1; ++i)
{
space[i].cur=i+1; //初始化静态链表,第一个元素的游标指向下一个元素的下标
}
space[MAXSIZE-1].cur=0;
return ok;
}
//静态链表的插入操作
//第一步首先是获得空闲分量的下标:
int MallocSLL(StaticLinkList space)
{
int i= space[0].cur; //获取第一个没有数据元素的下标
if( space.cur) //判断整个链表是否为空
{
space[0].cur =space[i].cur; //把它的下一个数据元素的游标用来作为第一个游标。
}
return i; //返回第一个没有元素的下标
}
Status InsertStaticLinkList(StaticLinkList l,int i, int e)
{
int i,j,k;
k=MAXSIZE-1; //静态链表的最后一个节点
if (i<1||i>ListLength(l)+1) //判断是否符合链表长度
{
return err;
}
j= MallocSLL(l); //获取备用链表的第一个元素
if (j)
{
l[j].data=e; //节点的数据域为e
for (l = 1; l <= i-1; ++l)
{
k=l[k].cur; //获取第i-1元素的下标
}
l[j].cur=l[k].cur; //获取第i-1元素的游标作为第j元素的游标,这样第i元素就是l[j]
l[k].cur=j; //l[j]的下标j=第i-1元素的游标
return ok;
}
return err;
}