0x01.理解静态链表
静态链表其实就是用数组的方式实现一个链表,静态链表有以下约定。
- 每一个元素的游标域存储着下一个元素的下标
- 最后一个元素的游标为0
- 0号元素存储着备用链表的第一个元素的下标
- 备用链表就是静态链表中没被使用过的元素
- 每次增加结点,使用模仿的malloc函数,找到备用链表的一个结点
- 每次删除结点,使用模仿的free函数,将这个结点放入备用链表
优点:
- 插入删除元素不需要移动大量下标
- 使得没有指针的语言能够实现链表
缺点:
- 没有解决表长难以确定的问题
- 失去了顺序存储结构随机存储的特性
0x02.结构
#define MAXSIZE 50
typedef struct
{
int data;
int cur;//游标
}StList,List[MAXSIZE];
0x03.初始化
//初始化静态链表
void IniList(List list)
{
int i;
for (i = 0; i < MAXSIZE - 1; i++)//每一个元素的游标存储着下一个元素的下标
{
list[i].cur = i + 1;
}
list[MAXSIZE - 1].cur = 0;
}
0x04.malloc函数
//返回分配结点的下标
int Malloc_SList(List list)
{
int i = list[0].cur;//第一个结点存放着备用链表的第一个结点
if (list[0].cur)
{
list[0].cur = list[i].cur;//更新备用链表的第一个结点
}
return i;
}
0x05.free函数
void Free_SSL(List L, int k)
{
L[k].cur = L[0].cur;
L[0].cur = k;//更新备用链表第一个元素
}
0x06.求静态链表长度
//返回L中的数据元素个数
int ListLength(List L)
{
int j = 0;
int i = L[MAXSIZE - 1].cur;
while (i)
{
i = L[i].cur;
j++;
}
return j;
}
0x07.增
//在静态链表中第i个元素之前插入元素e
int Insert(List L,int i,int e)
{
int j, k, l;
k = MAXSIZE - 1;//最后一个元素的下标
if (i<1||i>ListLength(L))
{
return false;
}
j = Malloc_SList(L);
if (j)
{
L[j].data = e;
for (l = 1; l <= i - 1; l++)
{
k = L[k].cur;//寻找第i个元素之前的位置
}
L[j].cur = L[k].cur;//把第i个元素之前的游标给新元素
L[k].cur = k;//把新元素的下标给第i个元素之前的元素
return true;
}
return false;
}
0x08.删
int ListDelete(List L, int i)
{
int j, k;
if (i<1 || i>ListLength(L))
{
return false;
}
k = MAXSIZE - 1;
for (j = 1; j <= i - 1; j++)
{
k = L[k].cur;
}
j = L[k].cur;
L[k].cur = L[j].cur;
Free_SSL(L, j);
return true;
}