这篇文章开始,我们来讲述一下静态链表。
静态链表是分配一整片连续的内存空间,各个结点集中安置,而不是像单链表那样,每个结点在内存中分散存储。
如上如的存储方式,优点类似于顺序表,但是在这一整片连续的内存空间中,元素不是按照顺序存储的。而是可以打乱顺序存储,这时候就需要将结点分为两个部分,一个部分存储数据元素,另一个部分存储下一个结点所在的下标(称其为游标),比如:头结点存放的下标(游标)为2,代表在2的位置上是静态链表的第一个真正存放数据的结点。头结点的地址为addr,那么静态链表的第一个真正存放数据的结点地址就为:addr + 8*2
(这里假设数据元素和游标的大小都为4B)。
在单链表中如果想要表示表尾结点,会让该结点的尾指针指向NULL。而在静态链表中会将游标设置为-1。
#define MaxSize 10 // 静态链表的最大长度
struct Node{ // 静态链表结构类型的定义
ElemType data; // 数据域
int next; // 游标
}
我们需要的是一整块连续的空间,所以我们可以用数据的方式声明
void testSLinkList(){
strcut Node a[MaxSize]; // 数组a作为静态链表
}
书上给出的代码比较少见
#define MaxSize 10
typedef struct{
ElemType data;
int next;
}SLinkList[MaxSize];
// 等价于
#define MaxSize 10
struct Node{
ElemType data;
int next;
};
typedef struct Node SLinkList[MaxSize];
如果用以上的方式定义结构类型,那么我们的声明就会变成
void testSLinkList(){
SLinkList a;
}
上述这种方式其实意思就是声明一个静态链表a,并且其最大长度为MaxSize
,等价于下面这种写法
void testSLinkList(){
struct Node a[MaxSize];
}
这种写法其实就类似于前面的LNode *
和LinkList
的区别一样,功能完全相同,只是增加了代码的可读性。
需要将a[0](头结点)的next(游标)设置为-1,并且将空的未存入数据的位置上将游标设置为-2或者其他值(这在后续的插入中有用)
从头结点出发挨个往后遍历结点。所以时间复杂度为O(n)
静态链表的插入操作步骤:
静态链表的删除步骤:
静态链表在408的考察中并不是很多,并且也很少回去考代码实现,所以这里知识简单的介绍。
静态链表其实就是用数组的方式实现的链表。
现在已经用的很少了,只有早期的不支持指针的低级语言会使用该方法来达到类似单链表一样的效果。
(等学到《操作系统》中的文件管理的时候可以再回过头来体会静态列表有什么作用)
已同步更新至个人博客:https://www.hibugs.net/index.php/stlinklist/
本人菜鸟一枚,仅分享学习笔记和经验。若有错误欢迎指出!共同学习、共同进步
如果您觉得我的文章对您有所帮助,希望可以点个赞和关注,支持一下!十分感谢~(若您不想也没关系,只要文章能够对您有所帮助就是我最大的动力!)
下一篇文章传送门:正在更新,敬请期待…