【数据结构】线性表的链式存储结构

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


顺序存储结构的不足的解决办法

从上一节我们对顺序表的讨论中可见,线性表的顺序存储结构的特点是:

逻辑关系上相邻的两个元素在物理位置(内存)上也相邻,因此可以随机存取表中任一位置元素,它的存储位置可用一个简单,直观的公式来表示.

然而,从另一方面来看,这个特点也铸成了这种存储结构的弱点:

  • 中间或头部位置进行插入/删除数据操作,需要挪动数据,效率低下
  • 空间不够就需要扩容.扩容有一定的消耗,其次还可能有一定空间浪费.

显然,这样的结构如果碰到数据量庞大并且需要频繁进行头插或中间插入的情况时的操作时间复杂度是极其庞大的.那么如何解决这个问题呢?我们先来思考一下导致这个问题的原因:

为什么当插入和删除时,就需要移动大量元素?仔细分析后,发现原因就在于相邻两元素的存储位置也具有邻居关系.它们编号是1,2,3,...,n,它们在内存中的位置也是挨着的,中间没有空隙,当然就无法快速介入,而删除后,当中就会留出空隙,自然需要弥补.问题就出在这里.

小A:既然问题在于元素之间没有空隙,那我们不如提前在元素之间留出一个空位方便其他元素插入,这样插入一个元素就不用挪动了.

小B:那假如我们要插入2个数据呢?

小A:那我们就留10个空位.

小B:我们要插入11个数据呢?

小A:那我们就留10000个空位!

小B:我们要插入10001个数据呢?

小A:那就不留空位了!大家随便存吧,哪有空位存哪吧!

小B:你说的对!

小A:??????

小B:就是物理上的相邻的特性导致了顺序存储的弱点,那么我们不让它们在物理上不相邻不就可以解决这个问题了.

小A:可是不在物理上相邻了,我们怎么知道下一个数据存在哪呢?

小B:你傻啊,我们存上一个数据的时候顺便存入一个下个结点的地址就可以了嘛.

上面这段对话中小A和小B交流讨论的结果就是我们接下来将要讨论线性表的另一种表示方法——链式存储结构,由于它不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构所具有的弱点,但同时也失去了顺序表可随机存取的优点.


线性表链式存储结构的定义

线性表的链式存储结构的特点是:

用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.

这就意味着,这些数据元素可以存在内存未被占用的任意位置.

以前在顺序结构中,每个数据元素只需要存储数据元素信息就可以了.现在链式结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址.

因此,为了表示每个数据元素a_{i}与其直接后继数据元素a_{i+1}之间的逻辑关系,对数据元素a_{i}来说,除了存储其本身的信息外,还需存储一个指示其直接后继的信息(即直接后继的存储位置).我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域.指针域中存储的信息称作指针或链.这两部分信息组成数据元素a_{i}的存储映像,称为结点(Node).

结构图示如下:

n个结点(a_{i}的存储映像)链结成一个链表,即为线性表(a_{1},a_{2},a_{3}...a_{n})的链式存储结构,因为此链表的每个结点中只包含一个指针域,所以叫做单链表.单链表正是通过每个结点的指针域将线性表的数据元素按其逻辑次序链接在一起,如下图:

对于线性表来说,总得有个头有个尾,链表也不例外.我们把链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了.之后的每一个结点,其实就是上一个的后继指针指向的位置.想象一下,最后一个结点,它的指针指向哪里?

最后一个,当然就意味着直接后继不存在了,所以我们规定,线性链表的最后一个结点指针为"空"(通常用NULL或"^"符号表示,如下图)

有时,我们为了更加方便地对链表进行操作,会在单链表的第一个结点前附设一个结点,称为头结点.

头结点的数据域可以不存储任何信息,也可以存储如线性表的长度等附加信息,头结点的指针域存储指向第一个结点的指针,如下图所示:


头指针与头结点的异同

头指针

  • 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针.
  • 头指针具有标识作用,所以常用头指针冠以链表的名字.
  • 无论链表是否为空,头指针均不为空.头指针是链表的必要元素.

无头结点单链表示意图:

无头结点空链表示意图:

头结点

  • 头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度).
  • 有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其他结点的操作就统一了.
  • 头结点不一定是链表必须要素.

带头结点单链表示意图:

带头结点空链表示意图:

链表的C语言实现

当我们搞明白了线性表的链式存储结构的理论知识后,接下来就需要依据这些理论知识来使用C语言实现单链表了,由于篇幅有限,我会另外再写一篇博客详细阐释用C语言实现单链表的各个步骤以及单链表的完整代码和运行效果都会包含在里面,感兴趣的朋友可以直接点击下方链接跳转到博客:

【数据结构】C语言实现单链表万字详解(附完整运行代码)icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/133971550


结语

当我们搞清楚线性表的链式存储结构后,在数据结构线性表篇我们还将一起学习单链表的C语言实现,循环链表,双向链表等相关知识.希望这些内容能对大家有所帮助!欢迎大佬们留言或私信与我交流.学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】什么是数据结构?

【数据结构】什么是算法?

【数据结构】什么是线性表?

【数据结构】线性表的抽象数据类型

【数据结构】线性表的顺序存储结构

【数据结构】C语言实现顺序表万字详解(附完整运行代码)



数据结构线性表篇思维导图:

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

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

相关文章

借PVE8.0的Debian 12系统配置一下NFS服务器

正文共:1234 字 16 图,预估阅读时间:2 分钟 前面我们介绍了基于Windows Server 2012 R2创建的共享NFS(Network File System,网络文件系统)存储(Windows Server2012 R2搭建NFS服务器)…

快速搭建开源分布式任务调度系统DolphinScheduler并远程访问

使用Docker部署开源分布式任务调度系统DolphinScheduler 文章目录 使用Docker部署开源分布式任务调度系统DolphinScheduler前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinSchedu…

移动医疗科技:开发互联网医院系统源码

在这个数字化时代,互联网医院系统成为了提供便捷、高效医疗服务的重要手段。本文将介绍利用移动医疗科技开发互联网医院系统的源码,为医疗行业的数字化转型提供有力支持。 智慧医疗、互联网医院这一类平台可以通过线上的形式进行部分医疗服务&#xff…

Python的版本如何查询?

要查询Python的版本,可以使用以下方法之一: 1.在命令行中使用python --version命令。这会显示安装在计算机上的Python解释器的版本号。 # Author : 小红牛 # 微信公众号:wdPython2.在Python脚本中使用import sys语句,然后打印sy…

P6入门:项目初始化1-项目详情介绍

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

视频剪辑教程:视频嵌套技巧深度解析,提升剪辑水平的捷径

在视频剪辑的世界里,视频嵌套是一项强大的技术,也是许多专业剪辑师提升剪辑水平的重要手段。通过巧妙地运用视频嵌套技巧,可以在视频中创造出丰富的视觉效果,让观众眼前一亮。简单来说,就是在同一个视频轨道上&#xf…

JAVA客户端使用账号密码调用influxdb2报错:{“code“:“unauthorized“,“message“:“Unauthorized“}

问题&#xff1a;JAVA客户端访问influxdb2报错 说明&#xff1a;当前influxdb版本&#xff1a;2.6.1 使用依赖&#xff1a; <dependency><groupId>org.influxdb</groupId><artifactId>influxdb-java</artifactId><version>2.10</vers…

基于公共业务提取的架构演进——外部依赖防腐篇

背景 有了前两篇的帐号权限提取和功能设置提取的架构演进后&#xff0c;有一个问题就紧接着诞生了&#xff0c;对于诸多业务方来说&#xff0c;关键数据源的迁移如何在各个产品落地&#xff1f; 要知道这些数据都很关键&#xff1a; - 对于帐号&#xff0c;获取不到帐号信息是…

第四章《全景图:机器学习路线图》笔记

4.1 通俗讲解机器学习是什么 4.1.1 究竟什么是机器学习 卡内基梅隆大学机器学习领域的著名学者汤姆米切尔曾经在 1997 年对机器学习做出过更为严谨和经典的定义: A program can be said to learn from experience E with respect to some class of tasks T and performance …

kantts底膜训练篇-----个性化模型底膜训练

我是kantts群里的老友了&#xff0c;群里有很多热心肠的人安念、马静等很多老哥&#xff0c;还有群主格真、渡航等开源作者的支持。在里面摸爬滚打了3天&#xff0c;现在才能出这个教程。 因为kantts多年没维护了&#xff0c;只有简单的运行教程&#xff0c;很多深入的&#x…

【Redis】Java连接redis进行数据访问及项目的实例应用场景

目录 一、连接 二、数据访问 1. 字符串(String) 2. 哈希(Hash) 3. 列表(List) 4. 集合(Set) 三、项目应用 1. 作用 2. 实例 一、连接 打开开发工具( IDEA ) &#xff0c;在需要连接Redis的项目中&#xff0c;找到 pom.xml 配置文件导入依赖 在pom.xml 配置文件中导入以…

【LeetCode力扣】42.接雨水(困难)

目录 1、题目介绍 2、解题 2.1、解题思路 2.2、图解说明 2.3、解题代码 1、题目介绍 原题链接&#xff1a;42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,…

【Go 编程实践】从零到一:创建、测试并发布自己的 Go 库

为什么需要开发自己的 Go 库 在编程语言中&#xff0c;包&#xff08;Package&#xff09;和库&#xff08;Library&#xff09;是代码组织和复用的重要工具。在 Go 中&#xff0c;包是代码的基本组织单位&#xff0c;每个 Go 程序都由包构成。包的作用是帮助组织代码&#xf…

学习笔记|构建一元线性回归模型|方差分析|方差齐性|检验残差正态性|规范表达|《小白爱上SPSS》课程:SPSS第二十讲: 一元线性回归分析怎么做?

目录 学习目的软件版本原始文档一元线性回归分析一、实战案例二、统计策略三、SPSS操作四、结果解读第一个表格为模型摘要第二表格为方差分析表第三个表格为模型系数第四张散点图&#xff08;主要检验方差齐性&#xff09; 第五张直方图和P-P图&#xff08;检验残差正态性&…

计算机毕设 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕…

单通道低压 H 桥电机驱动芯片AT9110H 兼容L9110 马达驱动芯片

H桥直流电机驱动电路是一种用于控制直流电机运转的电路&#xff0c;其主要特点是可以实现正反转控制&#xff0c;控制电机转速和方向&#xff0c;同时也具有过流保护功能。 H桥电路由四个功率晶体管和一些辅助电路组成&#xff0c;其中两个晶体管用于控制电机正转&#xff0c;…

【Mysql】去重(distinct)

目录 distinct 单字段 多字段 统计&#xff08; count ) distinct name为张三的有5条数据并且重复 单字段 语法&#xff1a; select distnct 字段名 from 表 这里的去重并不是删掉重复 多字段 select distinct 字段名1&#xff0c;字段名2 from 表 统计&#xff08; coun…

java通过FTP跨服务器动态监听读取指定目录下文件数据

背景&#xff1a; 1、文件数据在A服务器&#xff08;windows&#xff09;&#xff08;不定期在指定目录下生成&#xff09;&#xff0c;项目应用部署在B服务器&#xff08;Linux&#xff09;&#xff1b; 2、项目应用在B服务器&#xff0c;监听A服务器指定目录&#xff0c;有新…

【vue会员管理系统】篇五之系统首页布局和导航跳转

一、效果图 1.首页 2.会员管理&#xff0c;跳转&#xff0c;跳其他页面也是如此&#xff0c;该页的详细设计会在后面的章节完善 二、代码 新增文件 components下新增文件 view下新增文件&#xff1a; 1.componets下新建layout.vue 放入以下代码&#xff1a; <template…

学术论文的实证数据来源

一、引言 在当今的学术研究中&#xff0c;数据是至关重要的。无论是自然科学、社会科学还是人文科学&#xff0c;都需要借助数据来支撑和证明其研究假设和理论。然而&#xff0c;数据的来源却是多种多样的&#xff0c;而且不同的学科领域也有其特定的数据来源。本文旨在探讨论文…