故事没完,接着,排在第一个的甲突然接到一电话,看着很急,多半不是家里有紧急情况,就是单位有突发状况,反正稍有犹豫之后就急匆匆离开。这意味着第一位空出来了,那么自然刚才那个收了好处的乙就成了第一位——有人走运起来,喝水都长肉。
和前面一样,删除元素时,原来是需要释放结点的函数free()。现在我们也得自己实现它:
/* 删除在L中第i个数据元素e */
Status ListDelete(StaticLinkList L, int i){
int j, k;
if (i < 1 || i > ListLength(L))
return ERROR;
k = MAX_SIZE - 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;
}
有了刚才的基础,这段代码就很容易理解了。前面代码都一样,for循环因为i=1而不操作,j=L[999].cur=1,L[k].cur=L[j].cur也就是L[999].cur=L[1].cur=2。这其实就是告诉计算机现在“甲”已经离开了,“乙”才是第一个元素。Free_SSL(L,j);是什么意思呢?
来看代码:
/* 将下标为k的空闲结点回收到备用链表 */
void Free_SSL(StaticLinkList space, int k){
/* 把第一个元素cur值赋给要删除的分量cur */
space[k].cur = space[0].cur;
/* 把要删除的分量下标赋值给第一个元素的cur */
space[0].cur = k;
}
意思就是“甲”现在要走,这个位置就空出来了,也就是,未来如果有新人来,最优先考虑这里,所以原来的第一个空位分量,即下标是8的分量,它降级了,把8给“甲”所在下标为1的分量的cur,也就是space[1].cur=space[0].cur=8,而space[0].cur=k=1其实就是让这个删除的位置成为第一个优先空位,把它存入第一个元素的cur中,如图3-12-4所示。
当然,静态链表也有相应的其他操作的相关实现。比如我们代码中的ListLength就是一个,来看代码。
/* 初始条件:静态链表L已存在。操作结果:返回L 图3-12-4中数据元素个数 */
int ListLength(StaticLinkList L){
int j = 0;
int i = L[MAXSIZE - 1].cur;
while (i){
i = L[i].cur;
j++;
}
return j;
}
另外一些操作和线性表的基本操作相同,实现上也不复杂,就不讲解了。