数据结构第1章 线性表

news2024/11/27 6:32:23

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波·莫听穿林打叶声》
本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

目录

    • 0、思维导图
    • 线性表
    • 1、顺序存储
      • 1)顺序表
      • 2)顺序表的分类
    • 2、链式存储
      • 1)单链表
      • 2)双链表
      • 3)头节点和首元节点
    • 3、顺序表 vs 链表
      • 1)顺序表 胜
      • 2)链表 胜
      • 3)表格对比
    • 4、伪链表

0、思维导图

在这里插入图片描述

线性表

线性表是由相同类型的数据元素构成的有序序列

特点:

  • 有序性:元素之间是有序排列的。
  • 元素类型相同:所有元素类型必须相同

线性表可以用数学公式表示为: L = ( a 1 , a 2 , . . . , a n ) L = (a_1, a_2, ..., a_n) L=(a1,a2,...,an),其中 a i a_i ai 是表中的第 i i i 个元素。
根据使用的存储结构不同,可以将线性表分为顺序表链表

1、顺序存储

1)顺序表

在这里插入图片描述
在顺序表中,数据元素存储在连续的存储单元中。顺序表的特点包括:

  • 连续存储:所有元素在内存中占据连续的位置。
  • 随机访问:可以直接通过索引快速访问任何一个元素。
  • 存储密度高:不需要额外的存储空间来存储节点间的关系。

顺序表的表示可以是: [ a 1 , a 2 , . . . , a n ] [a_1, a_2, ..., a_n] [a1,a2,...,an],其中元素的物理存储顺序与逻辑顺序相同

2)顺序表的分类

顺序表分为静态顺序表和动态顺序表。

  • 静态顺序表:使用定长数组存储元素。(顺序表大小固定)
    特点:

    1. 固定大小:创建后最大容量固定。
    2. 连续存储:元素在内存中连续存储。
    3. 效率高:内存分配和管理相对简单,访问元素的时间复杂度为 (O(1))。
    4. 空间限制:不够灵活,一旦分配的空间不足或过多,都会产生问题:不足时无法添加更多的元素,过多时会造成内存浪费。
  • 动态顺序表:使用动态开辟的数组存储元素。(可以动态地调整顺序表的大小)
    特点:

    1. 动态扩容:当元素数量超过当前容量时,动态顺序表可以扩大其存储空间来容纳更多元素。
    2. 空间灵活:动态顺序表能更有效地利用内存,它能根据需要调整存储容量。
    3. 效率问题:普通操作(如访问特定元素)仍然保持 (O(1)) 的时间复杂度,但插入和删除操作(尤其是在表头或中间)可能由于动态扩容而导致额外的开销。

2、链式存储

链表 (Linked List)

在这里插入图片描述

链表也是线性表的一种实现方式,但其存储方式与顺序表不同。链表中的元素在内存中不一定连续存储每个元素节点通常包含两部分:一部分存储数据元素,另一部分存储指向下一个元素的指针(或引用)。

在这里插入图片描述

特点:

  • 非连续存储:元素可以分散在内存的任何地方,节点之间通过指针连接。
  • 动态大小:链表的大小可以在运行时动态变化,易于插入和删除操作。
  • 存储开销:每个元素节点需要额外存储指向下一个节点的指针,因此相比顺序表有更高的存储开销。

简单表示: a 1 → a 2 → . . . → a n a_1 \rightarrow a_2 \rightarrow ... \rightarrow a_n a1a2...an,其中每个箭头代表一个指向下一个节点的指针。

1)单链表

①概念

单链表 (Singly Linked List)

单链表是一种基础的数据结构,由一系列节点(Node)组成,每个节点包含两部分:一部分用于存储数据(数据域),另一部分用于存储指向下一个节点的指针(指针域)。

②特点

  1. 线性结构:单链表是一种线性结构,其中的元素(节点)按照序列排列。
  2. 动态大小:与数组不同,单链表的大小是动态的,可以在运行时添加或删除节点。
  3. 高效的插入和删除:在已知节点的情况下,单链表可以在 O ( 1 ) O(1) O(1) 时间复杂度内进行节点的插入和删除操作。
  4. 顺序访问:访问单链表中的元素需要从表头开始,按顺序遍历,因此访问任意位置的元素的时间复杂度为 O ( n ) O(n) O(n)
  5. 内存利用:每个节点只存储一个指向下一个节点的指针,相较于双链表,它节省了内存空间。

③节点结构
单链表的节点结构可以用以下 C 语言结构体表示:

typedef struct Node {
    int data; // 数据域
    struct Node* next; // 指针域,指向下一个节点
} Node;

在这里插入图片描述

单链表通常有一个头指针(head),指向链表的第一个节点。如果链表为空,则头指针为 NULL。单链表的简单表示如下:

head → a 1 → a 2 → . . . → a n → NULL \text{head} \rightarrow a_1 \rightarrow a_2 \rightarrow ... \rightarrow a_n \rightarrow \text{NULL} heada1a2...anNULL

在这里,每个箭头表示一个节点指向下一个节点的指针。由于单链表的节点只包含指向下一个节点的指针,因此它只能从头部开始按顺序遍历。

④单链表的常见类型

  • 循环

在这里插入图片描述

  • 不循环

    在这里插入图片描述

2)双链表

①双链表的概念理解

双链表 (Doubly Linked List)

双链表是链表的一种形式,在双链表中,每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针。这种结构使得双链表具有以下特点:

  1. 双向遍历:可以从表头到表尾,也可以从表尾到表头进行遍历。
  2. 插入和删除效率高:相比单链表,双链表可以更方便地进行节点的插入和删除,因为可以直接访问前驱和后继节点。
  3. 额外的内存开销:每个节点需要额外存储一个指向前驱节点的指针,因此相比单链表,双链表占用更多的内存空间。
  4. 更灵活的操作:由于可以直接访问任一节点的前驱和后继,双链表在某些操作上更加灵活,比如在双向遍历和逆序输出等场景中表现更优。

②双链表的节点结构

双链表的节点结构通常包含三个部分:数据域(存储数据)、前驱指针(指向前一个节点)和后继指针(指向下一个节点)。
在这里插入图片描述

③双链表的简单表示

a 1 ⇆ a 2 ⇆ . . . ⇆ a n a_1 \leftrightarrows a_2 \leftrightarrows ... \leftrightarrows a_n a1a2...an

其中,每个双箭头 ⇆ \leftrightarrows 表示节点间的双向连接。

④双链表的常见类型

  • 循环(双循环链表)

    在这里插入图片描述

  • 不循环(非循环双链表)

    在这里插入图片描述

3)头节点和首元节点

①头节点

1️⃣头节点的位置
头节点一般位于第一个元素之前

2️⃣头节点的特点
头节点的next指针域指向首元节点,数据域一般为空,或者存储的是链表的长度

注✔:头节点不是链表必要要素,但头指针是链表的必要元素,无论链表是否为空,头指针均不为空,因为没有头指针,我们就没有办法知道链表的起始位置。

3️⃣带头节点的作用与好处

  • 可以简化链表的插入和删除操作,不需要对第一个节点和最后一个节点进行特殊处理 。
  • 可以避免空链表的出现,因为头结点是链表的标志,只要链表存在,头结点就不为空。
  • 获取链表的长度方便,只需要遍历从头结点开始的所有结点即可 。
  • 可以实现一些特殊的功能,比如循环链表,只需要让头结点的指针域指向自己或者第一个结点即可。

②首元结点

  • 链表的第一个元素结点(有实在意义的结点)

3、顺序表 vs 链表

1)顺序表 胜

①针对情况

选择顺序存储结构存储元素的情况一般为:

  • 元素个数固定
  • 需频繁地随机访问任意位置的元素

②优缺点

1️⃣优点

  • 存储密度高,每个元素只需要存储数据本身,不需要额外的指针域。
  • 存取速度快,可以通过下标直接访问任意位置的元素,时间复杂度为O(1)。

2️⃣缺点

  • 存储空间不灵活,需要提前分配一块连续的空间,如果空间不够或者过多,都会造成空间浪费或者溢出。
  • 插入和删除操作复杂,需要移动大量的元素,时间复杂度为O(n)。

2)链表 胜

①针对情况

选择链式存储结构存储元素的情况一般为:

  • 元素个数是动态变化的

  • 需要频繁地在任意位置插入或删除元素

②优缺点

1️⃣优点

  • 存储空间灵活,每个元素可以动态分配空间,不需要提前预留空间。
  • 插入和删除操作简单,只需要修改相邻元素的指针域,时间复杂度为O(1)。

2️⃣缺点

  • 存储密度低,每个元素除了存储数据本身,还需要额外的指针域。
  • 存取速度慢,不能直接访问任意位置的元素,需要从头结点开始遍历链表,时间复杂度为O(n)。

3)表格对比

在这里插入图片描述

4、伪链表

一种类似于链表的数据结构,却不完全遵循标准链表的行为或实现方式。在标准链表中,每个元素(通常称为节点)包含数据和指向列表中下一个(有时是前一个)元素的引用。

每个元素由两部分组成:

  • 存储的数据
  • 下一个元素在数组中的索引。

这种结构使得元素间可以像链表一样链接,但实际上是通过数组索引来实现的

例如:静态链表

在这里插入图片描述

上述内容笔记部分图片来源网络,侵删。
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
点赞加关注,收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!

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

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

相关文章

自定义html5中日期选取器的样式

自定义html5中日期选取器的样式 1. 前言1.1 关于 h5 的新特性1.2 使用浏览器 2. html5中日期选取器默认样式3. 自定义日期样式3.1 简单定义3.2 花式样式定义 4. 改变日期格式5. 参考6. 关于低版本浏览器隐藏小三角 1. 前言 1.1 关于 h5 的新特性 可看下面的文章 HTML5 新特性之…

算法基础之能被整除的数

能被整除的数 核心思想&#xff1a; 容斥原理 总面积 1-23-4…. 总集合元素中个数 1-23-4…. #include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N 20;typedef long long LL;int p[N];int main(){int n,m;cin&…

L1-075:强迫症

题目描述 小强在统计一个小区里居民的出生年月&#xff0c;但是发现大家填写的生日格式不统一&#xff0c;例如有的人写 199808&#xff0c;有的人只写 9808。有强迫症的小强请你写个程序&#xff0c;把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位…

Qt重载事件

重载event 事件类型 (EventType) 事件类型是 QEvent 类的一个枚举 &#xff0c;包含了 Qt 能够处理的所有不同类型的事件。这个枚举包括但不限于以下常见类型&#xff1a; QEvent::MouseButtonPress: 鼠标按钮按下事件。QEvent::MouseButtonRelease: 鼠标按钮释放事件。Q…

BikeDNA(三) OSM数据的内在分析2

BikeDNA&#xff08;三&#xff09; OSM数据的内在分析2 1.数据完整性 见上一篇BikeDNA&#xff08;二&#xff09; OSM数据的内在分析1 2.OSM标签分析 见上一篇BikeDNA&#xff08;二&#xff09; OSM数据的内在分析1 3.网络拓扑结构 本节探讨数据的几何和拓扑特征。 例…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷②

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第2套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第2套&#xff09; 模块…

基于grpc从零开始搭建一个准生产分布式应用(8) - 01 - 附:GRPC公共库源码

开始前必读&#xff1a;​​基于grpc从零开始搭建一个准生产分布式应用(0) - quickStart​​ common包中的源码&#xff0c;因后续要用所以一次性全建好了。 一、common工程完整结构 二、引入依赖包 <?xml version"1.0" encoding"UTF-8"?> <p…

【Pytorch】Pytorch或者CUDA版本不符合问题解决与分析

NVIDIA CUDA Toolkit Release Notes Package installation issues INSTALL PYTORCH 先声毒人&#xff1a;最好资料就是上面三份资料&#xff0c;可以通过官网明确的获取一手信息&#xff0c;你所遇到的99%的问题都可以找到&#xff0c;明确的解决方案&#xff0c;建议最好看…

2024主流的免费电脑数据恢复软件EasyRecovery

EasyRecovery绿色版是一款非常专业的电脑数据恢复工具。它可以全面恢复删除丢失数据&#xff0c;能对电脑误删文件恢复、格式化硬盘数据恢复、手机U盘数据恢复等&#xff0c;能恢复包括文档、表格、图片、音视频等各种文件&#xff0c;此版本经过处理&#xff0c;可永久免费使用…

[ffmpeg系列 02] 音视频基本知识

一 视频 RGB&#xff1a; AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB… Y&#xff1a;明亮度, Luminance或luma, 灰阶图&#xff0c; UV&#xff1a;色度&#xff0c;Chrominance或Chroma。 YCbCr: Cb蓝色分量&#xff0c;Cr是红色分量。 取值范围&#xff…

【索引的数据结构】第1章节:B+Tree存储结构

目录结构 之前整篇文章太长&#xff0c;阅读体验不好&#xff0c;将其拆分为几个子篇章。 本篇章讲解 BTree 存储结构。 什么是索引 可以简单理解为索引好比一本书的目录&#xff0c;通过目录我们可以快速定位到我们要查看的章节。 MySQL 中的数据同样也是根据索引分类&…

ROS TF坐标变换 - 位姿描述与消息类型

目录 一、位姿描述二、位姿相关消息体类型2.1 geometry_msgs/TransformStamped2.2 geometry_msgs/PoseStamped 在机器人系统中&#xff0c;有许多运动机构和传感器&#xff0c;为了描述他们之间的相对位姿关系&#xff0c;分别为他们定义了各自的坐标系&#xff0c;通过坐标系转…

合伙企业法关于合伙企业的要求

合伙协议可以载明合伙企业的经营期限和合伙人争议的解决方式。 合伙协议经全体合伙人签名、盖章后生效。合伙人依照合伙协议享有权利&#xff0c;承担责任。 经全体合伙人协商一致&#xff0c;可以修改或者补充合伙协议。 申请合伙企业设立登记&#xff0c;应当向企业登记机关提…

B2005 字符三角形(python)

a input() print( a) print( a a a) print(a a a a a)python中默认输入的是字符型&#xff0c;第一句就是输入了一个字符赋给a python中单引号内的也是字符串&#xff0c;用print输出需要连接的字符串时用加号加在后面即可

Spring通信传参的方法

Spring通信传参的方法 目录概述需求&#xff1a; 设计思路实现思路分析1.简单参数传递2.复合参数3.动态参数 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better resul…

爬虫基础一(持续更新)

爬虫概念&#xff1a; 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;然后让其去互联网上抓取数据的过程 分类&#xff1a; 1&#xff0c;通用爬虫&#xff1a;抓取一整张页面数据 2&#xff0c;聚焦爬虫&#xff1a;抓取页面中的局部内容 3&#xff0c;增量式爬虫&…

消息中间件常见知识点

一&#xff1a;消息队列的主要作用是什么&#xff1f; 1.消息队列的特性&#xff1a; 业务无关&#xff0c;一个具有普适性质的消息队列组件不需要考虑上层的业务模型&#xff0c;只做好消息的分发就可以了&#xff0c;上层业务的不同模块反而需要依赖消息队列所定义的规范进行…

JVM篇:JVM的简介

JVM简介 JVM全称为Java Virtual Machine&#xff0c;翻译过来就是java虚拟机&#xff0c;Java程序&#xff08;Java二进制字节码&#xff09;的运行环境 JVM的优点&#xff1a; Java最大的一个优点是&#xff0c;一次编写&#xff0c;到处运行。之所以能够实现这个功能就是依…

go语言语法基础

文章目录 前言一、输入和输出常用的字符串格式化符号 二、注释三、Go常用基本语言数据类型数字类型布尔类型字符类型变量与常量数组和切片数组切片 map类型创建map增删改查特别提醒 指针 四、运算符五、条件判断语句if系列switch六、循环语句for循环标准写法死循环while循环do …

java设计模式学习之【观察者模式】

文章目录 引言观察者模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用观察者示例代码地址 引言 想象你在一个在线拍卖会上竞标一件珍贵的艺术品。每当有人出价更高&#xff0c;系统都会立即通知你。这个实时更新机制使你可以做出快速反应。这种模式&#x…