线性表(顺序表,单链表,双链表,循环链表,静态链表)

目录

  • 1.线性表的定义
    • 1.几个重要的概念
    • 2.逻辑结构
  • 2.线性表的基本操作
  • 3.顺序表(线性表的顺序存储)
    • 1.静态分配
    • 2.动态分配
    • 3.顺序表的特点
    • 4.顺序表的基本操作
      • 1.插入
      • 2.删除
      • 3.查找
        • 1.按位查找
        • 2.按值查找
  • 4.链表(线性表的链式存储)
    • 1.单链表
      • 1.代码实现
      • 2.带头结点的实现
      • 3.不带头结点的实现
      • 4.按位序插入
      • 5.指定结点的后插操作
      • 6.指定结点的前插操作
      • 7.按位序删除
      • 8.指定结点的删除
      • 9.按位查找
      • 10.按值查找
      • 11.求表的长度
    • 2.单链表的建立
      • 1.尾插法
      • 2.头插法
    • 3.双链表
      • 1.初始化
      • 2.插入
      • 3.删除
      • 4.遍历
    • 4.循环链表
      • 1.循环单链表
        • 1.初始化
        • 2.基本操作
      • 2.循环双链表
        • 1.初始化
        • 2.基本操作
    • 5.静态链表
      • 1.定义
      • 2.代码实现
      • 3.基本操作
  • 5.顺序表和链表的对比
    • 1.逻辑结构
    • 2.存储结构
    • 3.基本操作
      • 1.创建
      • 2.销毁
      • 3.增删
      • 4.查找
    • 4.选择

1.线性表的定义

线性表是具有相同数据类型的n (n>=0)个数据元素的有限序列,其中n为表长,当n = 0时线性表是一个空表。
若用L命名线性表,则其一般表示为 L = ( a 1 , a 2 , . . . , a i , a i + 1 , . . . , a n ) L= (a1, a2,... , a_i, a_{i+1}, ... , an) L=(a1,a2,...,ai,ai+1,...,an)

1.几个重要的概念

a i a_i ai是线性表中的“第i个”元素线性表中的位序
注意:位序从1开始,数组下标从0开始。
a 1 a_1 a1表头元素;
a n a_n an表尾元素
除第一个元素外,每个元素有且仅有一个直接前驱;
除最后一个元素外,每个元素有且仅有一个直接后继.

2.逻辑结构

在这里插入图片描述

2.线性表的基本操作

“&”符号的作用:对参数的修改结果带回主函数

①InitList(&L):初始化表。构造一个空的线性表L,分配内存空间
②DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
③ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e.
④ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
⑤LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。
⑥GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。
⑦Length(L):求表长。返回线性表L的长度,即L中数据元素的个数。
⑧PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
⑨Empty(L):判空操作。若L为空表,则返回true,否则返回false。

3.顺序表(线性表的顺序存储)

顺序表:用顺序存储的方式实现线性表。
顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
顺序表的实现方式:静态分配和动态分配。

1.静态分配

存储空间是静态的。
使用“静态数组”实现,大小一旦确定就无法改变。

在这里插入图片描述

2.动态分配

C语言中提供malloc和free函数来动态申请和释放内存空间。
使用动态数组实现。
在这里插入图片描述

3.顺序表的特点

随机访问,即可以在(O1)时间内找到第i个元素。
②存储密度高,每个节点只存储数据元素。
③拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
④插入、删除操作不方便,需要移动大量元素。

4.顺序表的基本操作

1.插入

在这里插入图片描述

①最好情况:新元素插入到表尾,不需要移动元素。
i = n + 1 i = n+1 i=n+1,循环0次;最好时间复杂度=O(1)
②最坏情况:新元素插入到表头,需要将原有的n个元素全都向后移动。
i = 1 i = 1 i=1,循环n次;最坏时间复杂度= O(n);
③平均情况:假设新元素插入到任何一个位置的概率相同,
i = 1 , 2 , 3 , . . , l e n g t h + 1 的概率都是 p = 1 n + 1 i=1,2,3,.. , length+1的概率都是p=\frac{1}{n+1} i=1,2,3,..,length+1的概率都是p=n+11
平均循环次数= n ( n + 1 ) 2 1 n + 1 = n 2 \frac{n(n+1)}{2}\frac{1}{n+1}=\frac{n}{2} 2n(n+1)n+11=2n平均时间复杂度= O(n)

2.删除

在这里插入图片描述

①最好情况:删除表尾元素,不需要移动其他元素。
i = n,循环0次;最好时间复杂度=O(1)
②最坏情况:删除表头元素,需要将后续的n-1个元素全都向前移动。
i = 1,循环n-1 次;最坏时间复杂度= O(n);
③平均情况:假设删除任何一个元素的概率相同,即 i = 1 , 2 , 3 , . . . , l e n g t h i= 1,2,3,... , length i=1,2,3,...,length的概率都是 p = 1 n p =\frac{1}{n} p=n1
平均循环次数 = n ( n − 1 ) 2 1 n = n − 1 2 \frac{n(n-1)}{2}\frac{1}{n}=\frac{n-1}{2} 2n(n1)n1=2n1平均时间复杂度= O(n)

3.查找

1.按位查找

GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。
由于顺序表的各个数据元素在内存中连续存放,因此可以根据起始地址和数据元素大小立即找到第i个元素:“随机存取”特性。
时间复杂度为O(1)

2.按值查找

LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。
最好情况:目标元素在表头,循环1次;最好时间复杂度=O(1)
最坏情况:目标元素在表尾,循环n 次;最坏时间复杂度= O(n);
平均情况:假设目标元素出现在任何一个位置的概率相同,都是 1 n \frac{1}{n} n1,平均循环次数= n ( n + 1 ) 2 1 n = n + 1 2 \frac{n(n+1)}{2}\frac{1}{n}=\frac{n+1}{2} 2n(n+1)n1=2n+1
平均时间复杂度= O(n)

4.链表(线性表的链式存储)

1.单链表

单链表由一个一个结点组成,每个结点除了存放数据元素外,还要存储指向下一个节点的指针。
优点:不要求大片连续空间,改变容量方便。
缺点:不可随机存取,要耗费一定空间存放指针。

1.代码实现

强调这是一个单链表:使用 L i n k L i s t LinkList LinkList
强调这是一个结点:使用 L N o d e ∗ LNode * LNode
在这里插入图片描述

2.带头结点的实现

头指针本身不存储数据,数据域为空,只有他指向的下一个结点开始存储数据。
在这里插入图片描述

3.不带头结点的实现

不带头结点,写代码更麻烦。
对第一个数据结点和后续数据结点的处理需要用不同的代码逻辑,对空表和非空表的处理需要用不同的代码逻辑。

4.按位序插入

Listlnsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。
①带头结点
在这里插入图片描述
平均时间复杂度:O(n)
②不带头结点
在这里插入图片描述

5.指定结点的后插操作

在这里插入图片描述

6.指定结点的前插操作

①使用带头指针的链表,循环查找元素的前驱,再对元素前驱进行后插操作。
时间复杂度为O(n)
②将新增结点复制为需要进行前插操作的结点,再将待插入的数据的数据域复制给当前结点,连接两个结点即可。
在这里插入图片描述
时间复杂度为O(1)

7.按位序删除

ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
找到第i-1个结点,将其指针指向第i+1个结点,并释放第i个结点。

①带头结点
在这里插入图片描述
最环、平均时间复杂度:O(n)
最好时间复杂度:O(1)

8.指定结点的删除

删除结点p,需要修改其前驱结点的next指针,
方法1:传入头指针,循环寻找p的前驱结点
方法2:偷天换日(类似于结点前插的实现)
在这里插入图片描述
时间复杂度为O(1),但如果p为最后一个结点时会存在空指针问题

9.按位查找

平均时间复杂度为O(n).

在这里插入图片描述

10.按值查找

平均时间复杂度为:O(n)
在这里插入图片描述

11.求表的长度

平均时间复杂度为:O(n)
在这里插入图片描述

2.单链表的建立

1.尾插法

时间复杂度:O(n)
要设置一个指向表尾结点的指针。

在这里插入图片描述

2.头插法

应用:链表的逆置
在这里插入图片描述

3.双链表

在这里插入图片描述

1.初始化

增加了一个指向前驱的指针域。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.插入

在这里插入图片描述

3.删除

在这里插入图片描述

4.遍历

在这里插入图片描述

双链表不可随机存取,按位查找,按值查找操作都只能用遍历的方式实现。
时间复杂度O(n)

4.循环链表

1.循环单链表

表尾结点的next指针指向头结点。
从一个结点出发可以找到其他任何一个结点。

在这里插入图片描述

1.初始化

在这里插入图片描述

2.基本操作

①从头结点找到尾部,时间复杂度为O(n)
②从尾部找到头部,时间复杂度为O(1)
③很多时候对链表的操作都是在头部或尾部,可以让L指向表尾元素(插入、删除时可能需要修改L)。

2.循环双链表

表头结点的prior指向表尾结点。
表尾结点的next指向头结点。
在这里插入图片描述

1.初始化

在这里插入图片描述

2.基本操作

①插入
在这里插入图片描述
②删除
在这里插入图片描述

5.静态链表

1.定义

静态链表:分配一整片连续的内存空间,各个结点集中安置。
静态链表:用数组的方式实现的链表。

优点:增、删操作不需要大量移动元素
缺点:不能随机存取,只能从头结点开始依次往后查找。
容量固定不可变
适用场景:
①不支持指针的低级语言;
②数据元素数量固定不变的场景(如操作系统的文件分配表FAT)

在这里插入图片描述

2.代码实现

在这里插入图片描述

3.基本操作

①查找
从头结点出发挨个往后遍历结点。时间复杂度为O(n)

②插入
找到一个空的结点,存入数据元素
从头结点出发找到位序为i-1的结点
修改新结点的next
修改i-1号结点的next

③删除
从头结点出发找到前驱结点
修改前驱结点的游标
被删除结点next设为-2

5.顺序表和链表的对比

1.逻辑结构

都属于线性表,都是线性结构

2.存储结构

①顺序表(顺序存储)
优点:支持随机存取、存储密度高。
缺点:大片连续空间分配不方便,改变容量不方便。

②链表(链式存储)
优点:离散的小空间分配方便,改变容量方便。
缺点:不可随机存取,存储密度低。

3.基本操作

1.创建

①顺序表
需要预分配大片连续空间。
若分配空间过小,则之后不方便拓展容量;
若分配空间过大,则浪费内存资源。
②链表
只需分配一个头结点(也可以不要头结点,只声明一个头指针),之后方便拓展。

2.销毁

①顺序表
修改Length=0
系统自动回收空间

②链表
依次删除各个结点( free )
需要手动free

3.增删

①顺序表
插入/删除元素要将后续元素都后移/前移
时间复杂度O(n)
时间开销主要来自移动元素
若数据元素很大,则移动的时间代价很高

②链表
插入/删除元素只需修改指针即可
时间复杂度o(n)
时间开销主要来自查找目标元素
查找元素的时间代价更低

4.查找

①顺序表
按位查找:O(1)
按值查找:O(n)若表内元素有序,可在 O ( l o g 2 n ) O(log_2n) O(log2n)时间内找到

②链表
按位查找:O(n)
按值查找:O(n)

4.选择

表长难以预估、经常要增加/删除元素—―链表。
表长可预估、查询(搜索)操作较多――顺序表。

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

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

相关文章

项目文章 | 总石油烃-重金属污染与土壤微生态系统:细菌多样性、组装和生态功能研究

大家好,这里是专注表观组学十余年,领跑多组许科研服务的易基因。 2023年9月30日,中南大学张杜博士为第一作者、李骞教授为通讯作者在《Chemosphere》杂志上发表题为“Effects of single and combined contamination of total petroleum hydr…

Single Image Haze Removal Using Dark Channel Prior(暗通道先验)

去雾算法都会依赖于很强的先验以及假设,并结合相应的物理模型,完成去雾过程。本文作者何凯明及其团队通过大量的无雾图像和有雾图像,归纳总结出无雾图像在其对应的暗通道图像上具有极低的强度值(趋近于0),并…

HDD最后的冲刺:大容量硬盘的奋力一搏

1.引言 在上一篇文章(微软Azure云数据中心工作负载分享:SSD与HDD,何去何从?)中,我们提到在应对SSD QLC/PLC大容量的挑战中,HDD也是在不断的努力,推出HAMR,SMR等新介质。…

【验证码系列】Google验证码从数据训练到机器自动识别算法构建

文章目录 1. 写在前面2. CSCI级设计决策2.1. Google验证码突防关联2.2. Google验证码突防行为设计决策 3. Google验证码突防体系结构设计3.1. Google验证码突防部件3.1.2. Google验证码突防组成 3.2. Google验证码突防软件3.2.1. Google验证码突防软件体系结构3.2.2. Google验证…

信道编码译码及MATLAB仿真

文章目录 前言一、什么是信道编码?二、信道编码的基本逻辑—冗余数据1、奇偶检验码2、重复码 三、编码率四、4G 和 5G 的信道编码1、卷积码2、维特比译码(Viterbi)—— 概率译码3、LTE 的咬尾卷积码4、LTE 的 turbo 码 五、MATLAB 仿真1、plo…

Amazon Fargate使用Seekable OCI 实现更快的容器启动速度

前言 虽然在部署和扩展应用程序时,使用容器进行开发的方式已日趋流行,但仍有一些领域可以改进。扩展容器化应用程序的主要问题之一是启动时间长,尤其是在纵向扩展期间,需要添加较新的实例。此问题可能会对客户体验(例如…

EfficientDet论文讲解

目录 EfficientDet 0、摘要 1、整体架构 1.1 BackBone:EfficientNet-B0 1.2 Neck:BiFPN特征加强提取网络 1.3 Head检测头 1.4 compound scaling 2、anchors先验框 3、loss组成 4、论文理解 5、参考资料 EfficientDet 影响网络的性能(或者说规…

Android Gldie复用只取之前decode过的缓存resource,Kotlin

Android Gldie复用只取之前decode过的缓存resource,Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.life…

【Linux】服务器与磁盘补充知识,硬raid操作指南

服务器硬件 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.硬盘尺寸: 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 2.如何在服务器上制作raid 华为服务器为例子做…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(一)

熟悉项目环境 1. 苍穹外卖项目介绍1.1 项目介绍1.2 技术选型 2. 开发环境搭建2.1 前端环境2.2 后端环境搭建2.3 Git版本控制2.4 nginx反向代理和负载均衡 3.登录功能4. Swagger4.1 介绍4.2 使用步骤4.3 常用注解 1. 苍穹外卖项目介绍 1.1 项目介绍 苍穹外卖是专门为餐饮企业&…

JAVA前端开发介绍

以一个网站为例包括网站设计、前端开发、程序开发等。网站设计就是网站的外观,平面的东西。程序开发也好理解就是功能实现。而前端开发,简单来说,就是把平面效果图转换成网页,把静态转换成动态。它的工作包括了:切图、写样式、做鼠…

rust闭包

rust闭包 参考 Rust有三个闭包trait:Fn、FnMut和FnOnce,编译器会根据闭包内代码的行为自动为闭包实现这些trait。 上面这段话超级重要!!! 对于不可变或移动捕获变量的闭包,编译器会实现Fn trait&#xff0…

三维模型几何坐标精度偏差应采用主要措施

三维模型几何坐标精度偏差应采用主要措施 降低倾斜摄影三维模型几何精度偏差是提高模型质量和准确性的关键任务。下面将浅谈降低倾斜摄影三维模型几何精度偏差应采用的主要措施。 1、倾斜角度选择:倾斜角度对于几何精度具有重要影响。选择适当的倾斜角度可以优化视…

项目管理之如何监控项目健康状态

项目管理是一个复杂且关键的过程,涉及到多个关键因素,包括项目名称、项目管理委员会成员、项目经理、项目生命周期的各个阶段以及资源泳道等。如何有效地监控项目的健康状态是确保项目成功的重要环节。本文将详细介绍项目管理全景图及其在风险识别中的应…

JAVA二叉搜索树(专门用来查找)

目录 二叉搜索树又叫二叉排序树,它具有以下特征 二次搜索树的效率 模拟最简二叉搜索树代码 代码片段分析 查找二叉搜索树数据: 如果我们用递归的方法查找数据有什么不一样? 插入数据 删除数据(难点) 二叉搜索树又叫二叉排序树,它具有以下特征…

C++ day3作业

1> 思维导图 2> 自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height), 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void s…

【EMD】1.初识经验模态分解EMD

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* author jUicE_g2R(qq:3406291309)* * language MATLAB/Python/C/C* EDA Base on matlabR2022b* editor Obsidian(黑曜石笔记软件)* * copyright 2023* …

LED点阵显示原理(取字模软件+Keil+Proteus)

前言 写这个的时候我还是有点生气的,因为发现完全按照书上面的步骤来,结果发现不理想,后面还是自己调试才解决了。-_-说多了都是泪,直接进入正文。 软件的操作还是参考我之前的博客。 LED数码管的静态显示与动态显示&#xff0…

nssm将exe应用封装成windows服务

一、简介 NSSM(Non-Sucking Service Manager)是一个用于在Windows操作系统上管理和运行应用程序作为服务的工具。它提供了一种简单的方法来将任意可执行文件转换为Windows服务,并提供了一些额外的功能和配置选项。 优点: 简单易…

ifream标签中的子页面,操作父页面的元素

问题描述&#xff1a;子页面内容发生变化时&#xff0c;导航栏不会跟切换 解决办法&#xff1a; window.parent.document.getElementById demo html1 <html> <head><meta charset"UTF-8"><!-- import CSS --><link rel"stylesh…