数据结构基础讲解(一)——线性表之顺序表专项练习

news2024/12/25 10:01:25

 

本文数据结构讲解参考书目:

通过网盘分享的文件:数据结构  C语言版.pdf
链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwd=ze8e 提取码: ze8e

目录

前言

一.线性表的定义

二.线性表的基本操作

三.线性表的顺序存储和表示

四.顺序表中基本操作的实现

1.顺序表的初始化

【算法步骤】

【算法描述】

2.顺序表的取值

【算法步骤】

3.顺序表的查找

【算法步骤】

【算法描述】

4.顺序表的插入

[算法步骤】

【算法描述】

5.顺序表的删除

[算法步骤】

【算法描述】


前言

线性表是最常用且最简单的一种数据结构。简单的讲一个线性表就是n个数据元素的有限序列。(A,B,C......Z)其中这就表示是一个线性表,A称为元素,它可以是一个数或一种符号,甚至是更复杂的信息。

如果在稍微复杂的线性表中,一个数据元素可以由若干个数据项组成,在这种情况下,把数据元素称作为记录,含有大量记录的线性表称为文件。

注:线性表中的数据元素可以是各种各样的,但同一线性表中的元素必定有相同特性,即属于同一数据对象,相邻数据元素之间存在的序偶关系。

将线性表记作:

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

一.线性表的定义

ADT List

{

数据对象

数据关系

基本操作

}

二.线性表的基本操作

基本操作初始条件操作结果
InitList(&L)\构造一个空的线性表L
DestroyList(&L)线性表L已存在销毁线性表L
ClearList (&L)线性表L已存在将L重置为空表
ListEmpty(L)线性表L已存在若L为空表, 则返回true, 否则返回false
ListLength(L)线性表L已存在返回L中数据元素个数
GetElem(L,i,&e)线性表L巳存在,且1<=i<=ListLength(L)用e返回L中第1个数据元素的值
LocateElem(L,e)线性表L已存在返回L中第1个 值与e相同的元素在 L中的位置 。若这样的数据元素不存在 , 则返回值为0
PriorElem(r,,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中第1个位置之前插入新的数据元素 e, L的长度加1
ListDelete(&L,i)线性表L已存在且非空 ,且1<=i<=ListLength(L)删除L的第1个数据元素,L的长度减1
TraverseList(L)线性表L巳存在对线性表L进行遍历,在遍历过程中对 L的每个结点访问一次

三.线性表的顺序存储和表示

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素, 这种表示 也称作线性表的顺序存储结构或顺序映像。

通常, 称这种存储结构的线性表为顺序表(Sequential List)。其特点是,逻辑上相邻的数据元素, 其物理次序也是相邻的。

则线性表中第i+ 1个数据元素的存储位置LOC(a+1)和第i个数据元素的存 储位置LOC(a;)之间满足下列关系:

LOC(a+ 1) = LOC(a) + I(l表示每个元素占用的存储单元)

一般来说, 线性表的第l个数据元素ai的存储位置为:

LOC(ai) = LOC(a1) + (i - 1) x l

四.顺序表中基本操作的实现

1.顺序表的初始化

【算法步骤】

1.为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。

2.将表的当前长度设为0。

【算法描述】
Status InitList(SqList &L)

{//构造一个空的顺序表 L

L.elem= new ElemType[MAXSIZE];        / /为顺序表分配一个大小为MAXSIZE的数组空间

if (! L. elem) exit (OVERFLOW);      //存储分配失败退出

L.length=0;               //空表长度为0

return OK;

}

动态分配线性表的存储区域可以更有效地利用系统的资源 , 当不需要该线性表时 , 可以使用 销毁操作及时释放占用的存储空间。

2.顺序表的取值

取值操作是根据指定的位置序号i, 获取顺序表中第i个数据元素的值。 由千顺序存储结构具有随机存取的特点 , 可以直接通过数组下标定位得到,elem[ i-1]单元存 储第i个数据元素。

【算法步骤】

1.判断指定的位置序号 i 值是否合理 (<=i<=L.length), 若不合理,则返回ERROR。

2.若 i 值合理,则将第 i 个数据元素 L.elem[i-1]赋给参数 e, 通过 e返回第 i个数据元素的 传值。

【算法描述】

Status GetElem(SqList L,int i,ElemType &e) 
{
if {i<ll li>L.length) return ERROR; //判断l. 值是否合理,若不合理, 返回 ERROR
e=L.elem[i一 1];    //elem[i-1] 单元存储第 i 个数据元素
return OK;
}

顺序表取值算法的时间复杂度为O(1)

3.顺序表的查找

【算法步骤】

1.从第一个元素起,依次和 e相比较,若找到与 e相等的元素 L.elem[i], 则查找成功,返回 该元素的序号 i+1。

2.若查遍整个顺序表都没有找到,则查找失败, 返回0。

【算法描述】
int LocateELem(SqList L,ElemType e) 
{//在顺序表1中查找值为e的数据元素, 返回其序号
for(i=O;i< L.length;i++)     
if(L.elem[i)==e) return i+l;     //查找成功, 返回序号 i+l
return O;       //查找失败, 返回 0
}

当在顺序表中查找一个数据元素时,其时间主要耗费在数据的比较上, 而比较的次数取决千 被查元素在线性表中的位置。

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

顺序表按值查找算法的平均时间复杂度为 O(n)。

4.顺序表的插入

[算法步骤】

1.判断插入位置l是否合法(i 值的合法范围是1<=i<=n+ I), 若不合法 则返回 ERROR。

2.判断顺序表的存储空间是否已满,若满见肤返回 ERROR。

3.将第n个至第l个位置的元素依次向后移动一个位置,空出第l个位置(i =n+1时无需 移动)。

4.将要插入的新元素e放入第i个位置.

5.表长加1。

【算法描述】
Status Listinsert(SqList &L,int i ,ElemType e) 
{//在顺序表 L 中第 l. 个位置之前插入新的元素 e, i值的合法范围是 1<=i<=L.length+l 
if((i<l) || (i>L.length+l)) return ERROR;    //i值不合法
if(L.length==MAXSIZE) return ERROR;          //当前存储空间已满
for (j=L. length-1; j>=i-1; j--) 
L.elem[j+l]=L.elem[j];     // 插入位置及之后的元素后移
L.elem[i-l)=e;              //将新元素e放入第l个位置
++L.length;                  //表长加1
return OK; 
}

顺序表插入算法的平均时间复杂度为 O(n) 

5.顺序表的删除

一般情况下,删除第i(1<=i<=n) 个元素时需将第i+ 1 个至第n 个元素(共 n-i 个元素) 依次向前移动一个位置 (i = n 时无需移动)。

[算法步骤】

1.判断删除位置 i是否合法(合法值为1<=i<=n), 若不合法则返回 ERROR。

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

3.表长减 1。

【算法描述】
Status ListDelete(SqList &L,int i) 
{//在顺序表L中删除第J.个元素,J.值的合法范围是 1<=i<=L. length 
if((i<l) || (i>L.length)) return ERROR;        //i值不合法
for (j=i; j <=L. length-1; j ++) 
L.elem[j-1)=1.elem[j);          //被删除元素之后的元素前移
--L.length;                //表长减1
return OK; 
}

顺序表删除算法的平均时间复杂度为O(n)

顺序表可以随机存取表中任一元素,其存储位置可用一个简单、直观的公式来表示。然而, 从另一方面来看,这个特点也造成了这种存储结构的缺点:在做插入或删除操作时,需移动大 最元素。 另外由千数组有长度相对固定的静态特性, 当表中数据元素个数较多且变化较大时, 操作过程相对复杂,必然导致存储空间的浪费。 所有这些问题,都可以通过线性表的另一种表 示方法�式存储结构来解决。

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

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

相关文章

如何设置好看的电脑屏保?电脑屏保设置教程

如何设置好看的电脑屏保&#xff1f;电脑屏保设置教程。大家好&#xff0c;今天小编给大家带来了好看的电脑屏保&#xff0c;教大家如何设置一个好看的电脑屏保。屏保软件很多&#xff0c;今天我们介绍一款比较有特殊的屁屏保软件&#xff1a;芝麻时钟&#xff08;芝麻时钟 桌面…

【C++二分查找】1760. 袋子里最少数目的球

本文涉及的基础知识点 C二分查找 LeetCode1760. 袋子里最少数目的球 给你一个整数数组 nums &#xff0c;其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次&#xff1a; 选择任意一个袋子&#xff0c;并…

AMEsim和Simulink联合仿真生成新的.mexw64液压模型文件

AMEsim和Simulink进行联合仿真非常重要的就是AMEsim经过第四阶段Simulation会在相同文件下面生成一个与AMEsim液压模型相同名字的.mexw64文件&#xff0c;在Simulink进行联合仿真的S-Function需要找的也就是这个文件&#xff0c;只不过输入的时候除了液压模型名字之外&#xff…

形态学运算合集

圆形结构元素 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

Post-Training有多重要?一文带你了解全部细节

1. 简介 随着LLM学界和工业界日新月异的发展&#xff0c;不仅预训练所用的算力和数据正在疯狂内卷&#xff0c;后训练&#xff08;post-training&#xff09;的对齐和微调方法也在不断更新。InstructGPT、WebGPT等较早发布的模型使用标准RLHF方法&#xff0c;其中的数据管理风…

Git撤销add

git要提交版本第一步是add&#xff0c;就算是文件本身已经存在只是修改&#xff0c;也需要添加&#xff0c;即添加到暂存区。其中最偷懒和也保险的命令是&#xff1a; git add . 即添加了本地&#xff08;多称工作目录&#xff09;所有文件。 撤销add有以下文章&#xff1a; …

解决SRS流媒体服务服务器无法接收客户端ipv6 RTMP推流的思路

这篇短文我不介绍SRS是什么&#xff0c;主要介绍一个场景问题&#xff0c;场景是你使用服务器并且部署了SRS服务配置成一个媒体流转发服务&#xff0c;也就是客户端往SRS流媒体服务器推流&#xff0c;然后SRS把流转推出去&#xff0c;但是会涉及到一个问题是&#xff1a;用户客…

人工智能时代开启ai代写模式,让创作变得更加简单!

随着人工智能技术的飞速发展&#xff0c;我们的生活和工作方式正在发生翻天覆地的变化。在这个信息爆炸的时代&#xff0c;内容创作领域也迎来了新的变革——ai代写。这一模式的出现&#xff0c;让文章写作变得更加简单高效&#xff0c;为创作者们打开了新的可能。 一、ai代写的…

短剧影视小程序任意文件读取

1 漏洞描述&#xff1a; 任意文件读取&#xff1a; 在/Ems.php 控制器中的 juhecurl 方法存在curl_exec函数&#xff0c;且参数url为用户可控&#xff0c;导致漏洞产生 2 搜索语句&#xff1a; Fofa&#xff1a; "/VwmRIfEYDH.php" 3 漏洞复现&#xff1a; poc …

JVM - 字节码文件详解

文章目录 目录 文章目录 1. 无关性基石 2. Class类文件结构 magic- 魔数 主副版本号 常量池 访问标志 类索引,父类索引与接口索引集合 字段 方法 属性 3. 类加载机制 类的生命周期 类加载过程 加载 连接 验证 准备 解析 初始化 4. 类加载器 类与类加载器…

RT-Thread Nano版本在STM32G474上的快速移植

目录 概述 1 RT-Thread Nano 1.1 Nano版本介绍 1.2 RT-Thread Nano的特点 2 STM32Cube创建项目 2.1 配置参数 2.2 RT-Thread配置 3 RT-Thread适配MCU 3.1 预编译代码 3.2 解决编译错误 3.2.1 配置OS_TICK 3.2.2 使能finsh_config.h 3.3.3 移植FINSH 3.3 配置TICK …

《黑神话:悟空》专题合集MOD/修改器/壁纸/音乐/CG剧情

《黑神话&#xff1a;悟空》专题合集」 链接&#xff1a;https://pan.quark.cn/s/d67857f4e308 包含内容: 《黑神话&#xff1a;悟空》MOD合集 《黑神话&#xff1a;悟空》修改器&#xff08;风灵月影&#xff09; 《黑神话&#xff1a;悟空》壁纸合集 《黑神话&#xff1…

gpedit.msc本地组策略编辑器,结果发现竟然打不开了

本地组策略编辑器&#xff0c;结果发现竟然打不开了。 1建一个txt文件 List.txt &#xff0c;粘贴如下内容&#xff08;全部复制新粘贴哈&#xff09;&#xff1a; echo offpushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-Clie…

<Rust>egui学习之部件(十一):如何在窗口中添加单选框radiobutton部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第十一篇…

SpringBoot3+Vue3开发商店上货管理系统

系统介绍 上货管理系统是专门为各种类型商店打造的一款进货管理系统。针对整个商店进货流程&#xff0c;提供很多方便功能&#xff0c;帮助店家完成上货流程。比如上货清单管理功能、上货清单确认功能、供货商管理功能、商品管理功能等。 技术栈 后端&#xff1a;SpringBoot…

C++从入门到起飞之——priority_queue(优先级队列) 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、priority_queue的介绍 2、priority_queue的使用 3、priority_queue的模拟实现 3.1、仿函数的介…

Redis-主从集群

主从架构 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 主从数据同步原理 全量同步 主从第一次建立连接时&#xff0c;会执行全量同步&#xff0c;将master节点的所有数据都拷贝给sla…

Microsoft SC-100: Microsoft 网络安全架构师

SC-100认证介绍 Microsoft SC-100: Microsoft 网络安全架构师是微软网络安全方向的相关证书&#xff0c; 作为 Microsoft 网络安全架构师&#xff0c;你要将网络安全策略转化为保护组织的资产、业务和运营的功能。 你要设计、指导实现和维护遵循零信任原则和最佳做法的安全性解…

最新HTML5中的文件详解

第5章 HTML5中的文件 5.1选择文件 可以创建一个file类型的input,添加multiple属性为true,可以实现多个文件上传。 5.1.1 选择单个文件 1.功能描述 创建file类型input元素&#xff0c;页面中不再有文本框&#xff0c;而是 选择文件 按钮&#xff0c;右侧是上次文件的名称&a…

中秋将至,邮寄中秋礼品怎么才安心?

中秋节&#xff0c;是中华民族的传统佳节&#xff0c;承载着人们对团圆的期盼和对亲人的思念。在这个温馨的节日里&#xff0c;中秋礼品成为了许多人传递情感的方式。 在这个数字化的时代&#xff0c;虽然一通电话、一个视频就能拉近人与人之间的距离&#xff0c;但一份实实在在…