我们把用数组描述的链表叫做静态链表,所谓静态链表, 其实是为了给没有指针功能的编程语言设计的一种实现单链表功能的方法。
一、定义静态链表存储结构
定义一个结构体数组,数组的元素由两个数据域组成,data和cur,也就是说,数组的每个下标都对应一个data和一个cur。数据域data用来存放数据元素,而cur相当于单链表中的指针,存放该元素的后继在数组中的下标,把cur叫做游标。
// 静态链表的存储结构
typedef struct
{
ElemyType date;
int cur;
}component,StaticLinkList[MAXSIZE];
二、初始化静态链表
// 静态链表的初始化
Status InitList(StaticLinkList L)
{
int i;
for (i=0; i<MAXSIZE-1; i++)
{
L[i].cur = i+1;
}
L[MAXSIZE-1].cur = 0;
return OK;
}
三、静态链表的malloc()和free()
在动态链表中,空间的申请和释放分别借用malloc()和free()两个函数实现。但是在静态链表中,操作的是数组,不存在像动态链表的空间申请和释放问题,所以我们需要自己实现这两个函数,才可以做插入和删除的操作。
malloc()
// 获得备用链表第一个空闲位置的下标
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].cur; //获取空闲分量的下标
if (space[0].cur)
{
space[0].cur = space[i].cur; //把他的下一个分量用来作为备用链表下标
}
return i;
}
free()
/* 将下标为k的空闲结点回收到备用链表 */
void Free_SSL(StaticLinkList L, int k)
{
L[k].cur = L[0].cur;
L[0].cur = k;
}
四、静态链表的插入操作
// 静态链表的插入
Status ListInsert(StaticLinkList L,int i,ElemyType e)
{
int j,k,l;
k = MAXSIZE-1;
if (i<1 || i>ListLength(L)+1)
return ERROR;
j = Malloc_SLL(L);
if (j)
{
L[j].date = e;
for (l = 1; l <= i-1; l++)
k = L[k].cur;
L[j].cur = L[k].cur;
L[k].cur = j;
return OK;
}
return ERROR;
}
五、静态链表的删除操作
// 静态链表的删除
Status ListDelete(StaticLinkList L,int i)
{
int j,k;
if ( i<1 || i>ListLength(L) )
return ERROR;
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 OK;
}
int main()
{
return 0;
}