静态链表
所谓静态链表,与指针型描述的链表(动态链表)的区别在于静态链表借用一维数组来描述链表.这种存储类型需要预先分配一个较大的空间.其结构如下图:
与动态链表操作时最大的区别在于:
静态链表需由用户自己实现malloc和free函数.为了辨明数组中哪些分量未被使用,解决的办法是:将所有未被使用过的以及被删除的分量用游标链成一个备用的链表,每当进行插入时便可从备用链表中取得第一个结点作为待插入的新结点;反之,在删除时将链表中删除下来的结点链接到备用链表上.
以下实现代码来自严蔚敏老师的《数据结构》(C语言版)
/* 线性表的静态单链表存储结构 */
/* 链表的最大长度 */
#define MAXSIZE 1000
/* 指定数据类型 */
#define int datatype
typedef struct s_node{
/* 数据域 */
datatype data;
/* 游标域 */
int cur;
}s_link_list[MAXSIZE];
/* 将整个数组空间初始化成一个链表 */
void init_space_sl(s_node space[])
{
/* 将一维数组space中个分量连成一个备用链表,space[0].cur为头指针 */
/* 0表示空指针 */
for (i = 0;i < MAXSIZE - 1; i++)
space[i].cur = i + 1;
spaece[MAXSIZE - 1] = 0;
malloc和free函数的实现
int malloc_sl(s_node space[])
{
/* 若备用链表非空,返回分配的结点下标,否则返回0 */
i = space[0].cur;
if (space[0].cur)
space[0].cur = space[i].cur;
return i;
}
void free_sl(s_node space[], int k)
{
/* 将下标为k的空闲结点回收到备用链表 */
space[k].cur = space[0].cur;
space[0].cur = k;
}
至此,静态链表的操作和动态链表的操作一致.
循环单链表
循环单链表是另一种形式的链式存储结构,和单链表的唯一区别在于:表中最后一个结点的指针域指向头结点.
循环单链表的示意图如下: