静态链表的概念与基本操作

2023-11-14

静态链表顾名思义就是用静态数组的方式来模拟一个链表的实现,这个在没有指针类型的高级机器语言会出现,但是用途感觉还是很少的,由于是借助于一个固定长度的数组来描述线性表的链式存储结构,灵活度比较低的。

和链表的一样,adt中含有数据域 data和指针域 next,但是静态链表中的指针常常被称之为 游标,也就是 cur,和顺序表相同初始化之前要预先分配一块连续的内存空间。

静态链表图示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J8kL2Oaq-1653238705239)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20220522235316773.png)]

基本思想

由于王道第二章对这个静态链表描述较少,这里做一点点补充吧。

首先就是第一点,通常会将静态链表的0位置的结点设置为整个链表的头结点,用他来对已经申请的结点进行管理。

头结点的特点

数据域中不存数据,游标的值尾第一个申请结点所对应的数组下标,若是该静态链表还未申请结点来存放数据,那么其游标的值设为-1表示该静态链表为空

那么未被分配空间的结点要怎么办呢?

我们这里会让数组位置1空出来,来作为未被分配结点的管理结点pool,其数据域同样不放入数据,其cur指向的点为未被分配数据的第一个结点,也就是,王道图为更加简化版没有设置一个管理未被分配区(也被称为静态链表的备用区),也就是说pool这个结点充当一个备用区的头结点的作用,其中不包含数据且其游标值为第一个未申请结点对应的下标值(当表中已经没有未被申请的节点后,其cur设置为0,表示链表已满)

具体实现

定义:

#define  MAXSIZE 20

typedef char ELemType;

//静态链表的定义
typedef struct {
	ELemType data;
	int cur;
}SLinkList[MAXSIZE];

初始化

//静态链表的初始化
void InitSList(SLinkList space) {
	//先要初始化备用空间pool(下标从1-maxsize-1)由于一开始都没分配空间
	//然后吧0位置的cur设为-1,因为一开始没有结点含有数据
    //还有就是备用区最后一个空间后面再无可以用的空间游标设为0
	for (int i = 1; i < MAXSIZE; ++i) {
		space[i].cur = i + 1;
	}
	space[MAXSIZE - 1].cur = 0;
	space[0].cur = -1;
}

申请结点

//申请结点
int MallocKnot(SLinkList space) {
	int i = space[1].cur;//表示从备用区头结点的游标即下一个空数据结点
	if (i != 0) {
	//说明还有空闲结点
   //更改头指针指向表示指向下一个空的结点
		space[1].cur = space[i].cur;
	}
	return i;//返回新申请的空间的数组下标的

}

头插法

//头插法
int InsertKnot(SLinkList space, ELemType ee) {
	int tmp = MallocKnot(space);
	if (tmp == 0) {
		//申请空间失败
		printf("已满");
		return 0;
	}

	//成功
	space[tmp].data = ee;
	if (space[0].cur == -1) {
		space[0].cur = tmp;
		space[tmp].cur = -1;
	}
	else
	{
		//之前已经有数据节点了
		//因为后面的结点完全不知道前面的结点情况
	   //所以新插入结点的游标直接让头节点游标赋值即可
		space[tmp].cur = space[0].cur;
		space[0].cur = tmp;
	}
	return 1;
}

删除结点(头部)

//删除结点(在头部)
int Delete(SLinkList space) {
	int tmp = space[0].cur;
	space[0].cur = space[tmp].cur;//逻辑上删除
	//要重新分配一下备用区pool
	space[tmp].cur = space[1].cur;
	space[1].cur = tmp;
}

打印链表

//结点数据显示
void showlist(SLinkList space) {
	int i = space[0].cur;
	while (i!=-1)
	{
		printf("%c", space[i].data);
		i = space[i].cur;
	}
	return;
}

总结

优点
1.在插入和删除操作肘,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删
除操作需要移动大量元素的缺点
缺点
失去了顺序存储结构随机存取的特性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态链表的概念与基本操作 的相关文章

随机推荐

  • 阅读有感——Verilog对数据进行四舍五入(round)与饱和(saturation)截位

    思考1 FPGA中只能定义定点数吗 首先 我没有搞清楚定点数与浮点数的定义 定点数就是小数位固定不变的数叫做定点数 也就是小数点是定在某个位置不变的数 结论 FPGA中的信号可以是定点型也可以是浮点型 这只是一种数据表示形式 各有优缺点 1
  • 【c++】vector的使用与实现

    目录 1 vector的介绍 2 vector的使用 2 1 vector 的构造 2 2 vector迭代器的使用 2 3 vector 空间方面的函数 2 4 vector 增删查改 2 5 vector 迭代器失效问题 3 vecto
  • Android开发—浅谈人脸检测的简易实现,成功定级腾讯T3-2

    findFaces 方法 Canvas类绘制人脸矩形区域 完整代码 最终效果图 结语 Android中的人脸检测 计算机视觉开发在近些年来越发火热 而关于人脸检测或识别等相应功能也成为了大家津津乐道的话题 在智能手机端领域中 人脸识别被广泛
  • Android混合使用service小技巧

    预备知识 Android四大组件之service 一 我想月薪过万的博客 CSDN博客https blog csdn net qq 41885673 article details 120816678 spm 1001 2014 3001
  • curl(文件传输工具)安装和基础使用

    cURL是一个利用URL语法在命令行下工作的文件传输工具 1997年首次发行 它支持文件上传和下载 所以是综合传输工具 但按传统 习惯称cURL为下载工具 cURL还包含了用于程序开发的libcurl ubuntu下的安装 安装curl 1
  • Android:线性布局介绍,线性布局weight属性,线性布局微调参数gravity,线性布局divider

    LinearLayout 线性布局 一 线性布局介绍 新建一个工程 然后我们默认的布局 是相对布局 相对布局的意思是我的控件可以在里面随意放置 那如果把这个RelativeLayout 改了呢 不用这相对布局 而是用线性布局 我们把代码都删
  • MySQL自治平台建设的内核原理及实践(下)

    本文整理自美团技术沙龙第75期的主题分享 美团数据库攻防演练建设实践 系超大规模数据库集群保稳系列 内含4个议题的PPT及视频 的第4篇文章 本文作者在演讲后根据同学们的反馈 补充了很多技术细节 跟演讲 视频 相比 内容更加丰富 文章分成上
  • JavaWeb—Request请求对象

    目录 一 概述 二 Request对象 2 1 Request继承体系 小结 2 2 Request获取请求数据 2 2 1 获取请求行数据 2 2 2 获取请求头数据 2 2 3 获取请求体数据 小结 2 2 4 获取请求参数的通用方式
  • 海康—SADP激活(设备网络搜索)

    海康sadp搜索工具 SADPTool 用于从网络上搜索同一网段内的所有在线设备 可以修改设备的缺省密码 修改网络IP地址及端口号 子网掩码及网关地址 IPV6地址网关地址 HTTP端口号和设备序列号 运行双击打开图标 转载于 https
  • Spring Boot 集成 Hive

    一 环境 二 依赖 三 配置 四 代码样例 五 参考 一 环境 Lombok JDK 1 8 0 281 MyBatis Plus 3 4 3 Spring Boot v2 3 7 RELEASE 二 依赖 其他依赖视个人情况添加
  • 算法系列--排序算法(四)快速排序

    快速排序是通过两个指针相互交换完成一次快速排序 类似于递归的二分排序 从交换上来讲比较像冒泡 为什么这么说呢 不管是插入还是直接 都需要在移动之前遍历元素 冒泡直接比较交换 上面的可能有点抽象 我是不太想抄一个百度定义去解释 可能对算法理解
  • javascript中的with()方法

    with 方法 with方法用于多次使用对象属性时 可简化多次编写同一对象的工作 例 js代码 var aa document createElement div 创建一个div赋给aa with aa style width 400px
  • 【 uniapp 】打包Android的apk(原生APP-云打包),及发布测试

    前言 跨端 小程序 Android IOS 项目开发好了 我们如何去利用 uniapp 的云打包去打包 apk 文件 然后上传测试呢 今天我们一起来学习一下 一步一步如何实现 目录 一 打包 Android 生成apk 1 原生APP 云打
  • 三天的C语言学习 小结(含基础代码)

    从八月一号开始学习B站鹏哥C语言 课程充实详细适合新手入门 我用的是Devc 编译器 虽然不咋先进但也能用 目标是每天学一节课可以的话多学一点再将其充分消化 慢慢总结 打好基础 慢慢提升 刚开始自学的话能做到这些也差不多了 等到大学的时候在
  • HTTP协议中的短轮询、长轮询、长连接和短连接

    转自 https www cnblogs com Leo wl p 5397265 html 阅读目录 一 引言 二 以前的误解 三 一个疑问 四 长轮询和短轮询 五 长短轮询和长短连接的区别 六 结语 阅读目录 HTTP协议中的短轮询 长
  • golang多版本管理工具g

    一 Go的项目隔离 GVM是一个golang虚拟环境配置工具 其允许一台机器上安装多个golang版本 gvm是第三方开发的Go多版本管理工具 类似ruby里面的rvm工具 或者nodejs的版本管理工具nvm 它是以shell脚本开发的工
  • 为Nginx添加第三方模块

    cd opt 拖入压缩包 解压 mv到指定目录 方便后面操作 进入nginx安装包 cd opt nginx 1 15 9 root szh nginx 1 15 9 configure prefix usr local nginx add
  • ASCII码对照表(二进制、十进制、十六进制)

  • MySQL存储引擎及其索引实现

    存储引擎指表的类型及表在计算机上的存储方式 主要的存储引擎有InnoDB MyISAM Memory等 MyIASM 1 使用这个存储引擎 每个MyISAM在磁盘上存储三个文件 frm文件 存储表的定义数据 MYD文件 存放表具体记录的数据
  • 静态链表的概念与基本操作

    静态链表顾名思义就是用静态数组的方式来模拟一个链表的实现 这个在没有指针类型的高级机器语言会出现 但是用途感觉还是很少的 由于是借助于一个固定长度的数组来描述线性表的链式存储结构 灵活度比较低的 和链表的一样 adt中含有数据域 data和