当前位置: 首页 > 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…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...