【链表——数据结构】

news2024/11/26 23:55:27

文章目录

    • 1.单链表
        • 1.定义
        • 2.基本操作
          • 2.1.不带头结点
          • 2.2后插
          • 2.3前插
          • 2.4删除
          • 2.5按位查找
          • 2.6按值查找
          • 2.7求单链表长度
          • 2.8 建表
    • 2.双链表
        • 1.初始化
        • 2.插入(后插)
        • 3.删除(后删)
        • 4.遍历
    • 3.循环链表
        • 1.循环单链表
        • 2.循环双链表
        • 3.代码问题
    • 4.静态链表
        • 1.简述基本操作的实现
        • 1.初始化
        • 3.删除某个结点
        • 4.优缺点
        • 5.适用场景
    • 5.线性表
        • 1.从无到有,从有到无
        • 2.增 删(改)
        • 3.(“改”之前也要“查" )
        • 4.判空、判长、打印输出(还可以自己根据实际需求增加其它基本操作)
    • 6.顺序表
        • 1.静态分配
        • 2.动态分配
        • 3. 特点
        • 4.插入
        • 5.删除
        • 6.代码要点
        • 7.按位查找
        • 8.按值查找

1.单链表

1.定义

用链式存储”(存储结构实现了 “线性结构" (逻辑结构))
一个结点存储-个数据元素
各结点间的先后关系用一个指针表示
单链表:表尾结点的next指针指向NULL
单链表:从一个结点出发只能找到后续的各个结点
在这里插入图片描述
两种实现
1.不带头结点
空表判断: L= =NULL。写代码不方便
2.带头结点
空表判断:L-> next= =NULL。写代码更方便

2.基本操作

1.带头结点
头结点可以看作“第0个”结点
找到第i-1个结点,将新结点插入其后
在这里插入图片描述

2.1.不带头结点

不存在“第0个” 结点,因此i=1时需要特殊处理
找到第i-1个结点,将新结点插入其后
在这里插入图片描述
如果不带头结点,则插入、删除第1个元素时,需要更改头指针L
在这里插入图片描述

2.2后插

在这里插入图片描述

2.3前插

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4删除

头结点可以看作“第0个”结点
找到第i-1个结点,将其指针指向第i+ 1个结点,并释放第i个结点
在这里插入图片描述
时间复杂度O(n)

有坑:指定结点是最后一-个结点时,需要特殊处理
在这里插入图片描述

2.5按位查找

单链表不具备"随机访问"的特性,只能依次扫描
在这里插入图片描述
平均查找长度O(n)

2.6按值查找

在这里插入图片描述
平均查找长度O(n)

2.7求单链表长度

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

2.8 建表

1.尾插法
初始化单链表
设置变量length记录链表长度

While循环{
每次取一个数据元素e;
ListInsert (L, length+ 1, e)插到尾部;
length+ +;
}

在这里插入图片描述

2.头插法
头插法建立单链表: .
初始化单链表

While循环{
每次取一个数据元素e;
InsertNextNode (L, e);
}

2.双链表

1.初始化

头结点的prior,next都指向NULL

2.插入(后插)

注意新插入结点、前驱节点、后继结点的指针修改
边界情况:新插入结点在最后一个位置,需特殊处理

3.删除(后删)

注意删除结点的前驱结点、后继结点的指针修改
边界情况:如果被删除结点是最后-个数据结点,需特殊处理

4.遍历

从一个给定结点开始,后向遍历、前向遍历的实现(循环终止条件)
链表不具备随机存取特性,查找操作只能通过顺序遍历实现

3.循环链表

1.循环单链表

空表在这里插入图片描述
非空表
在这里插入图片描述

2.循环双链表

空表
在这里插入图片描述
非空表
在这里插入图片描述

3.代码问题

判空
在这里插入图片描述
如何判断结点p是否表尾/表头结点
在这里插入图片描述
如何在表头、表中、表尾插入/删除一个结点
在这里插入图片描述
在这里插入图片描述

4.静态链表

用数组的方式实现的链表
分配一整片连续的内存空间,各个结点集中安置
每个数据元素4B,每个游标4B (每个结点共8B)设起始地址为addr
在这里插入图片描述
如何定义一个静态链表
在这里插入图片描述

1.简述基本操作的实现
1.初始化

把a[0]的next设为-1
把其他结点的next设为一个特殊值用来表示结点空闲

查找从头 结点出发挨个往后遍历结点

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

3.删除某个结点

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

4.优缺点

优点:增、删操作不需要大量移动元素
缺点:不能随机存取,只能从头结点开始依次往后查找;容量固定不可变

5.适用场景

①不支持指针的低级语言.
②数据元素数量固定不变的场景(如操作系统的文件分配表FAT)

5.线性表

值得注意的特性
数据元素同类型、有限、有序

重要的术语
n为表长、当n=0时为空表
表头a、 表尾a——注意: 位序从1开始数组下标从0开始
前驱、后继——除第- -个元素外,每个元素有且仅有一一个直接前驱;除最后-个元素外,每个元素有且仅有一个直接后继
数据元素的位序a; (从1开始)

**“逻辑结构”**一a1 →a2→a3→a4→a5

基本操作

1.从无到有,从有到无

InitList(&L):初始化表。构造-个空的线性表L, 分配内存空间。
DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间。

2.增 删(改)

ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e.
ListDelete(&L,i,&e):删除操作。删除表l中第i个位置的元素,并用e返回删除元素的值。

3.(“改”之前也要“查" )

LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素
GetElem(Li):按位查找操作。获取表L中第i个位置的元素的值。

4.判空、判长、打印输出(还可以自己根据实际需求增加其它基本操作)

Length(L):求表长。返回线性表L的长度,即L中数据元素的个数。
PrintList(L):输出操作。按前后顺序输出线性表l的所有元素值。
Empty(L):判空操作。若L为空表,则返回true,否则返回false.

在这里插入图片描述

6.顺序表

定义(如何用代码实现)
存储结构一逻辑 上相邻的数据元素物理上也相邻
使用“静态数组"实现

实现方式

1.静态分配

给各个数据元素分配连续的存储空间,大小为
大小一旦确定就无法改变

2.动态分配

使用“动态数组"实现
L.data= (Elemtype *) malloc (sizeof(ElemType)*size);
顺序表存满时,可再用malloc动态拓展顺序表的最大容量
需要将数据元素复制到新的存储区域,并用free函数释放原区域
缺点:时间开销大

3. 特点

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

基本操作

4.插入

Listinser(&Li,e)一将元素e插入到 的第i个位置
插入位置之后的元素都要后移
时间复杂度
最好0(1)、最坏O(n)、 平均O(n)

5.删除

ListDelete(&Li,&e)
将L的第i个元素删除,并用e返回
删除位置之后的元素都要前移
时间复杂度
最好0(1)、最坏O(n). ‘平均O(n)

6.代码要点

代码中注意位序和数组1下表的区别
算法要有健壮性,注意判断i和注意合法性
移动元素时,从靠前的元素开始?还是从表尾元素开始?
分析代码,理解为什么有的参数需要加“&"引用

7.按位查找

GetElem(Li)
获取表L中第i个位置的元素的值
用数组小标可得到第i个元素Ldata[i-1]
时间复杂度
最好/最坏/平均时间复杂度都是0(1)

8.按值查找

LocateElem(,e)
在顺序表L中查找第一个元素值等于e的元素, 并返回其位序
从第一个元素开始依次往后检索
时间复杂度
最好O(1)——目标元素在第一个位置
最坏O(n)——目标元素在最后一个人位置
平均O(n)——目标元素在每个位置的概率相同
在这里插入图片描述
表长难以预估、经常要增加/删除元素——链表
表长可预估、查询(搜索)操作较多——顺序表

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

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

相关文章

【AIGC调研系列】Sora级别的国产视频大模型-Vidu

Vidu能够达到Sora级别的标准。Vidu被多个来源认为是国内首个Sora级别的视频大模型[2][3][4]。它采用了团队原创的Diffusion与Transformer融合的架构U-ViT,能够生成长达16秒、分辨率高达1080P的高清视频内容[1][6]。此外,Vidu的一致性、运动幅度都达到了S…

vue2如何创建一个项目?

目录 1. 安装环境: 2. 安装Vue CLI 3. 创建新项目 4. 选择配置 5. 安装依赖并运行 6. 开始开发 7. 构建项目 8. 预览生产环境构建 首先创建一个vue2项目,你可以通过以下步骤进行: 1. 安装环境: 保证自己的电脑已经安装N…

Jmeter Beanshell 设置全局变量

//获取token import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; import java.util.*; import org.apache.jmeter.util.JMeterUtils; //获取可上机机器 String response prev.getResponseDataAsString(); JSONObject responseObect JSONObjec…

rancher/elemental 构建不可变IOS(一)

一、什么是elemental Elemental 是 Rancher 的一个变种,专注于提供一个更轻量级的 Kubernetes 发行版。它旨在提供简化的部署和管理体验,同时保持 Kubernetes 的灵活性和强大功能。Elemental 通常针对较小的部署场景或资源受限的环境,例如测…

PY32F040单片机产品介绍,LQFP封装,带LCD 驱动器

PY32F040单片机搭载了 Arm Cortex-M0内核,最高主频可达72 MHz,专为高性价比、高可靠性的系统而设计,符合消费市场的基本设计需求。可广泛应用于电机控制、手持设备、PC 外设、以及复杂的数字控制应用等领域。 PY32F040片内集成 UART、I2C、S…

Pycharm配深度学习环境所遇到的部分问题

问题1:Anaconda prompt界面安装CUDA出现的问题: 不管是:conda install pytorch torchvision torchaudio cudatoolkit11.3 -c pytorch 还是:pip ****什么的 问题描述:EnvironmentNotWritableError: The current user does not have write p…

手动在Ubuntu22.04上部署LAMP环境

简介 LAMP环境是常用的Web开发环境之一,其中LAMP分别代表Linux、Apache、MySQL和PHP。本文介绍如何在Ubuntu操作系统的ECS实例内部署LAMP环境。 准备工作 该实例必须满足以下条件: 实例已分配公网IP地址或绑定弹性公网IP(EIP)。…

【Java】java实现文件上传和下载(上传到指定路径/数据库/minio)

目录 上传到指定路径 一、代码层级结构 二、文件上传接口 三、使用postman进行测试; MultipartFile接收前端传递的文件:127.0.0.1:8082/path/uploadFile part接收前端传递的文件:127.0.0.1:8082/path/uploadFileByRequest 接收前端传递…

【存储芯片】CS创世 SD NAND:可以机贴的存储芯片

什么是CS创世 SD NAND呢?很多的朋友一直想知道这个问题。今天精心准备了SD NAND 的一个介绍。其实很多工程师朋友对CS创世 SD NAND有很多称呼。比如:贴片式T卡、贴片式TF卡、贴片式SD卡、可焊接的T卡,可焊接的SD卡,可贴片的TF卡&a…

TikTok引流中海外云手机的实用功能分享

在当下,TikTok已成为全球范围内最受欢迎的社交媒体平台之一,拥有着庞大的用户群体和潜在的商业机会。为了在TikTok上实现更好的引流效果,利用海外云手机成为了一个明智的选择。接下来,我们将深入探讨海外云手机的功能以及它如何助…

LLM优化:开源星火13B显卡及内存占用优化

1. 背景 本qiang~这两天接了一个任务,部署几个开源的模型,并且将本地经过全量微调的模型与开源模型做一个效果对比。 部署的开源模型包括:星火13B,Baichuan2-13B, ChatGLM6B等 其他两个模型基于transformers架构封装&#xff0…

创建基于时间的 UUID

概述 在本文中,我们将会 对 UUIDs 和基于时间的 UUIDs(time-based UUIDs) 进行一些探讨。 当我们在对基于时间的 UUIDs 进行选择的时候,总会遇到一些好的方面和不好的方面,如何进行选择,也是我们将要简要…

代码+视频,R语言绘制生存分析模型的时间依赖(相关)性roc曲线和时间依赖(相关)性cindex曲线

ROC曲线分析是用于评估一个因素预测能力的手段,是可以用于连续型变量分组的方法。在生存分析中,疾病状态和因素取值均会随时间发生变化。而标准的ROC曲线分析将个体的疾病状态和因素取值视作固定值,未将时间因素考虑在分析之中。在这种情况下…

一加Ace3/12/Ace2pro手机ColorOS14刷KernelSU内核ROOT-解决无限重启变砖

一加Ace3/一加12/一加11等手机升级了安卓14底层,并且ColorOS版本也更新到了14版本界面和功能都比之前的系统表现更加优秀,但刷机方面,相对之前存在一些差异,特别是KernelSU内核级别root权限,不再支持一键刷入KernelSU通…

【Linux网络】SSH--远程控制与访问

目录 一、SSH远程管理 1.SSH的定义 2.远程传输的种类 3.OpensSSH 4.SSH客户端与服务端 二、配置OpenSSH服务器 1.sshd_config配置文件的常用选项设置 2.sshd 服务支持两种验证方式 1)密码验证 2)密钥对验证 三、使用 SSH 客户端程序 1.ssh 远…

从 Sora 制作的短片看AI生成视频的优势与局限性解析

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

R语言的基本图形

一&#xff0c;条形图 安装包 install.packages("vcd") 绘制简单的条形图 barplot(c(1,2,4,5,6,3)) 水平条形图 barplot(c(1,2,4,5,6,3),horiz TRUE) 堆砌条形图 > d1<-c("Placebo","Treated") > d2<-c("None",&qu…

聚类分析:使用R语言对Iris数据集进行K均值聚类

引言 聚类分析是一种常用的无监督学习技术&#xff0c;旨在将数据集中的样本分成具有相似特征的组。K均值聚类是其中一种常见的方法&#xff0c;它通过将数据点划分为K个簇&#xff0c;并使每个数据点与其所属簇的中心点距离最小化来实现聚类。本文将介绍如何使用R语言执行K均…

matlab求时间序列的时间滞后相关性

matlab求时间序列的时间滞后相关性 自相关、互相关、加权相关、滞后相关等相关性分析&#xff0c;在时间序列分析中经常被用到&#xff0c;可以量化两个时间序列的相关程度&#xff0c;特别对于有季节性趋势的序列中这个分析尤为必要。下面介绍一个Matlab函数&#xff0c;用于进…

FPGA实现图像处理之【直方图均衡-寄存器版】

FPGA实现直方图统计 一、图像直方图统计原理 直方图的全称为灰度直方图&#xff0c;是对图像每一灰度间隔内像素个数的统计。即对一张图片中每隔二灰度值的像素数量做统计&#xff0c;然后以直方图的形式展现出来。图下的亮暗分布在直方图中就可以一目了然&#xff0c;直方图…