数据结构4——线性表3:线性表的链式结构

news2025/1/24 10:38:41

基本概念

​ 链式存储结构用一组物理位置任意的存储单元来存放线性表的数据元素。

​ 这组存储单元既可以是连续的又可以是不连续的甚至是零散分布在任意位置上的。所以链表中元素的逻辑次序和物理次序不一定相同。而正是因为这一点,所以我们要利用别的方法将这些数据元素衔接起来。而链式存储结构通过存储下一个内容的地址完成衔接。这样,依次通过衔接,就可以将整张表串联起来。我们将存储的内容叫做数据域,将衔接叫做指针域。数据域和指针域共同构成了结点。之后我们只要记录下第一个元素的地址,就可以找到多有链表存储内容,第一个元素的地址叫做头指针。而由若干个结点由指针链组成了链表。

头指针:指向链表中第一个结点的指针

头结点:在首元结点之前附设的一个结点,不储存实际所需要的信息

设置头结点的好处:

(1) 便于首元结点的处理:首元结点的地址保存在头结点的指针域中,所以在链表的第一个位置上的操作和其他位置一致。

(2) 便于空表和非空表的处理:无论链表是否为空,头指针都指向头结点的非空指针,因此空表与非空表的处理也就统一了

首元结点:指向链表中存储第一个数据元素的结点

链表分类

单链表:结点只有一个指针域的链表

请添加图片描述

①不带头结点:

空表:头指针为空

②带头结点:

空表:头结点的指针域为空

双链表:结点有两个指针域的链表

请添加图片描述

循环链表:首尾相接的链表

请添加图片描述

链表的特点:

① 链表用一组物理位置任意的存储单元来存放线性表的数据元素,即逻辑上相邻的元素位置上不一定相邻。

② 访问时只能通过头指针进入链表,之后顺着结点一个个向后寻找。

顺序表->随机存取 链表->顺序存取

单链表

定义:

请添加图片描述

请添加图片描述

定义链表的两种方式:

Lnode *L; 或 LinkList L;

虽然两者的意思上差不多,但是对定义链表我们一般使用后者。

定义结点指针p两种方式:

Lnode *p;或 LinkList p;

虽然两者的意思上差不多,但是对定义结点我们一般使用前者。

例子:

请添加图片描述

请添加图片描述

基本操作的实现

单链表的初始化:

构造一个如图的空表

算法思路:

(1)生成新结点作为头结点 ,用头指针L指向头结点

(2)将头结点的指针域置空

请添加图片描述

判断链表是否为空:

算法思路:判断头结点指针域是否为空

单链表的销毁:

算法思路:从头指针开始,依次释放所有结点
请添加图片描述
请添加图片描述

单链表的清空:

与链表的校徽不同,清空链表后链表仍然存在,只不过链表中没有元素、成为空链表。

算法思路:依次释放所有结点,并将头结点指针域置空

请添加图片描述

注意点:由于单链表的清空不能把头结点删去,所以在链表结点的删除操作上比单链表的销毁更为复杂。

求单链表表长

算法思路:从首元结点开始,依次计数所有结点。

请添加图片描述
请添加图片描述

单链表的取值:(取单链表中的第i个元素)

算法步骤:

1、从第一个结点(L->next)顺链扫描,用指针 p 指向当前扫描到的结点,p 处置 p=L->next

2、j 做计数器,累计当前扫描过的结点数,j 初始值为1。

3、当 p 指向扫描到的下一个结点时,计数器 j+1。

4、当 j==i 时,p所指的结点就是要找的第 i 个结点。

请添加图片描述

单链表的查找:

算法步骤:

1、从第一个结点起,依次和e相比较

2、如果找到一个其值与e相等的数据元素,则返回其在链表中的位置或这地址

3、如果查遍整个链表都没有找到其值和e相等的元素,则返回0或者NULL

① 按数值查找——返回值

请添加图片描述

② 按数值查找——返回序号

请添加图片描述

前后两者的差别是:

按数据内容查找增加了j的初始化并增加了j++记数功能、返回值变化。这些都只是在按数据内容查找的基础上增加了序号,本质没变。

单链表的插入:

算法步骤:

1、首先找到a(i-1)的存储位置p

2、生成一个数据域为e的新结点s

3、插入新结点:

请添加图片描述

① 新结点的指针域指向结点a(i)

s -> next = p -> next

② 结点a(i-1)的指针域指向新结点

p -> next = s

思考:① ② 两步可以直接交换吗?

不可以,因为先将a(i-1)指向s会导致p->next不能达到指向a(i)的效果,如果硬是要这样做,要多用一个指针指向a(i)

请添加图片描述

关于代码第83行 p=L 而不是 p=L->next 的解释:因为删除的结点有可能是就是第一个结点,指向Lnext会导致第一个结点无法删除。

单链表的删除:

算法步骤:

1、首先找到 a(i) 的存储位置p,保存要删除的 a(i) 的值

2、令p->next 指向 a(i+1)

3、释放结点空间

请添加图片描述

请添加图片描述

建立单链表:

头插法:元素插在链表的前部

请添加图片描述

请添加图片描述

尾插法:元素插在链表的尾部

请添加图片描述

总结

总结1:常用指针操作

指向头结点:p=L

指向首元结点:s=L->next

指向下一个结点:p=p->next

总结2:各操作时间效率分析:

查找:O(n)

插入和删除:O(n)

头插法/尾插法:O(n)

循环链表

定义:

头尾相接的链表,即表中最后一个结点的指针指向头结点,整个链表形成一个环。

优点:从表中任何一个结点出发均可以找到其它结点。

循环条件:

循环链表中没有空指针,其终止条件判断为p或者p->next是否等于头指针

p!=NuLLp!=L
p->next!=NULLp->next!=L
单链表单循环链表

基本操作的实现

带尾指针循环链表的合并(将Tb合并在Ta之后)

请添加图片描述

算法步骤:

1、p存表头节点 p=Ta->next

2、Tb表头连接到Ta表尾 Ta->next=Tb->next->next

3、释放Tb表头结点 delete Tb->next

4、修改Tb尾指针 Tb->next=Ta

请添加图片描述

双向链表

定义:

在单链表的每个结点里面再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链。

请添加图片描述

优点:方便查找前驱结点

双向链表结构定义:

请添加图片描述

对称性:p->prior->next = p = p->next->prior

基本操作实现

双向链表的插入:

请添加图片描述

请添加图片描述

双向链表的删除:

请添加图片描述

请添加图片描述

单链表、循环链表和双向链表的时间效率比较:

请添加图片描述

(1)查找表头几种链表时间复杂度相同。

(2)查找表尾结点使用循环链表时间复杂度小。

(3)查找前驱结点用双向循环链表时间复杂度最小。

顺序与链式比较

链式存储结构

优点:

① 结点空间可以动态申请和释放;

② 插入和删除操作时不需要移动大量元素;

缺点;

① 存储密度小,每个结点的指针域需额外占用存储空间;

② 是非随机存取结构,对任意一个结点的操作都要从头开始操作;

请添加图片描述

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

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

相关文章

Kafka消息中间件(Kafka与MQTT区别)

文章目录KafkaKafka重要原理Topic 主题Partition 分区Producer 生产者Consumer 消费者Broker 中间件Offset 偏移量Kafka与mqtt区别Kafka Kafka是一个分布式流处理平台,它可以快速地处理大量的数据流。Kafka的核心原理是基于发布/订阅模式的消息队列。Kafka允许多个…

C++基础——C++面向对象之重载与多态基础总结(函数重载、运算符重载、多态的使用)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

MySQL8.0.16存储过程比5.7.22性能大幅下降

MySQL8.0.16存储过程比5.7.22性能大幅下降 1、背景 从5.7.22迁移数据库到8.0.16,发现存储过程执行性能大幅下降。原来在5版本上执行只需要3-5秒,到8版本上居然要达到上万秒。 5版本: call Calculation_Week() OK 时间: 3.122s 8版本&#x…

移动通信(16)信号检测

常见的信号检测算法一般包括以下几类检测算法:最优、线性和非线性。最优检测算法:最大似然算法线性检测算法:迫零检测算法和最小均方误差检测算法非线性检测算法:串行干扰消除检测算法球形译码检测算法属于一种次优检测算法&#…

凤凰游攻略

凤凰游攻略1 装备📦1.1 证件1.2 日常用品1.3 药品1.4 衣物1.5 洗漱用品2 交通🚗3 住宿🏠4 美食🍕5 拍照📷5.1 租苗族服5.1.1 单租服装5.1.2 服装化妆5.2 一条龙旅拍6 路线🗺️景点🏙️7 注意⚠️…

计算机网络的166个概念你知道几个 第十二部分

计算机网络安全安全通信的四大要素:机密性、保温完整性、端点鉴别和运行安全性。机密性:报文需要在一定程度上进行加密,用来防止窃听者截取报文。报文完整性:在报文传输过程中,需要确保报文的内容不会发生改变。端点鉴…

java StringBuilder 和 StringBuffer 万字详解(深度讲解)

StringBuffer类介绍和溯源StringBuffer类常用构造器和常用方法StringBuffer类 VS String类(重要)二者的本质区别(含内存图解)二者的相互转化StringBuilder类介绍和溯源StringBuilder类常用构造器和常用方法String类,St…

0308java基础-注解,反射

一,注解 1.什么是注解: Annotation是从jdk5.0开始引入的新技术作用: 不是程序本身,可以对程序作出解释可以被其他程序读取格式: 以注释名在代码中存在,还可以添加一些参数值SuppressWarnings(value"…

0103 MySQL06

1.事务 1.一个事务其实就是一个完整的业务逻辑 如:转账,从A账户向B账户转账10000,将A账户的钱减去10000(update),将B账户的钱加上10000(update),这就是一个完整的业务逻…

【Mybatis】| 如何创建MyBatis的工具类

目录🌟更多专栏请点击👇一、前言二、实现过程1. 创建一个ThreadLocal对象2. 初始化SqlSessionFactory3. 获取并存储sqlSession对象4. 关闭sqlSession对象三、 总代码🌟更多专栏请点击👇 专栏名字🔥Elasticsearch专栏e…

向2022年度商界木兰上榜女性致敬!

目录 信息来源: 2022年度商界木兰名单 简介 评选标准 动态 榜单 为你心中的2023商界女神投上一票 信息来源: 2022年度商界木兰榜公布 华为孟晚舟获商界木兰最高分 - 脉脉 【最具影响力女性】历届商界木兰榜单 中国最具影响力的30位商界女性名单…

基于Vue+Vue-cli+webpack搭建渐进式高可维护性前端实战项目

本文是专栏《手把手带你做一套毕业设计毕业设计》的实战第一篇,将从Vue脚手架安装开始,逐步带你搭建起一套管理系统所需的架构。当然,在默认安装完成之后,会对文件目录进行初步的细化拆分,以便后续功能迭代和维护所用。…

经典100道mysql的面试题

100道mysql的面试题 目录100道mysql的面试题1. MySQL 索引使用有哪些注意事项呢?索引哪些情况会失效索引不适合哪些场景索引的一些潜规则2. MySQL 遇到过死锁问题吗,你是如何解决的?3. 日常工作中你是怎么优化SQL的?4. 说说分库与…

字体反爬慢慢总结破解方式

什么是字体反爬 网页开发者自己创造一种字体,因为在字体中每个汉字都有其代号,那么以后再网页中不会直接显示这个文字的效果。而是显示其代号,因此即使获取了网页的文本内容。也只是获取到文字的代号,而不是文字本身。 简单来说&…

逻辑优化基础-shannon decomposition

1. 简介 在逻辑综合中,香农分解(Shannon decomposition)是一种常用的布尔函数分解方法。它将一个布尔函数分解为两个子函数的和,其中每个子函数包含一个布尔变量的取反和非取反的部分。 具体来说,假设对于一个布尔函…

Mysql 索引特点

承接上文Mysql Server原理简介聚簇索引、二级索引、联合索引分别具备什么样的特点?聚簇索引数据跟索引放在一起的叫聚簇索引;数据和索引分开存储的叫非聚簇索引;innodb存储引擎,数据和文件都放在ibd文件中,实际的数据是…

在教学中常被问到的几个vue3.x与typescript的问题,统一解答

在教学当中,学生在学习vue3.x时,常常会问到typescript和vue3.x之间的关系,感觉这两个技术总是绑在一起的,下面老赵来统一解答一下: 那学vue3.x,为什么要求也要掌握typescript Vue 3.x是一个使用TypeScript编…

「ML 实践篇」机器学习项目落地

文章目录1. 项目分析1. 框架问题2. 性能指标2. 获取数据1. 准备工作区2. 下载数据3. 查看数据4. 创建测试集3. 数据探索1. 地理位置可视化2. 寻找相关性3. 组合属性4. 数据准备1. 数据清理2. Scikit-Learn 的设计3. 处理文本、分类属性4. 自定义转换器5. 特征缩放6. 流水线5. 选…

Linux入门介绍及Linux文件与目录结构

前言 本文小新为大家带来 Linux 入门介绍及Linux 文件与目录结构 相关知识,具体内容包括Linux入门介绍(包括:Linux概述,Linux与Windows区别,CentOS 下载地址),Linux文件与目录结构等进行详尽介绍…

实验7 图像水印

本次实验大部分素材来源于山大王成优老师的讲义以及冈萨雷斯(MATLAB版),仅作个人学习笔记使用,禁止用作商业目的。 文章目录一、实验目的二、实验例题1. 数字图像水印技术2. 可见水印的嵌入3. 不可见脆弱水印4. 不可见鲁棒水印一、…