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

数据结构--线性表(顺序结构)

1.线性表的定义和基本操作

1.1线性表以及基本逻辑

1.1.1线性表

(1)n(>=0)个数据元素的有限序列,记作(a1,a2,...an),其中ai是线性表中的数据元素,n是表的长度。

(2)ai是线性表中“第i个”元素在线性表中的位序。

注意:数组下标从0(a[0])开始,位序从1开始.

 1.1.2逻辑特征(n>0)

存在唯一的一个被称为“第一个”的数据元素。

存在唯一的一个被称为“最后一个”的数据元素。

除了第一个元素以外,其他元素均只有一个直接前驱。

除了最后一个元素外,其他元素均只有一个直接后继。

1.2线性表的基本操作

InitList(&L)              //创建一个新的线性表L

ListEmpty(L)           //判断L是否为空

ListLength(L)          //求L的长度

GetElem(L,i,&e)     //取i位置数据元素的值

ClearList(&L)          //将L置为空表

ListInsert(&L,i,e)     //在i位置插入值为e的数据元素

ListDelete(&L,i,&e) //删除i位置的元素e

1.ListInsert(&L,i,e)  ,传值

2.ListDelete(&L,i,&e),传引用

3.ListDelete(&L,i,*e),传指针

1.形参改变->不会影响实参

2.3.形参改变->会影响实参(传引用,传指针)

 下面用一张图来介绍形参和实参的区别:(by 通义千问)

传引用(&)适用场景:

1.需要函数修改原始数据。

2.对于大型数组或对象,为了节省内存开销和提升运算效率,使用引用传递。

一句话:对参数的修改结果要“带回来”。 

2.线性表的顺序表示

2.1线性表和顺序表的定义

(1)线性表:线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列。

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

2.2静态分配和动态分配

2.2.1静态分配

#define MAX 10
int arr[MAX];
int n;         //数据元素个数小于n个

结构体进行封装:

#define MAX 100
typedef struct
{ElemType elem[MAX];int n;
}Sqlist;

2.2.2动态存储

(1)动态申请和释放内存空间

(2)C语言--malloc,free函数

L.data=(ElemType *)malloc(sizeof(ElemType)*InitSize)
//malloc函数返回一个指针,需要用“(ElemType *)”强制类型转化为自己定义的数据元素类型指针

2.2.3顺序表基本操作实现

1.初始化顺序表InitList_Sq(&L)

操作结果:构造一个空的顺序表L.

Status InitList_Sq(SqList&L)       // 定义一个函数名为 InitList_Sq 的函数,参数是对 SqList 类型的引用 L,返回类型为 Status(这里 Status 可能是一个自定义的表示状态的类型)
{L.elem=(ElemType*)malloc(initial_size*sizeof(ElemType));  // 为 L 的 elem 属性分配一块内存空间,大小为 initial_size 个 ElemType 类型元素所需的空间,并将其地址转换为 ElemType*类型赋给 L.elemif(!L.elem)                    // 如果分配内存失败(L.elem 为假,即内存分配不成功得到的是 null 指针等情况)exit(OVERFLOW);            // 退出程序并表示存储空间分配失败(OVERFLOW 可能是一个表示溢出或错误的常量)L.length=0;                    // 将顺序表 L 的当前长度设置为 0L.listsize=initial_size;       // 将顺序表 L 的初始容量设置为 initial_sizereturn 0;                      // 返回一个状态值(这里可能表示成功初始化)
}

下面是对顺序表中长度和容量的解释: 

在顺序表(Sequential List)中:

 

一、长度(length

 

指的是顺序表中当前实际存储的元素个数。

 

例如,如果有一个顺序表存储了 5 个整数,那么这个顺序表的长度就是 5。随着向顺序表中添加或删除元素,长度会相应地发生变化。

 

二、容量(listsize

 

指的是顺序表预先分配的能够存储元素的最大空间大小。

 

例如,一开始创建顺序表时可能分配了一块可以存储 10 个整数的连续内存空间,那么此时这个顺序表的容量就是 10。当顺序表中的元素个数达到容量时,如果要继续添加元素,通常需要进行扩容操作(重新分配更大的连续内存空间)。而如果顺序表中的元素个数远小于容量,那么就存在一部分未被使用的内存空间。

2.销毁顺序表DestroyList_Sq(&L):

释放L所占用的内存空间

void DestroyList_Sq(SqList &L)
{free(L.elem); // 释放顺序表 L 的存储数据的内存空间。free 函数用于释放由 malloc、calloc 或 realloc 等函数分配的动态内存。L.elem = NULL; // 将 L 的 elem 指针设置为 NULL,避免出现悬空指针。L.length = 0; // 将顺序表的长度设置为 0,表示表中没有元素。L.listsize = 0; // 将顺序表的容量设置为 0。
}

3.判定是否为空表 ListEmpty_Sq(L):

若L为空表,返回1,否则返回0;

int ListEmpty_Sq(SqList L)
{if (L.length==0)return 1;else return 0;

4.输出顺序表 DispList_Sq(L):

操作结果:当L不为空时,顺序显示L中各个元素的值。

Status DispList_Sq(SqList L)
{if (ListEmpty_Sq(L))return ERROR;// 如果顺序表为空(通过调用 ListEmpty_Sq 函数判断),则返回 ERROR(可能是一个表示错误的状态码)。for(i=0;i<=L-1;i++){print(L.elem[i]);}// 如果顺序表不为空,遍历顺序表,从第一个元素(下标为 0)开始,直到最后一个元素(下标为 L-1),逐个打印顺序表中的元素。return OK;// 遍历完成后,返回 OK(可能是一个表示成功的状态码)。
}

5.插入数据元素  ListInsert_Sq(&L,i,e):

操作结果:在顺序表L的第i个位置前插入新元素e. 

ListInsert_Sq(SqList &L, int i, ElemType e) 
{if (i < 1 || i > L.length + 1) {return ERROR;}// 判断插入位置 i 是否合法,i 应该在 1 到(当前顺序表长度 + 1)之间,否则返回错误状态码 ERROR。if (L.length >= L.listsize) {newbase = (ElemType*)malloc(L.elem,(L.listsize + ElemNumber)*sizeof(ElemType));L.elem = newbase;L.listsize += ElemNumber;}// 如果当前顺序表中已存储的元素个数(L.length)等于或超过了顺序表的容量(L.listsize),则进行扩容操作。// 分配一块新的内存空间,大小为原来的容量加上 ElemNumber 个 ElemType 类型元素所需的空间,然后将新分配的内存地址赋给 L.elem,并更新顺序表的容量 L.listsize。for (j = L.length; j >= i; j--) {L.elem[j] = L.elem[j - 1];}// 将插入位置 i 及之后的元素向后移动一位。L.elem[i - 1] = e;// 在插入位置 i 处放入新元素 e。++L.length;// 顺序表长度加一。return 1;// 返回一个表示成功的状态码(这里是 1)。
}

时间复杂度:

-最好情况:新元素插到表尾,不需要移动元素i=n+1,循环0次,T(n)=O(1);

-最坏情况:新元素插到表头,需要将原有的n个元素全部向后移动i=1,循环n次,T(n)=O(n);

-平均情况:,新元素插入到任意一个位置概率相同,需要的时间是n/2,考虑到时间复杂度量级,T(n)=O(n).  

6.删除数据元素 ListDelete_Sq(&L,i,&e):

操作结果:删除顺序表L中的第i个元素,用引用变量e返回删除的元素。

ListInsert_Sq(SqList &L, int i, ElemType &e) 
{if (i < 1 || i > L.length) {return ERROR;}// 判断插入位置 i 是否合法。i 应该在 1 到顺序表的当前长度之间,如果不合法则返回错误状态码 ERROR。e = L.elem[i - 1];// 将顺序表中位置 i 处的元素赋值给参数 e。for (j = i; j < L.length; j++) {L.elem[j - 1] = L.elem[j];}// 从位置 i 开始,将后面的元素依次向前移动一位。--L.length;// 顺序表的长度减一,表示删除了一个元素。return 1;// 返回一个表示成功的状态码(这里是 1)。
}

时间复杂度:

-最好情况:T(n)=O(1);

-最坏情况:T(n)=O(n);

-平均情况:T(n)=O(n).  

 7.按位查找操作 GetElem(L,i):

操作结果:获取表L中的第i个位置元素的值。

ElemType GetElem(SeqList L,int i)
{return L.data[i-1];
}

 时间复杂度:O(1)

 8.按值查找操作 LocateElem(L,e):

操作结果:在表L中查找具有给定关键字值的元素(第一个)。

//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L,ElemType e)
{for(int i=0;i<=L.length-1;i++){if(L.data[i]==e){return i+1;}}return 0;
}

时间复杂度:

-最好情况:目标元素子啊表头,循环1次,T(n)=O(1);

-最坏情况:目标元素在表尾,循环n次,T(n)=O(n);

-平均情况:目标元素出现在任何一个位置的概率相同,T(n)=O(n).  

 下面是链表,敬请期待...

相关文章:

数据结构--线性表(顺序结构)

1.线性表的定义和基本操作 1.1线性表以及基本逻辑 1.1.1线性表 &#xff08;1&#xff09;n(>0)个数据元素的有限序列&#xff0c;记作&#xff08;a1,a2,...an&#xff09;&#xff0c;其中ai是线性表中的数据元素&#xff0c;n是表的长度。 &#xff08;2&#xff09;…...

面试准备111

Java基础 反射 集合 多线程 Synchronized/volatile 线程池 cas atomic 网络 tcp 三次握手/四次挥手 流量控制 拥塞控制 数据结构 算法 Spring 循环依赖 Mybatis 如何防止sql注入 Mysql 索引 索引分类 索引设计原则 事务 四种隔离级别 MVCC 日志 Binlog…...

Spring 的 IOC 和 AOP 是什么,有哪些优点?解密 Spring两大核心概念:IOC与AOP的魅力所在

在现代Java开发中&#xff0c;Spring框架几乎是不可或缺的存在。它不仅简化了开发过程&#xff0c;还提高了软件的灵活性和可维护性。今天&#xff0c;我们要深入探讨Spring中的两个核心概念&#xff1a;IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&…...

第二百六十四节 JPA教程 - JPA查询日期参数示例

JPA教程 - JPA查询日期参数示例 我们可以在查询中使用日期类型值。 以下代码使用EntityManager创建具有两个参数的查询。 然后它传递两个日期类型值。 em.createQuery("SELECT e " "FROM Professor e " "WHERE e.startDate BETWEEN :start AND :en…...

Spring MVC的运行流程详解

Spring MVC作为一个广泛使用的框架&#xff0c;提供了灵活且强大的MVC架构支持。尤其在业务系统中&#xff0c;Spring MVC能够有效地处理大量并发请求&#xff0c;提供良好的用户体验。本文将详细讲解Spring MVC的运行流程&#xff0c;以电商交易系统为案例&#xff0c;帮助读者…...

判断有向图是否为单连通图的算法

判断有向图是否为单连通图的算法 算法描述伪代码C语言实现解释在图论中,单连通图(singly connected graph)是指对于图中的任意两个顶点 m 和 v,如果存在从 m 到 v 的路径,则该路径是唯一的。为了判断一个有向图是否为单连通图,我们需要确保从任意顶点出发,到任意其他顶点…...

php与python建站的区别有哪些

php与Python建站的区别&#xff1a; 1、语言层面Python的特性比php好&#xff0c;更加规范。 2、Python的性能比php高。 3、有只需要启动服务的时候执行一次的代码&#xff0c;在php里每个请求都会被执行一次&#xff0c;Python不需要。虽然php可以通过缓存缩短这方面的差距…...

模型评估与验证:确保模型在未知数据上的表现----示例:使用K折交叉验证评估分类模型、房价预测问题使用K折交叉验证来评估一个线性回归模型的性能

模型评估与验证是机器学习流程中的关键步骤&#xff0c;它帮助我们了解模型在未见过的数据上的泛化能力。交叉验证&#xff08;Cross-Validation, CV&#xff09;是一种常用的技术&#xff0c;通过将数据集划分为多个子集并进行多次训练和测试来估计模型的性能。此外&#xff0…...

awd基础学习

一、常用防御手段 1、改ssh密码 passwd [user] 2、改数据库密码 进入数据库 mysql -uroot -proot 改密码 update mysql.user set passwordpassword(新密码) where userroot; 查看用户信息密码 select host,user,password from mysql.user; 改配置文件 &#xff08;否则会宕机…...

C#基于SkiaSharp实现印章管理(10)

向PDF文件插入印章图片比之前实现的向图片文件插入印章麻烦得多。   最初的想法是使用PDF浏览控件在线打开PDF文件&#xff0c;然后在控件中实现鼠标移动时动态显示印章&#xff0c;点击鼠标时向当前PDF页面的鼠标点击位置插入图片。由于是.net 8的Winform项目&#xff0c;选…...

通过栈实现字符串中查找是否有指定字符串的存在

题目示例&#xff1a; 分析 由与没有给出字符串的长度&#xff0c;所以只能通过getline一次性处理&#xff0c;而在输入后恰好能倒序处理字符串&#xff0c;以标点符号为分界点&#xff0c;将数字当成字符放到栈里&#xff0c;遇到下一个标点符号时执行查找操作&#xff0c;…...

MongoDB伪分布式部署(mac M2)

1. 序言 本博客是上一博客的进阶版&#xff1a;mac M2安装单机版 MongoDB 7.x&#xff0c;上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB&#xff0c;实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集&#xff1f; …...

Golang | Leetcode Golang题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }...

[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷

在数字艺术和创意领域&#xff0c;[ComfyUI]Flux以其独特的虚实结合技术&#xff0c;已经成为艺术家和设计师们手中的利器。今天&#xff0c;我们激动地宣布&#xff0c;[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品&#xff0c;经典中文元素通过AI技术重现&#xff0c;包…...

Linux 系统 nvm 管理node无法使用

文章目录 一、报错说明二、报错原因三、解决办法四、验证 一、报错说明 centos7服务器使用nvm安装的node之后&#xff0c;只要使用npm或者node&#xff0c;均会出现以下问题。 npm -v node: /lib64/libm.so.6: version GLIBC_2.27 not found (required by node) node: /lib64…...

信号处理快速傅里叶变换(FFT)的学习

FFT是离散傅立叶变换的快速算法&#xff0c;可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的&#xff0c;但是如果变换到频域之后&#xff0c;就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外&#xff0c;FFT可以将一个信号的频谱提取出来&am…...

vue3项目el-table表格行内编辑加输入框校验

核心点 1. el-form的model属性需要跟el-form-item的prop要对应 2. el-form的model属性绑定tableData 3. el-form-item的prop绑定字符串&#xff1a;scope.index.列名&#xff08;注意有个点&#xff09; 4. el-form-item需要单独设置rules属性 代码示例 <el-form :mod…...

【Node.js】内置模块FileSystem的保姆级入门讲解

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;Vscode 本文代码都经由博主PleaSure乐事实操后得出&#xff0c;可以放心使用。 1.FileSystem介绍 Node.js 的 fs&#xff08;filesystem&#xff09;模块是一个核心模块&#xff0c…...

问:LINUXWINDOWS线程CPU时间如何排序?

Linux 在Linux上&#xff0c;你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式&#xff0c;-e选项表示显示所有进程&#xff0c;--sort选项用于排序。 ps -e -o pid,tid,comm,…...

postgresql-重复执行相同语句,试试 prepare!

文章目录 每次你向 PostgreSQL 发送 SQL 语句时&#xff0c;数据库都必须对其进行解析(parse)。解析虽然很快&#xff0c;但如果同样的语句被解析一千次&#xff0c;这种操作累积起来可能会占用大量时间&#xff0c;而这些时间本可以用于处理其他事务。为避免这种情况&#xff…...

wpf加载带材料的3D模型(下载的3D预览一样有纹理)

背景&#xff1a;最近真的是忙啊&#xff0c;累出汁水了 整体效果&#xff1a; 放大可以看清砖头&#xff1a; 1、需要自己准备好3D模型&#xff0c;比如我这里是下载的这里的3D Warehouse&#xff0c;下载Collada File格式文件 2、解压可以看到一个model.dae和材料的文件夹&…...

【k8s之深入理解调度】调度框架扩展点理解

参考自 K8s 调度框架设计与 scheduler plugins 开发部署示例&#xff08;2024&#xff09; 调度插件扩展点 等待调度阶段PreEnqueuePod 处于 ready for scheduling 的阶段。 内部工作原理&#xff1a;sig-scheduling/scheduler_queues.md。在 Pod 被放入调度队列之前执行的插…...

音视频基础理论

1. 音频基础 1.1 音频基本概念 1.1 频率&#xff1a;声波的频率&#xff0c;即声音的音调&#xff0c;人类听觉的频率(音调)范围为20Hz--20KHz 1.2 振幅&#xff1a;即声波的响度&#xff0c;通俗的讲就是声音的高低&#xff0c;一般男生的声音振幅(响度)大于女生。 1.3 波形…...

《江苏科技大学学报(自然科学版)》

《江苏科技大学学报&#xff08;自然科学版&#xff09;》&#xff08;双月刊&#xff0c;国内外公开发行&#xff09;是由江苏省教育厅主管、江苏科技大学主办的理工类学术期刊&#xff0c;1986年创刊&#xff0c;国际刊号&#xff1a;ISSN1673-4807&#xff0c;国内刊号&…...

C++初学者指南-5.标准库(第二部分)–随机数生成

C初学者指南-5.标准库(第二部分)–随机数生成 文章目录 C初学者指南-5.标准库(第二部分)–随机数生成基本概念例子统一随机数布尔值&#xff08;“抛硬币”&#xff09;正态分布具有独立概率的整数 怎么做种子引擎使用自定义生成器 shuffle算法分布类型概述通用接口均匀分布采样…...

Unity2017在安卓下获取GPS位置时闪退的解决办法

在Unity使用低功耗蓝牙通信&#xff08;BLE&#xff09;需要用到设备的位置信息。但是调用Input.location.Start()程序会闪退。 解决办法&#xff1a;调用原生安卓接口。 参见《Unity2021通过aar调用Android方法》编写一个aar插件gpsplugin&#xff0c;在插件中提供获取GPS位…...

OpenGL ES 索引缓冲区(4)

OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区&#xff0c;索引缓冲区和顶点缓冲区类似&#xff0c;也是显存上的一段内存&#xff0c;只不过上面的数据用处不同&#xff0c;索引缓冲区故名思义里面的数据是用于索引&#xff0c;主要作用是用于复用顶点缓冲区里的数据。…...

01:(寄存器开发)点亮一个LED灯

寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板&#xff0c;教程来源B站up“嵌入式那些事”。…...

.Net 6.0 Windows平台如何判断当前电脑是否联网

最近在工作中开发需要判断当前电脑是否联网的需求&#xff0c;在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍&#xff1a; 1.方法一&#xff08;调用winAPI&#xff09; [DllImport("wininet")] public static extern bool InternetGetConnec…...

微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用

Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序&#xff0c;并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…...

wordpress qq登录/百度app平台

//api为27或27版本的执行下面一行&#xff0c;进行脱壳OreoDump.init(lpparam);} else {//低版本api执行下面一行进行脱壳LowSdkDump.init(lpparam,type);}} }} 已经加好注释&#xff0c;值得注意的就是&#xff0c;此处程序有分叉了&#xff0c;分别是 OreoDump.init()和LowSd…...

深圳北网站建设/5118网站如何使用免费版

如图&#xff1a; 服务器内网能访问了。通过ip访问不了。 看了网上一堆&#xff1a; 防火墙端口开启对应端口服务器放行端口修改配置文件application.properties中 server.address 0.0.0.0服务器httpd服务异常 1、查看httpd服务chkconfig --list httpd 提示服务不存在 2、安…...

什么是网站建设公司/广告网站推荐

1月2日&#xff0c;NVIDIA正式发布了旗下显卡Linux操作系统最新的295.09版本&#xff0c;此次更新最大的改动就是在Linux下不需要Quadro专业显卡也可以实现10bit色深输出了(VGA、DVI-I、DisplayPort)。遗憾的是目前Windows操作系统下还是需要使用支持DX10以上规格的Quadro专业卡…...

软件园专业做网站/宁波好的seo外包公司

本文主要向大家介绍了MySQL数据库之远程连接mysql 授权方法详解 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。今在服务器上 有mysql 数据库&#xff0c;远程访问&#xff0c;不想公布root账户&#xff0c;所以&#xff0c;创建了demo…...

wordpress不显示更新/可以免费网络推广网站

一个类可以继承另一个类的方法&#xff0c;属性和其他特性。当一个类继承其他类时&#xff0c;继承的类叫子类&#xff0c;被继承的类叫超类&#xff08;或父类&#xff09;。在Swift中&#xff0c;继承是区分类与其他类型的一个基本特征。只有类才能被继承。 在Swift中&#x…...

郑州网站制作公司排名/免费网站排名优化在线

描述 给出两个字符串, 你需要修改第一个字符串&#xff0c;将所有与第二个字符串中相同的字符删除, 并且第二个字符串中不同的字符与第一个字符串的不同字符连接 样例 - 样例 1:输入 : s1 "aacdb", s2 "gafd" 输出 : "cbgf"- 样例 2:输入 :…...