定义:用数组描述的链表叫做静态链表(游标实现法)
代码实现:
/*线性表的静态链表存储结构*/
#define MAXSIZE 1000 /*假设链表的最大长度是1000,尽量设大一些,防止溢出*/
typedef struct
{
ElemType data;
int cur; /*游标(cursor),为0时表示无指向*/
} Component, StaticLinkList[MAXSIZE];
PS: 通常,我们将未使用的数组元素称为备用链表。而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组最后一个元素的cur则存放第一个有数值的元素的下标,相当于头结点(有些第二个存)
初始化:
Status InitList(StaticLinkList space)
{
int i;
for(i=0; i<MAXSIZE-1; i++)
space[i].cur = i+1;
space[MAXSIZE-1].cur = 0; /*目前链表为空,所以头结点为NULL*/
return True;
}
静态链表的插入
算法思路:用静态模拟动态链表结构的存储空间的分配,需要时申请,无用时释放
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].cur;
if(space[0].cur)
space[0].cur= space[i].cur; /*修正备用链表所在位置*/
return i;
}
实现插入:
假设在“乙”和“丁”之间插入“丙”
- 找到“乙”,并将乙的cur改为“丙”所在位置
- 找到“丁”,将丙的cur改为“丁”所在位置
成功实现链表中的,脱钩,上钩过程代码实现:
Status ListInsert(StaticLinkList L, int i, ElemType e)
{
int j,k,l;
k = MAXSIZE - 1;
if(i < 1 || i > ListLength(L) + 1) /*插入位置不合法*/
return False;
j = malloc_SLL(L);
if(j)
{
L[j].data = e;
for(l = 1; l <= i - 1; l++) /*找到第i个元素之前的位置*/
k = L[k].cur; /*妙,进行i-1次数,让k=L[i].cur*/
L[j].cur = L[k].cur;
L[k].cur = j;
return Ture;
}
return False;
}
附上删除操作:基本相同,自行发挥
静态链表的优缺点
优点:在插入删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点缺点:
- 没有解决连续存储分配带来的表长难以确定的问题
- 失去了顺序存储结构随机存取的特性