静态链表(1)

什么叫静态链表?——用顺序表模拟链表,就叫做静态链表

第一列相当于数据域data,第二列相当于指针域next,

第一行(0)相当于头结点(头结点的数据域不放数据)

(a)图中0的next是1,1的next是2,……7的next是8,8的next是0,一遍下来又返回头结点

所以静态链表模拟的是——循环链表

这张图片中有一个姓氏是被删掉不存在也就是无效(之前说过数组中的数据域都是有数字的,只不过有些数字有效,有些数字无效,无效的数字在数组中就当做不存在)的,可以看出来是第7个ZHENG

所以数组中有一个有效数据长度length,length为几,这个数组的有效数据就是几

其余数据可能是0,也可能是其他数字,不过均无效

因为通过next的数字将每个格子串起来,发现串完一遍回到0后,7不在这串的里面(且指针域里面也没有7).

而在静态链表中,找空闲结点的时间复杂度为——O(n^2)。并不是O(n)

因为如果要看1是不是空闲结点,就要从头到尾串一遍,看看1在不在这个串里面(数组中的所有指针域里面有没有1出现过),同理2到n,每个都要遍历一遍,n个n遍为n方。

如果已知有一个空闲结点的情况下是遍历一次(所以有的说On),但若是有5000个结点,且不知道里面一共有几个空闲结点时,且第几个为空闲结点时,那就每个结点都需要遍历一遍看看在不在里面了。——时间复杂度取最坏的可能情况第5000个

其时间复杂度太大,但对于我们来说,我们使用链表最常用的操作是————头插尾插按值删。

前面指针类型的链表在头插尾插按值删的时候,每次插入我们都要malloc申请一个结点,每次删除我们要free释放p结点。(老是跟外部的空间也会有影响)

而静态链表是为了解决这个(频繁malloc申请free释放,造成内存的碎片化)麻烦的。

它一次给你总数固定的格子点数(不扩容的情况下),比如图中的给你10个点,然后你在里面插入删除

而在静态链表里面,要想插入,只要找到空闲结点O(n^2),将要插入的有效数据val赋值覆掉原来的无效数据O1,盖然后把它接入(先绑后,再接前)到有效数据链里面O1,就完成了。(时间复杂度为O(n^2))

要想删除,只要找到要删除的结点,然后把它从有效数据链里面踢出去,接入到无效空闲数据链里面,就完成了。

所以静态链表要改一下设计(为了缩小原来找空闲结点的时间复杂度),上图中a,b图就不对了

改造就是————把所有的空闲结点串起来,这样就找的快,

找空闲结点的时间复杂度就能降为O(1)

所以上图中就要划分为2张链表,一个链叫有效数据链,一个链叫空闲数据链,也就叫空闲链。

然后插入就是你去找你就从空闲链里拿出去,然后插入到有效链里。

然后规定,0号位置作为有效链的头结点,1号位置作为无效链的头结点,

那么该静态链表的结构设计要怎么做:看图写话

其内部成员就有,int data和int next

一个结点就是一个SNode即

MAXSIZE就是一个静态链表里面有多少对这样的

头文件中的函数声明

#pragma once#define MAXSIZE 10
typedef struct SNode
{int data;//数据域int next;//后继指针,表示下一个结点的意思(实际上就是数组中的下标)
}SNode,SLinkList[MAXSIZE];//SLinkList s;//s是一个长度为MAXSIZE的结构体数组,s指向该数组//初始化
void InitList(SNode* ps);//头插
bool Insert_head(SNode* ps, int val);//尾插
bool Insert_tail(SNode* ps, int val);//插入数据,在链表plsit的pos位置插入val数据元素,这个不写了,静态链表不考这么深//判空
bool IsEmpty(SNode* ps);//获取数据结点的个数
int Getlength(SNode* ps);//在链表ps中 查找第一个key值,找到返回key值的结点下标,没有找到返回-1
int Search(SNode* ps, int key);//删除链表ps中pos位置的值,删除跟插入一样成功或失败2种结果,这个也不写//删除第一个val的值
bool DelVal(SNode* ps, int val);//返回key的前驱地址,返回key的后继下标,这些也不写//输出
void Show(SNode* ps);//清空链表中的数据
void Clear(SNode* ps);//销毁整个链表内存(交回)
void Destroy(SNode* ps);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟面试/面试题

面试: 简历 - 解释简历: 简历 - 解释简历 1: 自我介绍 声音大一点 连贯一点 1: 个人基本信息 2: 个人技术介绍 重点 写一篇口语稿 1:会的技术内容 编程语言 每门语言掌握的内容 2:CS基本功底 3&#xff…

【Unity每日一记】角色控制器Character Contorller

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

校园微社区微信小程序源码/二手交易/兼职交友微信小程序源码

云开发校园微社区微信小程序开源源码,这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码,可以给你提供快捷方便的校园生活,有很多有趣实用的板块和功能,如:闲置交易、表白交友、疑问互答、任务兼职…

解决内嵌帆软报表出现重定向问题

最近收到反馈,某些程序的前端通过iframe标签内嵌finebi帆软报表时,出现一系列问题。 问题1: 如下图所示,单点登录(单点登录地址schema是https)后service地址的schema协议是http, 浏览器内核的安全策略不允许http访问https。 解决方案&#xf…

UI自动化测试:playwright工具(一):python环境下安装、UI录制使用(需要些代码能力)

一、python环境下安装playwright工具 1. 安装playwright库 pip install playwright -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com#至于镜像源,可以选,也可不选:#阿里云 http://mirrors.aliyun.com/pypi/simple/ #中国科技大学 https://py…

如何鉴别医疗设备防漏费系统的实用性

19339904493(康溪) 市场上有很多医疗设备防漏费系统,鱼龙混杂。有些系统安装后不但效果不好,还增加了医生的负担,不但需要手动输号,本来需要做一次的动作,安装系统后需要重复两次。还有的是效果…

【JavaEE进阶】图书管理系统开发日记——捌

文章目录 🍃前言🎍统一数据返回格式🚩快速入门🚩存在问题🎈问题原因🎈代码修改 🚩统一格式返回的优点 🍀统一异常处理🌲前端代码的修改🚩登录页面&#x1f6a…

docker desktop windows 下载

下载地址 xDocker: Accelerated Container Application Development 安装步骤:下一步,下一步即可

vue -- watermark水印添加方法

前言 项目生成公司水印是很普遍的需求,下面是vue项目生产水印的方法。话不多说,复制粘贴就可以马上解决你的需求。 步骤1 创建watermark.js文件。目录结构 /** 水印添加方法 */let setWatermark (str1, str2) > {let id 1.23452384164.1234124…

算法BFS经典例题(迷宫,多源BFS,BFS解决拓扑排序,FloodFill算法)

目录 力扣733.图像渲染 力扣200.岛屿数量 力扣695岛屿最大面积 力扣130.被围绕的区域(微难) int[2][3] 力扣733.图像渲染 FloodFill算法 洪水灌溉 广度优先遍历的本质就是暴力遍历 把所有的结果都走一遍(具体说怎么走的方向没有谈及&…

在 Room 数据库中使用事务处理联表操作

首先是错误版本的相关代码内容: Event.kt: import androidx.room.Entity import androidx.room.PrimaryKeyEntity(tableName "events") data class Event(val title: String,val description: String,val timestamp: Long,PrimaryKey(autoGenerate tr…

Linux下性能分析的可视化图表工具

1 sar 和sadf 1.1 简介 sar命令可以记录系统下的常见活动信息,例如CPU使用率、网络统计数据、Block I/O数据、内存使用情况 等。 sar命令的“-o [file_name]”参数可以将系统活动数据记录到file_name文件,然后通过sadf来解析,sadf命令的“-g…

SpringMVC 学习(八)之文件上传与下载

目录 1 文件上传 2 文件下载 1 文件上传 SpringMVC 对文件的上传做了很好的封装,提供了两种解析器。 CommonsMultipartResolver:兼容性较好,可以兼容 Servlet3.0 之前的版本,但是它依赖了 commons-fileupload …

CW023A-H035 CW023A-R230铜合金硬度材质书

CW023A-H035 CW023A-R230铜合金硬度材质书C2100W-O、C2680TWS-OL、C2200W-1/2H、C2800TS-O 、C2800T-H、C2800T-1/2H、C2700TS-O、C4430T-O、C2700T-O、C2700T-H、C2700T-OL、C2800TS-1/2H、C2800T-OL、C2700-O、C2800TS-H、C2700-H、C2700T-1/2H、C2600TS-1/2H、C2700-1/2H、C…

1817735-38-8,羧基五 PEG5 磺酸,含有羧酸和磺酸的PEG连接剂

1817735-38-8,Carboxy-PEG5-sulfonic acid,羧基五聚乙二醇磺酸,羧基五 PEG5 磺酸,含有羧酸和磺酸的PEG连接剂,可以进行酯化反应 您好,欢迎来到新研之家 文章关键词:1817735-38-8,…

鸿蒙媒体开发【简述】

媒体系统架构 媒体系统提供用户视觉、听觉信息的处理能力,如音视频信息的采集、压缩存储、解压播放等。在操作系统实现中,通常基于不同的媒体信息处理内容,将媒体划分为不同的模块,包括:音频、视频(也称播…

pycharm配置环境出现unsupported

情况概述: 本人电脑中的pycharm版本是2019的,在使用python3.10环境的时候,pycharm无法识别,出现如下错误: 网上说是因为python版本过高,无法兼容低版本的pycharm,解决方案分两种:要…

js中和Vue中的事件委托(事件代理)的实现方法

目录 一、事件委托(事件代理) 1、事件委托的优点 2、事件委托的缺点 3、为什么要使用事件委托 4、事件委托实现原理 5、DOM事件流 6、事件委托的实现方法 1、vue写法 1.1、html代码 1.2、js代码 2、原生的写法其实也差不多: 2.1、…

redis中的分布式锁(setIfAbsent)(expire)

目录 应用场景 代码实例1: 代码实例2: setIfAbsent: expire: 举例说明: 代码实例3: 代码实例4: 还是一个同事问的一个问题,然后闲着没事就记录下来了。多人操作同一个保单&a…

全量知识系统问题及SmartChat给出的答复 之2

Q6. 根据DDD的思想( 也就是借助 DDD的某个或某些实现),是否能按照这个想法给出程序设计和代码结构? 当使用领域驱动设计(DDD)的思想来设计程序和代码结构时,可以根据领域模型、领域服务、值对象、实体等概念来进行设计…