数据结构--线性表(顺序结构)
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线性表 (1)n(>0)个数据元素的有限序列,记作(a1,a2,...an),其中ai是线性表中的数据元素,n是表的长度。 (2)…...
面试准备111
Java基础 反射 集合 多线程 Synchronized/volatile 线程池 cas atomic 网络 tcp 三次握手/四次挥手 流量控制 拥塞控制 数据结构 算法 Spring 循环依赖 Mybatis 如何防止sql注入 Mysql 索引 索引分类 索引设计原则 事务 四种隔离级别 MVCC 日志 Binlog…...
Spring 的 IOC 和 AOP 是什么,有哪些优点?解密 Spring两大核心概念:IOC与AOP的魅力所在
在现代Java开发中,Spring框架几乎是不可或缺的存在。它不仅简化了开发过程,还提高了软件的灵活性和可维护性。今天,我们要深入探讨Spring中的两个核心概念:IOC(控制反转)和AOP(面向切面编程&…...
第二百六十四节 JPA教程 - JPA查询日期参数示例
JPA教程 - JPA查询日期参数示例 我们可以在查询中使用日期类型值。 以下代码使用EntityManager创建具有两个参数的查询。 然后它传递两个日期类型值。 em.createQuery("SELECT e " "FROM Professor e " "WHERE e.startDate BETWEEN :start AND :en…...
Spring MVC的运行流程详解
Spring MVC作为一个广泛使用的框架,提供了灵活且强大的MVC架构支持。尤其在业务系统中,Spring MVC能够有效地处理大量并发请求,提供良好的用户体验。本文将详细讲解Spring MVC的运行流程,以电商交易系统为案例,帮助读者…...
判断有向图是否为单连通图的算法
判断有向图是否为单连通图的算法 算法描述伪代码C语言实现解释在图论中,单连通图(singly connected graph)是指对于图中的任意两个顶点 m 和 v,如果存在从 m 到 v 的路径,则该路径是唯一的。为了判断一个有向图是否为单连通图,我们需要确保从任意顶点出发,到任意其他顶点…...
php与python建站的区别有哪些
php与Python建站的区别: 1、语言层面Python的特性比php好,更加规范。 2、Python的性能比php高。 3、有只需要启动服务的时候执行一次的代码,在php里每个请求都会被执行一次,Python不需要。虽然php可以通过缓存缩短这方面的差距…...
模型评估与验证:确保模型在未知数据上的表现----示例:使用K折交叉验证评估分类模型、房价预测问题使用K折交叉验证来评估一个线性回归模型的性能
模型评估与验证是机器学习流程中的关键步骤,它帮助我们了解模型在未见过的数据上的泛化能力。交叉验证(Cross-Validation, CV)是一种常用的技术,通过将数据集划分为多个子集并进行多次训练和测试来估计模型的性能。此外࿰…...
awd基础学习
一、常用防御手段 1、改ssh密码 passwd [user] 2、改数据库密码 进入数据库 mysql -uroot -proot 改密码 update mysql.user set passwordpassword(新密码) where userroot; 查看用户信息密码 select host,user,password from mysql.user; 改配置文件 (否则会宕机…...
C#基于SkiaSharp实现印章管理(10)
向PDF文件插入印章图片比之前实现的向图片文件插入印章麻烦得多。 最初的想法是使用PDF浏览控件在线打开PDF文件,然后在控件中实现鼠标移动时动态显示印章,点击鼠标时向当前PDF页面的鼠标点击位置插入图片。由于是.net 8的Winform项目,选…...
通过栈实现字符串中查找是否有指定字符串的存在
题目示例: 分析 由与没有给出字符串的长度,所以只能通过getline一次性处理,而在输入后恰好能倒序处理字符串,以标点符号为分界点,将数字当成字符放到栈里,遇到下一个标点符号时执行查找操作,…...
MongoDB伪分布式部署(mac M2)
1. 序言 本博客是上一博客的进阶版:mac M2安装单机版 MongoDB 7.x,上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB,实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集? …...
Golang | Leetcode Golang题解之第454题四数相加II
题目: 题解: 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重现,佛陀楼阁山水画卷
在数字艺术和创意领域,[ComfyUI]Flux以其独特的虚实结合技术,已经成为艺术家和设计师们手中的利器。今天,我们激动地宣布,[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品,经典中文元素通过AI技术重现,包…...
Linux 系统 nvm 管理node无法使用
文章目录 一、报错说明二、报错原因三、解决办法四、验证 一、报错说明 centos7服务器使用nvm安装的node之后,只要使用npm或者node,均会出现以下问题。 npm -v node: /lib64/libm.so.6: version GLIBC_2.27 not found (required by node) node: /lib64…...
信号处理快速傅里叶变换(FFT)的学习
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来&am…...
vue3项目el-table表格行内编辑加输入框校验
核心点 1. el-form的model属性需要跟el-form-item的prop要对应 2. el-form的model属性绑定tableData 3. el-form-item的prop绑定字符串:scope.index.列名(注意有个点) 4. el-form-item需要单独设置rules属性 代码示例 <el-form :mod…...
【Node.js】内置模块FileSystem的保姆级入门讲解
作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:Vscode 本文代码都经由博主PleaSure乐事实操后得出,可以放心使用。 1.FileSystem介绍 Node.js 的 fs(filesystem)模块是一个核心模块,…...
问:LINUXWINDOWS线程CPU时间如何排序?
Linux 在Linux上,你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式,-e选项表示显示所有进程,--sort选项用于排序。 ps -e -o pid,tid,comm,…...
postgresql-重复执行相同语句,试试 prepare!
文章目录 每次你向 PostgreSQL 发送 SQL 语句时,数据库都必须对其进行解析(parse)。解析虽然很快,但如果同样的语句被解析一千次,这种操作累积起来可能会占用大量时间,而这些时间本可以用于处理其他事务。为避免这种情况ÿ…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
