对于线性链表,也可用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构。
定义
用数组描述的链表,即称为静态链表。
在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR。
实现
初始化操作
首先给出静态链表的存储形式
1 | typedef int ElemType; |
静态链表中,数组第一个元素的cur用来存放备用链表的第一个结点;最后一个元素的cur用来存放第一个插入元素的下标;且对数组第一个元素和和最后一个元素不进行数据存放。
1 | // 初始化 |
链表插入
这里我们假设存放了“甲乙丁戊己庚” 6个元素
第一个空闲结点下标是7,所以第一个元素的cur为7;第一个插入节点下标为1,所以最后一个元素的cur为1。
插入的步骤:(设k为插入第i个元素之前的元素)
1.找到的第一个空闲节点,存放新数据
2.把k的cur赋给新元素
3.把新元素的下标赋给k的cur
1 | Status ListInsert(StaticLinkList L, int i, ElemType e) // 插入新元素 |
这时我们添加一个“丙”元素,效果如下
链表删除
链表删除的步骤:
1.获取删除元素的位置
2.将删除元素的cur赋给前一项元素的cur
3.释放删除元素的存储位置,即设置空闲节点
空闲节点的变化通过Free_SSL()实现,把当前空闲结点的位置赋给删除位置的cur,删除位置下标再赋给第一个元素
1 | Status ListDelete(StaticLinkList L, int i) // 删除元素 |
现在要删除“甲”这个元素,效果如下:
完整代码
1 | /* 结构数组实现静态链表*/ |
执行结果:
1 | 插入元素: |
优缺点
优点
- 在插入和删除操作时,只需修改游标,不需要移动元素,从而改进了在顺序存储结构中插入和删除需要移动大量元素的缺点
缺点
- 没有解决连续存储带来的表长难以确定的问题
- 失去了顺序存储结构随机存储的特性