静态链表的插入操作:每当要进行插入操作时,便可以从备用链表上取得第一个结点作为待插入的新节点。结合图片来说,这里我们假设要在A后面插入B:
插入完成之后:
先将整个数组的第一个元素的游标改为B即将插入位置的游标,即将下标为0的元素的游标由5改为6,这一步叫获得空闲分量。
然后将B插入到备用链表上的第一个元素,并将A的游标改为B的下标,B的游标改为C的下标,这一步才是真正的插入操作。
静态链表插入操作的实现代码:
/*代码由两部分组成*/
/*首先是获得空闲分量的下标*/
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].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 = MAX_SIZE - 1;
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++ ) //查找静态链表中第i-1个元素
{
k = L[k].cur;
}
L[j].cur = L[K].cur;
L[k].cur = j;
return OK;
}
return ERROR;
}
特别要注意的是,静态链表虽然是由数组构成的,但是数组的下标和元素内的游标均不能真实反映一个元素在链表中的具体位置,要知道一个元素在链表中的位置,必须从表头开始,一个一个挨着查找,这也是为什么上述代码在执行插入操作的过程中,要有一个For()循环的原因了,那个for循环就是在一个一个查找,直到查找到第i-1个元素,然后再将新插入的元素插入到第i-1个元素后面,即第i个元素前面。