小白的数据结构与算法学习笔记(七)----静态链表及其相关操作

前面谈论的都是线性表中的单链表,其实线性表还有很多种,例如静态链表,循环链表等。今天我们看一看静态链表。

简单来说,静态链表就是用数组实现单链表的功能。但是前面我们说了,数组是顺序存储结构,在一片连续空间存储数据并且申请空间也是整块整块申请;而单链表是链式存储结构,通过指针实现“乱放”式存放数据,申请空间也是需要时就拿一块,不用时就释放空间,这俩怎么才能扯上关系呢?答:通过游标实现。

游标   4       2       3        0        5·················1

数据            A       B       C  

下标   0       1       2        3        4···············n-1

如图示, 假设该数组为a,共有n个元素。任意一个数组元素a【i】=游标+数据,例如:a【0】=(4,空) a【1】=(2,A)

a【2】=(3,B),a【3】=(4,C),a【4】=(0,空)········,a【n-1】=(1,空)

我们可以发现,数组中第一个元素和最后一个元素的数据都为空,且第一个元素的游标是第一个数据为空的元素的下标,最后一个元素的游标是第一个数据不为空的元素的下标(除首尾元素外),其他元素的游标(除最后一个数据不为空的元素游标为0,否则无法停止)就是该元素下一个元素的下标。我们通常将未使用结点与被删除结点搁一块叫做备用链表,所以说,数组第一个元素的游标就是备用链表第一个结点的下标;而最后一个元素游标是数组中存放第一个数据的元素的下标,那么自然相当于单链表的头结点。

简单概括,游标之于静态链表===指针之于单链表。

假如我先访问A,之后看它的游标是2,那接下来就访问下标为2的数据元素,也就是B,看它的游标是3,那接下来访问下标为3的数据元素,也就是C,依次往后可知。所以说,游标就是告诉我们下一个要去哪个位置,访问哪个元素。

接下来我们来看一下静态链表的插入操作。插入操作,要做啥呢?首先我们要找个空地搁插入元素吧。数组是顺序存储结构,如果按顺序存储,那就要把从目标位置开始到最后一个元素整体后移,那就不叫静态链表了。我们只需要把备用链表第一个结点的那个位置给插入元素就可以了,再把备用链表第一个结点往后移一个。然后再想办法把插入元素插进去,想想单链表怎么处理的?靠指针。我们前面说了,静态链表里游标相当于指针,所以这里靠游标!让插入元素的游标指向被插入位置后一个元素,被插入位置前一个元素的游标指向插入元素即可,和单链表插入操作基本一样,就不赘述了。

但是注意由于静态链表中游标有三个特殊位置(首,尾,最后一个有数据的元素位置),所以要确定被插入位置前一个元素游标需要循环,而非直接用下标取出!!

那静态链表要怎么删除元素呢?还是类似于单链表,采取“绕开”操作。首先我们还是要通过循环找到目标位置,然后通过游标变换,使得目标位置前一个元素的游标指向目标位置后一个元素即可。但是不是这样就完了,毕竟这还是数组,不像单链表的数据是随意分布的,所以删除后不管也可以,反正内存里全是乱七八糟的数据在随意分布。静态链表对待这种删除元素,是把它们变成备用链表!!我们知道数组中第一个元素的游标是备用链表的第一个结点,所以假如被删的位置是k,那直接这样处理即可:

space[k].cur=space[0].cur;  space[0].cur=k;这样就把被删结点加到备用链表中去了。

                                                                                                                                                       BY   ZJQ

猜你喜欢

转载自blog.csdn.net/qq_41641805/article/details/81382129