静态链表是利用数组代替指针来描述单链表,数组的每一个元素都由两个数据域组成,data
和cur
。data
用来存放数据,cur
用来存放下一个元素的在数组中的下标,cur
也被称作游标。
此外整个链表也被逻辑划分为两个部分:已使用链表和备用链表,我们对数组的首元素和尾元素进行特殊处理,不存数据。首元素的cur
中存放备用链表第一个元素的下标;而尾元素的cur
中存放已使用链表的第一个元素的下标,当尾元素cur
为0时说明链表为空。
当链表有存储数据时,已使用链表中的最后一个元素的cur
为0。
特点
- 静态链表利用游标来索引到下一个元素,每次删除和添加元素时只需要修改
cur
值,不需要移动元素。改进了顺序存储结构每次添加和删除都需要移动大量元素的缺点。 - 静态链表没有解决连续存储分配带来表长难以确定的问题。失去链式存储结构随机存储的特性。
代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define OK 1 // 状态返回值
#define ERROR 0 // 状态返回值
#define FALSE 0 // 状态返回值
#define TRUE // 状态返回值
#define MAXSIZE 1000 // 数组最大容量
typedef int ElemType; // 数据元素类型
typedef int Status; // 函数操作状态返回类型
// 定义静态链表结构
typedef struct StaticList {
ElemType data; // 数据域
int cur; // 游标
}component, StaticList[MAXSIZE];
// 初始化
Status InitList(StaticList SL)
{
int j = 0;
for (j = 0; j < MAXSIZE - 1; j++)
{
SL[j].cur = j + 1; // 初始化,使每个元素的`cur`都存放下一个元素的下标
}
SL[MAXSIZE - 1].cur = 0; // 最后一个元素的`cur`初始化为0
return OK;
}
// 获取表长
int Listlength(const StaticList SL)
{
int k = SL[MAXSIZE - 1].cur