《大话数据结》

静态链表的插入操作


现在我们来肴看如何实现元素的插入。静态链表中要解决的是:如何用静态模拟动态链表结构的存储空间的分配,需要时申请,J}用时释放。我们前面说过,在动态链表中,结点的申请和释放分别借用malbe()和freeO两个函数来实现。在静态链表中,操作的是数组,不存在像动态链表的结点中请和释放问题,所以我们需要自己实现这两个函数,才可以做插人和删除的操作。为了辨明数组中哪些分量未被使用,解决的办法是将所有未被使用过的及已被删除的分员用游标链成一个备用的链表,每当进行插人时,便可以从备用链表上取得第一个结点作为待插入的新结点。



这段代码有意思,一方面它的作用就是返回一个下标值,这个值就是数组头元素的cur存的第一个空闲的下标。从卜面的图示例子来看,其实就是返回70那么既然下标为7的分晕准备要使川了,就得有接替者,所以就把分吸7的cur值赋值给头兀素,也就是把8给space{U].cur,之后就可以继续分配新的空闲分鼠,实现类似malloc()函数的作用。现在我们如果需要在“乙”和“丁”之间,插入一个值为“丙”的兀素,按照以前顺序存储结构的做法,应i亥要把“丁”、“戊”、“已”、“庚’这些元素都往后移位。但日前不需要,因为我们有了新的手段二新元素“内”,想插队是吧?可以,你先悄悄地在队伍最后一排第7个游标位置待着,我,会就能帮你搞定。我接着找到了“乙”,一告诉他,你的cur不是游标为3的“丁”了,这点小钱,意思意思,你把你的下一位的游标改为7就可以厂。“乙”叹了f-}气,收了钱把cur值改了。此时再回到“内”那里,说你把你的cur改为30就这样,在绝大多数.人都不知道的情况一r} ,整个排队的次序发生了改变。 实现代码如下:



当我们执行插入语句时,我们的日的是要在“乙’和“一厂”之间插入 “丙”。调用代码时,输入1值为30第4行让k=MAX_ SIZE一1=999ti第7行,j=wlalloc_55L (L)  =7。此时下标为。的cu:也因为7要被占用而更改备用链表的滇为80第I 1 -}- l 2行,for循环i由1到2,执行两次。代码k = L[k].cur;使得k=999得到k=L[999].cur=1,再得}j} k=1.}11.cur=Zo第I3行,L[j].cur=L[k].cur;因I二7,而k=得到L}7].cur=L(2].cur=3o这就是刚才我说的让“丙”把它的cur改为3的意思。第i4行,[一}k},cur二1}意思就是1.}2].tur=7}也就是让“乙”得点好处,把它的cur改为指向“丙”的下标7}
就这样,我们实现了在数组中,实现不移动元素,却插入厂数据的操作。没理解可能觉得有些复杂,理解了,也就那么回事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值