线性表 顺序表数组

news2024/11/15 13:36:41

初识线性表

文章目录

  • 初识线性表
    • 线性表的类型定义
      • 基本操作(一)init,destory,clear
      • 基本操作(二) 判空 ,求长
      • 基本操作(三)取值,取位置
      • 基本操作(四)取前驱,取后继
      • 基本操作(五)插入
      • 基本操作(六) 删除
    • 线性表的顺序存储结构实现
      • 基本操作实现
    • 线性表的小结

由n(n≥0)个数据特性相同的元素构成的有限序列称为线性表。

img

线性表的特点

线性表中元素的个数n(n≥O)定义为线性表的长度,n=0时称为空表。

将非空的线性表(n>O)记作(a1,a2,a3,…,an)

这里的数据元素ai(1≤i≤n)只是个抽象的符号,其具体含义在不同情况下可以不同。

在非空的线性表,有且仅有一个开始结点a1,它没有直接前趋,而仅有一个直接后继a2;

有且仅有一个终端结点an,它没有直接后继,而仅有一个直接前趋an-1;

其余的内部结点ai,(2<i<n-1)都有且仅有一个直接前趋ai-1和一个直接后继ai+1

线性表的例子

26个英文字母的字母表:(A, B, C, …,Z);学生信息表;12星座。

同一线性表中的元素必定具有相同的特性,数据元素之间关系是线性的。

案例引入

img

逻辑结构抽象为线性表存储结构呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vGJqGNRc-1677728036862)(https://typora01u.oss-cn-beijing.aliyuncs.com/img/8823c906008c1dc04447be453964f97f10d9058b.png@437w_69h_progressive.webp)]

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TpVMVYVC-1677728036862)(https://typora01u.oss-cn-beijing.aliyuncs.com/img/7e847d9bbf0f3126aa0151016c58e4ceb1f7997b.png@272w_77h_progressive.webp)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TnYQEqDH-1677728036862)(https://typora01u.oss-cn-beijing.aliyuncs.com/img/e40f15560243aaf01e64866cbcea9afa52ef53c9.png@848w_155h_progressive.webp)]

的多项式时,就要用一个长度为20001的线性表来表示,而表中仅有3个非零元素,此时将会造成存储空间的很大浪费,由此可改变元素设定,对多项式的每一项,可用(系数,指数)唯一确定。

img

每一个系数与指数也构成了一个线性表只不过是线性表的每个数据元素有2个数据项

用 结构体数组存储,(结构体实现每一项。)

多项式加法

  • 加法

A=((7,0),(3,1),(9,8),(5,17))[4项]

B=((8,1),(22,7),(-9,8),)[3项]

创建一个新的多项式c用来存放a与b和
分别从头遍历比较a和b的每一项
指数相同,对应系数相加,若其和不为零,则在c中增加一个新项
指数不相同,则将指数较小的项复制到c中
一个多项式已遍历完毕时,将另一个剩余项依次复制到c中即可

和有多少项呢?

最少:指数一样,系数正好互为相反数项数为0最多指数都不一样项数为元素个数之和。项数不容易确定太大了浪费空间,太小了放不下。

顺序存储结构存在问题存储空间分配不灵活;运算的空间复杂度高

尝试链式存储结构(不需要额外的空间只利用已有的空间)

img

imgimg

逻辑结构:根据图书表的特点将其抽象成一个线性表,每本图书作为线性表中的一个元素

存储结构:
a.顺序

img

b.链式

img

比较这两种存储结构的优缺点根据实际情况,选择适当的存储结构,实现此存储结构上的基本操作,利用基本操作完成功能。当然学生信息管理也是类似的

线性表的类型定义


线性表的存储结构

在计算机中线性表有两种存储结构:1. 顺序存储结构 2. 链式存储结构

抽象数据类型线性表的定义如下

ADT List {
数据对象:D = { ai丨ai属于Elemset,(i = 1,2,3…)}
数据关系:R = {<ai-1 , ai丨ai-1 , ai 属于D,(i = 1,2,3…) >}
基本操作:

​ InitList(&L); DestroyList(&L);

​ ListInsert(&L,i,e); ListDelete(&L,i,&e);

​ } ADT List

基本操作(一)init,destory,clear

InitList(&L)

操作结果:构造一个空的线性表L

DestoryList(&L)

初始条件:线性表L已经存在

操作结果:销毁线性表L

ClearList(&L)

初始条件:线性表L已经存在

操作结果:将线性表L重置为空表

基本操作(二) 判空 ,求长

ListEmpty(L)

初始条件:线性表L已经存在

操作结果:若线性表L为空表(n=0),则返回TURE ,否则返回FALSE

Listlength(L)

初始条件:线性表L已经存在

操作结果:返回线性表L中元素的个数

基本操作(三)取值,取位置

GetElem(L,i,&e)

初始条件:线性表L已经存在,1≤ i ≤ ListLength(L)

操作结果:用e返回线性表L中第i个数据元素的值

LocateElem(L,e,compare())

初始条件:线性表L已经存在,compare()是数据元素判定函数。

操作结果:返回L中第一个与e满足compare()的数据元素的位序。若这样的数据元素不存在,则返回为0.

基本操作(四)取前驱,取后继

priorElem(L,cur_e,&pre_e)

初始条件:线性表L已经存在

操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回他的前驱,否则操作失败;pre_e无意义

NextElem(L,cur_e,&next_e)

初始条件:线性表L已经存在

操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回他的后继,否则操作失败;next_e无意义

基本操作(五)插入

ListInsert(&L,i,e)

初识条件:线性表L已经存在,1≤ i ≤ ListLength(L)+1

操作结果:在L的第i个位置==之前==插入新的数据元素e,L的长度+1

基本操作(六) 删除

ListDelete(&L,i,&e)

初识条件:线性表L已经存在,1≤ i ≤ ListLength(L)

操作结果:删除L的第i个元素,并用e返回其值,L的长度-1

ListTraverse(&L,visited())

初识条件:线性表L已经存在

操作结果:依次对线性表中每个元素调用visited()

线性表的顺序存储结构实现

**线性表的顺序表示(又称顺序存储结构或顺序映象) **

img

顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。

线性表的第1个数据元素a1的存储位置称为线性表的起始位置或基地址

线性表的顺序存储结构是指用一段地址连续的存储单元依次存储线性表的数据元素。

例如:线性表(1,2,3,4,5,6)

img

顺序存储结构的寻址公式

img

数组长度与线性表长度

数组长度,线性表最多可容纳数据元素的个数

线性表长度(length):当前数据元素个数

一个教室最多容纳50人(数组长度/线性表的最大存储容量),但现在教室里坐着34(线性表中当前元素个数)个数。

由于顺序表中的元素要求地址连续、依次存放、随机存取、类型相同,高级程序设计语言当中可以用一维数组来实现

一维数组的定义方式:

类型说明符 数组名[常量表达式]

说明:常量表达式中可以包含常量和符号常量(宏命名),不能包含变量。即C语言中不允许对数组的大小作动态定义。

线性表经常进行插入和删除的操作长度可变而C中数组的长度是不可变的。

用一个额外的变量表示线性表的长度

img

img

img

ElemType是根据实际问题,你需要什么类型的数组就定义成什么,一般是根据问题定义一个结构体或者是 typedef char ElemType

**数组的定义 **

img

数组名其实就是首元素的地址所以也可以直接定义一个指针。数组的大小用相应的函数来动态分配内存

img

用结构体变量名.成员变量名对成员访问;指针:SqList *p=&L;p->data=…;

1.malloc()函数是在程序运行时分配内存的重要工具接受一个参数:所需的内存字节数但并不会为其赋名.然而,但他确实返回了动态分配内存块的首地址.因此可以把该地址赋给一个指针变量,并使用指针访问这块内存注意要强制类型转换

(类型说明符*)malloc(size);

如向内存要100个int(类型说明符*)malloc(100*sizeof(int));

2.sizeof(x)计算变量/数据类型x所占据的字节数

3.free§释放指针p所指变量的存储空间,即彻底删除一个变量

需要加载头文件<stdlib.h>

C++内容

img

img

定义一个线性表 类型说明 变量名SqList L;

SqList L; 定义变量L ,L是SqList这种类型的,L是个顺序表

基本操作实现

操作中常用的预定义常量与类型

img

初始化(分配空间;赋初值)

img

销毁线性表

img

线性表置空/清空线性表

img

求表长

img

判断线性表是否为空

img

线性表的按值查找算法(在查找的一章还要详细介绍,这里我们先说最简单的顺序查找)

img

img

查找算法的算法分析

查找算法的基本操作:将记录的关键字同给定值进行比较(L.elem==e)

img

比较的次数与输入的定值e有关(假设7个数字出现的概率均为1/7)
当e=a,1次;当e=b,2次;当e=c,3次;…e=g,7次
平均比较次数(1+2+3+…+7)/7=4

在查找时,为确定元素在顺序表中的位置,需和给定值进行比较的数据元素个数的期望值称为查找算法在查找成功时的平均查找长度(AverageSearch Length, ASL)

img

img

插入算法

(在线性表a3位置之前插入一个新元素e(e=6))

img

img

插入位置在最后在线性表的最后添加一个元素不需要移动直接添加

插入位置在最前在原线性表的第1个元素之前插入一个新的元素,线性表的所有元素都要移动 移动次数最多

插入位置在中间如上例

img

img

img

删除操作

img

①判断删除位置i是否合法(合法值为1≤i≤n)

②将欲删除的元素保留在e当中

③将第i+l个至第n个的元素依次向前移动一个位置(i= n时无需移动)

④表长减1

img

删除算法分析

img

线性表的小结

查找、插入、删除的平均算法复杂度为O(n)

空间复杂度显然顺序表操作没有占用辅助空间算法的空间复杂度O(1)

线性表的优缺点

优点

存储密度大(结点本身所占用的空间/结点结构所占存储量=1)无需为表示表中元素之间的逻辑关系,而增加额外的存储空间

可以随机存取表中任意位置的元素

缺点

插入、删除某一元素需移动大量元素

当线性表长度变化较大时,难以确定存储空间的容量,数据元素的个数不能自由扩充(存储空间不灵活)

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

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

相关文章

图解LeetCode——剑指 Offer 12. 矩阵中的路径

一、题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…

Solon2 的应用生命周期

Solon 框架的应用生命周期包括&#xff1a;一个初始化函数时机点 六个事件时机点 两个插件生命时机点 两个容器生命时机点&#xff08;v2.2.0 版本的状态&#xff09;&#xff1a; 提醒&#xff1a; 启动过程完成后&#xff0c;项目才能正常运行&#xff08;启动过程中&…

基于麻雀算法改进的BP神经网络客流量预测,SSA-BP

目录 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数&#xff0c; BP神经网络的传递函数 麻雀算法原理 麻雀算法主要参数 麻雀算法流程图 麻雀算法优化测试函数代码 基于麻雀算法改进的BP神经网络坑基监测 数据 matlab…

Windows 11 安装 Docker Desktop

Windows 环境安装 WSL2 WSL 简介 WSL 全称是 Windows Subsystem for Linux &#xff0c;适用于 Linux 的 Windows 子系统&#xff0c;可让开发人员按原样运行 GNU/Linux 环境&#xff0c;包括大多数命令行工具、实用工具和应用程序&#xff0c;且不会产生传统虚拟机或双启动设…

低线城市外卖市场逐渐下沉,创业者如何有效开展本地外卖平台

近年来&#xff0c;我国网上外卖营业额不断上升&#xff0c;使我国餐饮业的比重越来越高。 随着外卖市场的下沉&#xff0c;低线城市的用户开始使用外卖平台 由于我国在线外卖行业逐渐成熟&#xff0c;一、二线主流市场逐渐饱和&#xff0c;外卖行业逐渐开始向低线城市发展&…

非标自动化设备远程监控解决方案

为了实现企业自动化生产&#xff0c;提高工作效率和稳定性&#xff0c;需对整个工厂进行远程监控和管理。 在工厂建立了一个远程监控系统&#xff0c;可以实现对工业自动化的设备状态进行远程实时监控&#xff0c;同时可以利用无线网络技术来实现对设备的数据采集和远程管理。 …

Guava ——Joiner和Splitter

大家好&#xff0c;这里是一口八宝周&#x1f44f;欢迎来到我的博客❤️一起交流学习 文章中有需要改进的地方请大佬们多多指点 谢谢&#x1f64f;在本篇文章中&#xff0c;我将用实例展示&#xff0c;如何使用Joiner将集合转换为 String &#xff0c;以及使用Splitter将 Strin…

如何使用EvilTree在文件中搜索正则或关键字匹配的内容

关于EvilTree EvilTree是一款功能强大的文件内容搜索工具&#xff0c;该工具基于经典的“tree”命令实现其功能&#xff0c;本质上来说它就是“tree”命令的一个独立Python 3重制版。但EvilTree还增加了在文件中搜索用户提供的关键字或正则表达式的额外功能&#xff0c;而且还…

Android性能优化系列篇:弱网优化

弱网优化1、Serializable原理通常我们使用Java的序列化与反序列化时&#xff0c;只需要将类实现Serializable接口即可&#xff0c;剩下的事情就交给了jdk。今天我们就来探究一下&#xff0c;Java序列化是怎么实现的&#xff0c;然后探讨一下几个常见的集合类&#xff0c;他们是…

sklearn中的数据预处理和特征工程

目录 一.数据挖掘的五大流程 1. 获取数据 2. 数据预处理 3. 特征工程&#xff1a; 4. 建模&#xff0c;测试模型并预测出结果 5. 上线&#xff0c;验证模型效果 二.数据预处理 1.数据无量纲化 2.preprocessing.MinMaxScaler(数据归一化) 3.preprocessing.Standard…

Linux编译器——gcc/g++(预处理、编译、汇编、链接)

目录 0.程序实现的两大环境 1.gcc如何完成 预处理 编译 汇编 链接 2.动态库与静态库 对比二者生成的文件大小 3. gcc常用选项 0.程序实现的两大环境 任何一个C程序的实现都要经过翻译环境与执行环境。 在翻译环境中又分为4个部分&#xff0c;预编译、编译、汇编与链…

Spring Cloud配置application.yml与bootstrap.yml区别及多profile配置 | Spring Cloud 6

一、前言 Spring Cloud 构建于 Spring Boot 之上&#xff0c;在 Spring Boot 中有两种上下文&#xff0c;一种是 bootstrap&#xff0c;另外一种是 application。 二、bootstrap与application (.yml/.properties) 2.1 两者区别 bootstrap.yml/bootstrap.properties 和 appl…

CHAPTER 3 Web HA集群部署 - Keepalived

Web HA集群部署 - Keepalived1. Keepalived概述1.1 工作原理1.2 核心功能1.3 拓扑图2. KeepAlived安装方式2.1 yum源安装2.2 源码包编译3. KeepAlived安装3.1 环境依赖3.2 安装nginx3.3 安装Keepalived4. Keepalived部署4.1 主备模式1. 节点配置2. 主节点配置文件3. 从节点配置…

金三银四了,准备跳槽的可以看看....

前两天跟朋友感慨&#xff0c;去年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经3月了&#xff0c;具体的金三银四也已经到来了。 对于想跳槽的职场人来说&#xff0c;绝对要已经提前做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也出来了。…

谷粒学苑第七 八 九天

谷粒学苑第七天 上传到服务器 文件上传到接口中 在接口中读取内容 加到数据库 swagger&#xff1a; 报了实体类的错&#xff1a;刚刚这里忘记写数据了 一级二级都查出来了&#xff1a; 课程发布流程确认 报错&#xff1a; 实体类全部改为_STR还是报错 org.springfr…

Java线程池源码分析

Java 线程池的使用&#xff0c;是面试必问的。下面我们来从使用到源码整理一下。 1、构造线程池 通过Executors来构造线程池 1、构造一个固定线程数目的线程池&#xff0c;配置的corePoolSize与maximumPoolSize大小相同&#xff0c; 同时使用了一个无界LinkedBlockingQueue存…

《PyTorch深度学习实践10》——循环神经网络-基础篇(Basic-Recurrent Neural Network)

目录一、RNN简介二、RNN Cell用法三、RNN用法三、实例&#xff1a;hello换序1.RNN Cell2.RNN四、Embedding一、RNN简介 RNN网络最大的特点就是可以处理序列特征&#xff0c;就是我们的一组动态特征。比如&#xff0c;我们可以通过将前三天每天的特征&#xff08;是否下雨&#…

七、SpringBoot_自动装配

自动装配 官方文档 SpringBoot自动配置尝试根据您添加的 jar 依赖项自动配置您的 Spring 应用程序 Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. SpringBoot定义了一套接…

详谈IIC

前言 在嵌入式底层系统中&#xff0c;常见的通讯方式&#xff0c;串口&#xff0c;IIC&#xff0c;SPI&#xff0c;IIS等&#xff0c;一般IIC,SPI,IIS更多的采取IO模拟&#xff0c;其余CAN,UART均是硬件设计直接支持&#xff0c;而IIC主要用于多数传感器数据的读写&#xff0c…

【c++基础】

C基础入门统一初始化输入输出输入输出符输入字符串const与指针c和c中const的区别const与指针的关系常变量与指针同类型指针赋值的兼容规则引用引用的特点const引用作为形参替换指针其他引用形式引用和指针的区别inline函数缺省参数函数重载判断函数重载的规则名字粉碎C编译时函…