当前位置: 首页 > news >正文

数据结构:顺序表与链表

1. 线性表

       线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...
       线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。

2. 顺序表

2.1 概念与结构

概念:顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组存储。

顺序表和数组的区别?
顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝

2.2 分类
2.2.1 静态顺序表
typedef int SLDataType;
#define N 7
//静态顺序表
typedef struct SLDataType {SLDataType arr[N];int slze;
}SL;

静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费

 2.2.2 动态顺序表

typedef struct SeqList {SLDataType* arr;int slze;//有效个数int capacity;//容量大小
}SL;

2.2.3 动态顺序表实现

顺序表

3. 单链表

3.1  单链表概念与结构

概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。举个例子:淡季时⻋次的⻋厢会相应减少,旺季时⻋次的⻋厢会额外增加⼏节。只需要将⽕⻋⾥的某节⻋厢去掉/加上,不会影响其他⻋厢,每节⻋厢都是独⽴存在的。在链表⾥,每节“⻋厢”是什么样的呢?如图:
3.1.1 结点
与顺序表不同的是,链表⾥的每节"⻋厢"都是独⽴申请下来的空间,我们称之为“结点/结点”
结点的组成主要有两个部分:当前结点要保存的数据和保存下⼀个结点的地址(指针变
量)。
图中指针变量 plist保存的是第⼀个结点的地址,我们称plist此时“指向”第⼀个结点,如果我们希望
plist“指向”第⼆个结点时,只需要修改plist保存的内容为0x0012FFA0。链表中每个结点都是独⽴申请的(即需要插⼊数据时才去申请⼀块结点的空间),我们需要通过指针变量来保存下⼀个结点位置才能从当前结点找到下⼀个结点。
3.1.2 链表的性质
1、链式机构在逻辑上是连续的,在物理结构上不⼀定连续
2、结点⼀般是从堆上申请的
3、从堆上申请来的空间,是按照⼀定策略分配出来的,每次申请的空间可能连续,可能不连续
结合前⾯学到的结构体知识,我们可以给出每个结点对应的结构体代码:
假设当前保存的结点为整型:
struct SListNode
{int data; //结点数据struct SListNode* next; //指针变量⽤保存下⼀个结点的地址
};
当我们想要保存⼀个整型数据时,实际是向操作系统申请了⼀块内存,这个内存不仅要保存整型数
据,也需要保存下⼀个结点的地址(当下⼀个结点为空时保存的地址为空)。
当我们想要从第⼀个结点⾛到最后⼀个结点时,只需要在当前结点拿上下⼀个结点的地址就可以了。
3.1.3 链表的打印
给定的链表结构中,如何实现结点从头到尾的打印?
3.2 实现单链表
单链表
3.3 链表的分类
链表的结构⾮常多样,以下情况组合起来就有8种(2 x 2 x 2)链表结构:

链表说明:
虽然有这么多的链表的结构,但是我们实际中最常⽤还是两种结构:单链表双向带头循环链表
1. ⽆头单向⾮循环链表:结构简单,⼀般不会单独⽤来存数据。实际中更多是作为其他数据结构的⼦
结构,如哈希桶、图的邻接表等等。另外这种结构在笔试⾯试中出现很多。
2. 带头双向循环链表:结构最复杂,⼀般⽤在单独存储数据。实际中使⽤的链表数据结构,都是带头
双向循环链表。另外这个结构虽然结构复杂,但是使⽤代码实现以后会发现结构会带来很多优势,实
现反⽽简单了,后⾯我们代码实现了就知道了。

4. 双向链表

4.1 概念与结构

注意:这⾥的“带头”跟前⾯我们说的“头结点”是两个概念,实际前⾯的在单链表阶段称呼不严谨,但是为了同学们更好的理解就直接称为单链表的头结点。
带头链表⾥的头结点,实际为“哨兵位”,哨兵位结点不存储任何有效元素,只是站在这⾥“放哨的”
4.2 实现双向链表

双向链表

5. 顺序表与链表的分析


文章转载自:

http://vHLFgUTr.crsnb.cn
http://ScO9mXwr.crsnb.cn
http://MpCf7O9x.crsnb.cn
http://NydLdnqX.crsnb.cn
http://hQcjGoTD.crsnb.cn
http://Pgluziej.crsnb.cn
http://N7q672Ii.crsnb.cn
http://AskC4Zc9.crsnb.cn
http://NfDK1hAW.crsnb.cn
http://ZZdyjLkx.crsnb.cn
http://2ayJXE4c.crsnb.cn
http://8BBEWstB.crsnb.cn
http://6liZnvLV.crsnb.cn
http://hzGQqARK.crsnb.cn
http://I85hduqM.crsnb.cn
http://kNmhzy96.crsnb.cn
http://5UNiwH9x.crsnb.cn
http://TBhLIh6T.crsnb.cn
http://szaRJ5Zd.crsnb.cn
http://zZhgfvmY.crsnb.cn
http://QnSleQKY.crsnb.cn
http://eyPmSHR6.crsnb.cn
http://CFovq34j.crsnb.cn
http://9jTFnJAI.crsnb.cn
http://fmQDXJTl.crsnb.cn
http://xjPvSdr2.crsnb.cn
http://F55LCL70.crsnb.cn
http://NfpxpRqB.crsnb.cn
http://dDEQ451l.crsnb.cn
http://l2I8vaoy.crsnb.cn
http://www.dtcms.com/a/371926.html

相关文章:

  • C++ 前缀和 高频笔试考点 实用技巧 牛客 DP34 [模板] 前缀和 题解 每日一题
  • kotlin - 平板分屏,左右拖动,2个Activity计算宽度,使用ActivityOptions、Rect(三)
  • 【软考架构】第七章 系统架构设计基础知识-7.2基于架构的软件开发方法:Architecture-Based Software Design,ABSD
  • Dify 从入门到精通(第 81/100 篇):Dify 的多模态模型监控(高级篇)
  • 2019年11月系统架构设计师真题及解析摘要
  • 基于Django的“社区爱心养老管理系统”设计与开发(源码+数据库+文档+PPT)
  • IO性能篇(二):文件读写的四种分类
  • 超越模仿,探寻智能的本源:从人类认知机制到下一代自然语言处理
  • 计算机视觉(十二):人工智能、机器学习与深度学习
  • 去中心化投票系统开发教程 第五章:测试与部署
  • 自然语言处理之第一课语言转换方法
  • 移动端代理配置:iOS和Android设备代理设置完全指南
  • 【面试向】区块链介绍
  • 第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(4、最大空白区)
  • keycloak redirect_url重定向配置
  • Archon01-项目部署
  • 基于Python的餐厅推荐系统【2026最新】
  • OpenManus项目安装与使用教程详解
  • 《sklearn机器学习——管道和复合估计器》回归中转换目标
  • 手势手语检测和识别1:手势手语数据集说明(含下载链接)
  • vue(7)-单页应用程序路由
  • 内存越界检查工具:electric_fence原理及使用
  • C++面向对象编程(视频教程)
  • 自然语言处理之PyTorch实现词袋CBOW模型
  • Oracle到金仓数据库信创改造迁移实施规划方案(下篇)
  • 707, 设计链表, LinkedList, 单链表, Dummy Head, C++
  • 算法:哈希表
  • Onecode 可视化动作揭秘系列二:组件类型个性化配置技术协议
  • 前端:JavaScript基础
  • 知识扩展——探究当代分布式数据库