1、静态链表
用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法。
静态链表需要对数组的第一个和最后一个元素作为特殊元素处理,不存数据。
最后一个指向第一个有数据的下标地址,第一个游标指向第一个没有数据的下标地址。
我们对数组的第一个和最后一个元素做特殊处理,他们的data不存放数据;
-我们通常把未使用的数组元素称为备用链表;
-数组的第一个元素,即下标为0的那个元素的cur就存放备用链表的第一个结点的下标;
-数组的最后一个元素,即下标为MAXSIZE-1的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点作用。
1.1静态链表的初始化
bool InitList(StaticLinkList list)
{
int i;
for(i=0;i<MAXSIZE;i++)
list[i].cur = i+1;
list[MAXSIZE-1].cur = 0; //当前链表为空,所以最后一个元素的cur为0
return true;
}
1.2静态链表的插入操作
首先是获得空闲分量的下标:
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].cur; //将第一个游标赋值给i,也就是第一个空闲的结点的下标赋值i。
if(space[0].cur)
space[0].cur = space[i].cur;
return i;
}
// 这段代码是给静态链表的第i-1个元素后添加新元素
bool ListInsert(StaticLinkList list,int i,ElemType e)
{
int i,j,l;
k = MAXSIZE-1;
if(i < 1 || i > ListLength() + 1)
return false;
j = Malloc_SSL(L); //获取空闲下标
if(j)
{
list[i].data = e; //将数据值赋值给要空闲位置
for(l = 1;l<=i-1;l++)
k = list[k].cur; //找到第i-1个元素
list[i].cur = list[k].cur; //把第i-1个元素的cur赋值给新元素的cur
list[i].cur = j; //把新元素的下标赋值给第i-1个元素的cur;
return true;
}
return false;
}
1.3静态链表的删除操作
Status ListDelete(StaticLinkList L,int i)
{
int j,k;
if(i<1||i>ListLength(L))
{
return ERROR;
}
k = Max_SIZE-1;
for(j=0;j<=i-1;j++)
{
k = L[k].cur; //找出要删除元素的前一个元素的下标
}
j = L[k].cur; //找到要删除元素的下标
L[k].cur = L[j].cur; //把要删除元素的游标赋值给其前一个元素的游标
Free_SLL(L,j); //释放删除元素的内存
return OK;
}
void Free_SLL(StaticLinkList space,int j)
{
space[j].cur = space[0].cur;
space[0] = j; //删除元素后,该位置变为备用链表表头,数组第一个元素的游标存储第一个空闲结点的下表
}
int ListLength(StaticLinkList L)
{
int j = 0;
int i = L[MaxSIZE-1].cur; //取出有数据的第一个元素的下标
while(i)
{
i = L[i].cur; //有数据的最后一个元素的游标为0,即为数组第一个元素的下标
j++;
}
return j;
}