静态链表(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);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rocky Linux安装部署Elasticsearch(ELK日志服务器)

一、Elasticsearch的简介 Elasticsearch是一个强大的开源搜索和分析引擎,可用于实时处理和查询大量数据。它具有高性能、可扩展性和分布式特性,支持全文搜索、聚合分析、地理空间搜索等功能,是构建实时应用和大规模数据分析平台的首选工具。 …

【C语言】while循环语句

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

flask知识--01

flask介绍 # python 界的web框架: Django:大而全,使用率较高 :https://github.com/django/django -FastAPI:新项目选择使用它:https://github.com/tiangolo/fastapi -flask:公司一些…

【论文阅读】深度学习在过冷沸腾气泡动力学分割中的应用

Application of deep learning for segmentation of bubble dynamics in subcooled boiling 深度学习在过冷沸腾气泡动力学分割中的应用 期刊信息:International Journal of Multiphase Flow 2023 级别:EI检索 SCI升级版工程技术2区 SCI基础版工程技术3区…

探讨:围绕 props 阐述 React 通信

在 ✓ 🇨🇳 开篇:通过 state 阐述 React 渲染 中,以 setInterval 为例,梳理了 React 渲染的相关内容。 📢 本篇会 ✓ 🇨🇳 围绕 props 阐述 React 通信 props React 组件使用 pro…

7.1 嵌入式软件设计资源管理-引言

1、简介 实时和嵌入式系统的一个显著特点是对有限资源的管理。这些资源可能是CPU时间、内存、网络带宽等,它们的有限性要求系统设计者必须精心管理以确保系统的高效运行。 1.1 资源管理 资源管理是实时和嵌入式系统设计中的一个核心问题,涉及CPU时间、…

三、软件-系统架构设计师笔记-计算机系统基础知识

计算机系统概述 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 它是按人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的机器系统。 冯诺依曼体系计算机结构: 1、计算机硬件组成 冯诺依曼计算机结构将…

kafka三节点集群平滑升级过程指导

一、前言 Apache Kafka作为常用的开源分布式流媒体平台,可以实时发布、订阅、存储和处理数据流,多用于作为消息队列获取实时数据,构建对数据流的变化进行实时反应的应用程序,已被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型…

Keepalived双机热备——Haproxy搭建web群集

一、认识keepalived keepalived是一个开源的软件,用于实现高可用性和负载均衡。它主要用于在多个服务器之间提供故障转移和负载均衡的功能。keepalived可以监控服务器的状态,并在主服务器发生故障时自动将备份服务器切换为主服务器,以确保服…

统计分析笔记3

文章目录 统计检验选择正确的统计检验统计检验是做什么的?何时进行统计检验选择参数化测试:回归、比较或相关性选择非参数检验 假设检验的假设条件skewness什么是零偏度right skewleft skew计算skewnesswhat to do if your data is skewed kurtosis怎么计…

Python进阶学习:Pandas--将一种的数据类型转换为另一种类型(astype())

Python进阶学习:Pandas–将一种的数据类型转换为另一种类型(astype()) 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

【C++那些事儿】深入理解C++类与对象:从概念到实践(上)| 揭开this指针的神秘面纱

📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构冒险记 ✅C那些事儿 🌅 有航道的人,再渺小也不会迷途。 文章目录 1. 面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符…

TikTok云手机可以运营多少个账号

在社交媒体平台上,尤其是像TikTok这样的热门应用中,账号运营已经成为了许多人的日常工作。而利用云手机技术,一台手机能够同时运营多个TikTok账号,为用户带来了更大的便利和灵活性。本文将探讨 TikTok云手机能够运营多少个账号&am…

网站的安全防护需要注意哪些问题?有什么方法可以加固网站的防护

网站的安全防护,是一项复杂性、多方面的系统工程。现如今网络安全风险的增加,使得上至国家部门机关,小到个人博客,都有可能遭受网络安全问题。说到网络安全问题,比如:竞争最为激烈的游戏行业,从…

【GO开发工程师】grpc进阶#golang

【GO开发工程师】grpc进阶#golang 推荐个人主页:席万里的个人空间 文章目录 【GO开发工程师】grpc进阶#golang1、protobuf2、grpc2.1、gRPC 的 Metadata机制2.2、grpc拦截器 1、protobuf syntax "proto3"; // 指定使用的 protobuf 版本为 proto3 import…

配置前端项目到 github-pages

Quickstart for GitHub Pages - GitHub Docs

云计算新宠:探索Apache Doris的云原生策略

文章目录 Apache Doris 特性极简架构高效自运维高并发场景支持MPP 执行引擎明细与聚合模型的统一便捷数据接入 Apache Doris 极速 1.0 时代极速列式内存布局向量化的计算框架Cache 亲和度虚函数调用SIMD 指令集 稳定多源 关于 Apache Doris 开源社区基于云原生向量数据库Milvus…

大模型(LLM)的token学习记录-I

文章目录 基本概念什么是token?如何理解token的长度?使用openai tokenizer 观察token的相关信息open ai的模型 token的特点token如何映射到数值?token级操作:精确地操作文本token 设计的局限性 tokenizationtoken 数量对LLM 的影响训练模型参…

设计模式七:责任链模式

文章目录 1、责任链模式2、spring中的责任链模式Spring InterceptorServlet FilterNetty 1、责任链模式 责任链模式为请求创建了一个接收者对象的链,在这种模式下,通常每个节点都包含对另一个节点者的引用。每个节点针对请求,处理自己感兴趣…

基于springboot+vue的大学城水电管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…