大话数据结构-线性表-静态链表

来源:互联网 发布:虚拟打印软件 编辑:程序博客网 时间:2024/04/29 23:06


我的微信号:quick_snail,希望能互相交流,互相学习


像JAVA,C#这一类语言,它们没有指针,并启用了对象引用机制,所以从某个角度也实现了指针的某些作用。静态链表的作用就是给一些没有指针的高级语言实现链表的方法

它用一个数组来存储结点,每个数组元素内有两个成员,一个成员是数据,一个是cur,存储着该结点的后继结点下标,相当于前面链式表的next指针。

结构体

【建议】,要有一种“空间层次感”,List是最外层,它的共有两个成员,一个num记录实际表长,或结点个数,一个是100个元素的数组,每个元素都是node型,Node是内层的,我们把cur当做next指针来类比

函数接口:

我们把这个静态链表和单链表来做一下对比,单链表中我们是向系统用malloc来申请一块空间的,返回这个空间的地址,当系统空间满了后就不能申请了(实际上很少发生),所以在静态链表中,我们是建立一个很大很大的数组(可分配系统空间),用掉一部分后有一块备用空间,当我们需要的时候就去申请空间,在数组中是用cur来反应地址的。

按照书上的定义,初始化先将整个数组的cur位设置为下一个元素的下标值,例:a[0].cur=1;然后a[MAX-1]是最后一个元素,它的cur设为0,指向a[0],这个时候表示表空,至于为什么初始化要这样设置,等你弄懂了后面的操作才能慢慢体会的。

这里,我们为了理解后续操作,73-76这几句也是静态链表定义的,同样的,虽然现在还不懂这样的意义

我们要知道,数组最后一个元素(不是表最后一个元素)的特殊性,它的作用相当于在单链表中的头结点的作用一样,因为它的cur指向的是第一个有效元素的位置,如果我们直接联合前面的初始化函数,那么这里即打印a->g,我们把数值为a的元素的下标先保存给i,因为i = 1,所以进入while循环,然后打印a[1].data为a,然后96行代码就像单链表的p=p->next一样,让他指向下一个元素,这个时候i = 2,也不为0,所以进入第二次循环,一直到i = 7,打印了a[7].data = g后,这个时候由于这个元素是表最后一个元素了,所以它的cur设置为0,所以i =0 了就退出循环了。至此,我们要记住静态链表的几点,并且每一次的链表变化都要保证这几点:

1,a[0]ata不存数据,cur保存空闲空间的第一个元素的下标

2,链表中的有效元素的cur保存着下一个元素的下标,直到最后一个元素的cur它要设置为0

3,数组最后一个元素的cur保存第一个有效元素的下标,当删除第一个有效结点的时候要注意设置

思路先用Malloc返回空闲空间一个位置,获取下标,然后将数据存到那个结点,接下来,和单链表是类似的,用find找到操作对象的前一个元素下标,128行是将操作对象的位置下标赋给新结点的cur,即让新结点指向操作对象结点,然后再将新结点的位置下标传给find结点的cur点。来看Malooc函数

0 0