什么是静态链表?
当你学完线性表和数组,紧接着的静态链表,让你摸不着 ,什么是静态链表呢。简而言之就是链表和数组/顺序表的结合,我们知道数组有下标,但是每个数据域之间没有指针,因为他们顺序的占有一块连续的空间,链表的存在也是为了改善数组的连续存储带来的空间浪费。
但是我们知道没什么东西是尽善尽美的,即便是链表改善了现在的存储结构,但是同样的也增加了指针与指针的内存,结合社会发展,我们只能根据我们的情况进行合理的选择。
虽然我不知道静态链表存在的意义或者使用的方式适哪里,但是既然存在,我们就有可能会用得到。
静态链表的结构
想要理解静态链表的结构并不难,这里先放一张图:
其实,静态链表是用数组代替指针的方式来的,其实在整个链表中,没有像单链表中存在的指针,他是将数组的元素进行了分割。
分割成了两部,分,两个数据域,data和cur,data数据域是用来存放数据元素的,cur则是用来当做游标,就是类似于单链表中的next的指针,举个例子就是说比如1元素的下标是1,,但他的cur存的是下一个游标2。这也就是图中为什么需要一个空的头结点。
静态链表的各种操作
这个地方很抱歉我没有具体试验过的程序,我只能把我理解的讲给你听,比较简单,但主要是方便学习者的理解。
静态链表的插入操作
静态链表与数组最大的不同在于cur这个数据域,因为他相当于承担了单链表中指针的功能。所以再进行插入操作时,他的方式就有些变化!
现在假定有一个静态链表,你想把一个名为G的元素插在第三位B的后面。
首先把G元素添加到静态链表,因为静态链表本质上是数组,所以,G现在是最后一位,假定此时G在第7位上。
接下来,我们将第三位的B的cur修改,原先的cur应该指向的是第四位,(假定第四位的元素是C,第五位是元素D)我们将它改为第七位的G。
然后我们再把G的cur改为原本的第四位。
这样,当我们再次遍历这个数组的时候,顺序就是BGCD。
其实这与我们想象的插入不一样,仅仅是改变了指针,但是在我们使用的时候,效果是一样的。
静态链表的删除操作
有了刚刚静态链表的插入操作,剩下的你就好理解了。
当我们进行删除时,用到的是free()
当指定的某个位置的数据域空了,他的数据不存在,我们要做就是将剩下的数据完整的连在一起。
加入下标为32的元素被删除了,那么。下标为32的部分会被空出来,那么下标31和33就会断层,我们仅仅把31 的游标改为33就可以对这个静态链表继续使用。
静态链表的优缺点
优点:
在进行插入删除的操作时,仅仅改变游标就可以了,不用移动元素,改进了顺序存储结构
缺点:
1.没能解决连续存储本身的物理问题。
2.失去了顺序存储结构随机存取的特性。