故事没完,接着,排在第一个的甲突然接到一电话,看着很急,多半不是家里有紧急情况,就是单位有突发状况,反正稍有犹豫之后就急匆匆离开。这意味着第一位空出来了,那么自然刚才那个收了好处的乙就成了第一位——有人走运起来,喝水都长肉。

    和前面一样,删除元素时,原来是需要释放结点的函数free()。现在我们也得自己实现它:

    1. /* 删除在L中第i个数据元素e */
    2. Status ListDelete(StaticLinkList L, int i){
    3. int j, k;
    4. if (i < 1 || i > ListLength(L))
    5. return ERROR;
    6. k = MAX_SIZE - 1;
    7. for (j = 1; j <= i - 1; j++)
    8. k = L[k].cur;
    9. j = L[k].cur;
    10. L[k].cur = L[j].cur;
    11. Free_SSL(L, j);
    12. return OK;
    13. }

    有了刚才的基础,这段代码就很容易理解了。前面代码都一样,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);是什么意思呢?

    来看代码:

    1. /* 将下标为k的空闲结点回收到备用链表 */
    2. void Free_SSL(StaticLinkList space, int k){
    3. /* 把第一个元素cur值赋给要删除的分量cur */
    4. space[k].cur = space[0].cur;
    5. /* 把要删除的分量下标赋值给第一个元素的cur */
    6. space[0].cur = k;
    7. }

    意思就是“甲”现在要走,这个位置就空出来了,也就是,未来如果有新人来,最优先考虑这里,所以原来的第一个空位分量,即下标是8的分量,它降级了,把8给“甲”所在下标为1的分量的cur,也就是space[1].cur=space[0].cur=8,而space[0].cur=k=1其实就是让这个删除的位置成为第一个优先空位,把它存入第一个元素的cur中,如图3-12-4所示。
    image.png
    当然,静态链表也有相应的其他操作的相关实现。比如我们代码中的ListLength就是一个,来看代码。

    1. /* 初始条件:静态链表L已存在。操作结果:返回L 图3-12-4中数据元素个数 */
    2. int ListLength(StaticLinkList L){
    3. int j = 0;
    4. int i = L[MAXSIZE - 1].cur;
    5. while (i){
    6. i = L[i].cur;
    7. j++;
    8. }
    9. return j;
    10. }

    另外一些操作和线性表的基本操作相同,实现上也不复杂,就不讲解了。