静态链表和循环链表

静态链表

所谓静态链表,与指针型描述的链表(动态链表)的区别在于静态链表借用一维数组来描述链表.这种存储类型需要预先分配一个较大的空间.其结构如下图:
这里写图片描述
与动态链表操作时最大的区别在于:

静态链表需由用户自己实现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;
}

至此,静态链表的操作和动态链表的操作一致.

循环单链表

循环单链表是另一种形式的链式存储结构,和单链表的唯一区别在于:表中最后一个结点的指针域指向头结点.

循环单链表的示意图如下:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值