用数组描述的链表叫做静态链表,这种描述方法还有起名叫做游标实现法。如下图所示:
图 1
图 2
静态链表的插入操作:
在动态链表中,结点的申请和释放分别借用malloc()和free()两个函数来实现。在静态链表中,操作的是数组,不存在像动态链表的结点申请和释放问题,所以需要自己实现这两个函数,才能做插入和删除的操作。
/*若备用空间链表非空,则返回分配的结点下标,否则返回0*/
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].cur; //当前数组第一个元素的cur所存的值
if(space[0].cur)
space[0].cur = space[i].cur;
return i;
}
/*在L中第i个元素之前插入新的数据元素e*/
Status ListInsert(StaticLinkList *L, int i, ElemType e)
{
int j,k,l;
k = MAXSIZE-1; //注意k首先是最后一个元素的下标
if(i<1||i>ListLength(L)+1)
return ERROR;
j = Malloc_SLL(L); //获得空闲分量的下标
if(j)
{
L[j].data = 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;
}
静态链表的删除操作:
和前面一样,删除元素时,原来是需要释放结点的函数free(),现在也需要自己实现:
/*将下标为k的空闲结点回收到备用链表*/
void Free_SLL(StaticLinkList space, int k)
{
space[k].cur = space[0].cur; //将表头元素的cur值赋给要删除的元素的cur
space[0].cur = k; //将待删除的下标值赋给表头元素的cur
}
//该函数将 表头元素的cur值与待删除元素的cur值进行互换,然后将待删除元素的下标值赋给表头元素的cur
/*删除在L中第i个数据元素e*/
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;
}