遗落在时光里的静态链表(线性表的静态存储)---C语言版

静态链表是C语言出现之前的一种链表实现,通过数组下标模拟指针。它将数组分为数据部分和备用链表,通过游标管理空间。初始化时,备用链表连接未使用位置,插入和删除操作涉及备用链表的调整。静态链表虽然解决了链表的随机访问问题,但并未解决数组长度固定的问题。本文通过实例展示了静态链表的创建、插入、删除等操作。
摘要由CSDN通过智能技术生成

众所周知,指针是c语言的灵魂,指针使得链表的实现简单明了起来。
但是问题来了,在c语言还没有的时代,又想描述链表,怎么办呢?
这就有了我们今天的主角静态链表

首先,我们来解决一个最重要的问题,没有指针,怎么表示下一个元素的位置呢?

当时的人们想出来的办法便是,用数组的下标来代替指针。我们把这个数组的下标叫做游标。

第二个问题,当我们要往数组里插入元素时,如何确定数组里哪些分量未被使用,要插到哪个位置上呢?当我们删除一个元素的时候,要把这个删除后已经不存放数据的数组分量链接到哪里去,然后再次被使用呢?

解决办法是将所有未被使用过的以及被删除的分量用一个游标链成一个备用链表。
每当进行插入的使用便从备用链表上取得第一个结点作为待插入的新结点。
反之,在删除时将从链表中删除下来结点链接到备用链表上。

有没有觉得上面的描述特别熟悉,这实际上就是C语言里面malloc函数和free函数做得事情,在静态链表中,我们得自己实现,不过操作起来也不复杂。

最后一个问题,我们现在已经知道了我们把静态链表分为两部分,一部分存放数据,一部分不存放数据,我们称之为备用链表。那么我们如何标识这两部分呢?

解决办法,我们这里把数组下标为0位置的游标用来存放备用链表的第一个元素(也就是数组中第一个不存放数据的元素)的下标
我们这里把数组下标为1的位置游标用来存放第一个数据不为空的元素的下标
这里还有个细节就是我们把游标为0设为这两部分的结束。

看到这里,关于静态链表的相关问题都解决得差不多了,我们开始动手设计它吧。假定我们有一个长度为10的数组。如下所示:
在这里插入图片描述

下标0:数据不存放任何东西,游标用来指向数组当中第一个不存放数据的元素。(这里指向6)
下标1:数据不存放任何东西,游标用来指向数组当中第一个存放数据的元素。(这里指向2)
下标2到5:这部分存放了数据,最后一个存放数据的元素的游标为0.(这里下标为5的游标为0,表示最后一个存放数据的元素)
下标6-9:这部分不存放数据,备用链表,最后一个可被使用的元素的游标为0(这里下标为9的游标为0)

接下来我们就可以正式实现它了。

静态链表的定义

步骤一:定义数据元素类型

#define ElemType char//这里我们使用的例子,采取字符

步骤二:定义静态链表

#define MaxSize 10  //链表的最大长度
typedef struct{
   
    ElemType data;//存储的数据元素
    int next;//游标,用来指示下一个数组分量的下标
}SLinkList[MaxSize];//静态链表

静态链表的操作

初始化
/*初始化*/
int InitSpace_SL(SLinkList space){
    
  int i;
  for (i = 2; i < MaxSize-1; i++){
   
      space[i].data=' ';
      space[i].next=i+1;
  }
  space[0].next=2;
  space[0].data=' ';
  space[1].next=0;
  space[1].data=' ';
  space[MaxSize-1].next=0;
  space[MaxSize-1].data=' ';
  return TRUE;
}

运行打印结果:

初始化成功
数组下标=0,数据= ,游标为2
数组下标=1,数据= ,游标为0
数组下标=2,数据= ,游标为3
数组下标=3,数据= ,游标为4
数组下标=4,数据= ,游标为5
数组下标=5,数据= ,游标为6
数组下标=6,数据= ,游标为7
数组下标=7,数据= ,游标为8
数组下标=8,数据= ,游标为9
数组下标=9,数据= ,游标为0

初始化后的空表如下所示:
在这里插入图片描述
那么不顺便好奇一下表满了长什么样吗?
在这里插入图片描述

求表长
/*求表长*/
int ListLength(SLinkList space){
   
    int length=0;//空表长度为0
    int i=space[1].next;//指向第一个有数据的位置
    while (i!=0){
   
        length++;
        i=space[i].next;//相当于指针的p=p->next
    }
    return length;
}

主要的操作便是遍历表:
这里的i=space[i].next;相当于指针的p=p->next

分配空间
int Malloc_SL(SLinkList space){
   
    int i=space[0].next;//指向第一个没有数据的位置
    if(space[0].next) space[0].next=space[i].next;//如果还有空间,让space[0].next指向下一个空闲位置
    r
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋千水竹马道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值