数据结构之线性表插入与删除运算

线性表

线性表的定义

线性表,或称表,是一种非常灵便的结构,可以根据需要改变表的长度,也可以在表中任何位置对元素进行访问、插入或删除等操作。另外,还可以将多个表连接成一个表,或把一个表拆分成多个表。例如,26个英文字母的字母表:(A,B,C,…,Z)就是一个线性表,表中的数据元素是单个字母。在稍复杂的线性表中,一个数据元素可以包含若干个数据项。例如在学生基本信息表中,每个学生为一个数据元素,包括学号、姓名、性别、籍贯、专业等数据项。

由以上示例可以看出,它们的数据元素虽然不同,但同一线性表中的元素必定具有相同的特性,即属于同一数据对象,相邻数据元素之间存在着序偶关系

诸如此类由n(n≥0)个数据特性相同的元素构成的有限序列称为线性表。线性表中元素的个数 n(n≥0)定义为线性表的长度,n=0时称为空表

对于非空的线性表或线性结构,其特点是:

  • 存在唯一的一个被称作第一个的数据元素
  • 存在唯一的一个被称作最后一个的数据元素
  • 除第一个数据元素之外,结构中的每个数据元素均只有一个前驱
  • 除最后一个数据元素之外,结构中的每个数据元素均只有一个后继

线性表的顺序存储结构

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,用顺序存储结构的线性表称为顺序表。其特点是,逻辑上相邻的数据元素,其物理次序也是相邻的

假设线性表的每个元素需占用x个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。则线性表中第 i+1 个数据元素的存储位置LOC(ai+1)和第 i 个数据元素的存储位置LOC(ai)之间满足下列关系:

LoC(ai+1)=LOC(ai)+x

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

LoC(ai)=LOC(ai)+(i-1)x

式中,LOC(a1)是线性表的第一个数据元素a1的存储地址位置,通常称作线性表的起始位置或基地址,表中相邻的元素aiai+1的存储位置是相邻的,每一个数据元素的存储位置都和线性表的起始位置相差一个常数,如图所示。

在这里插入图片描述

只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构

线性表的插入与删除运算

插入

线性表的插入操作是指在表的第 i(1 ≤ i ≤ n十1)个位置插人一个新的数据元素e,使长度为n的线性表变成长度为n+1的线性表

数据元素之间的逻辑关系发生了变化。在线性表的顺序存储结构中,由于逻辑上相邻的数据元素在物理位置上也是相邻的,因此,除非i=n+1,否则必须移动元素才能反映这个逻辑关系的变化。

在这里插入图片描述

如上图所示为一个线性表在插人新的数据元素前后数据元素在存储空间中的位置变化。为了在线性表的第5个位置上插人一个值为25的数据元素,则需将第5个至第8个数据元素依次向后移动一个位置。长度也发生变化,从原本n=8变成n=9

一般情况下,在第i(1 ≤ i ≤ n)个位置插入一个元素时,需从最后一个元素即第n个元素开始,依次向后移动一个位置,直至第i个元素(共n-i+1个元素)。仅当插入位置i=n+1时,才无须移动数据元素

算法步骤:

  • 判断插人位置i是否合法,若不合法则返回ERROR
  • 判断顺序表的存储空间是否已满,若满则返回 ERROR
  • 将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n十1时无须移动)
  • 将要插入的新元素e放入第i个位置。
  • 表长加 1。

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

删除

线性表的删除操作是指将表的第i ( 1 ≤ i ≤ n)个元素删去,将长度为n的线性表变成长度为n-1的线性表。数据元素之间的逻辑关系发生了变化,为了在存储结构上反映这个变化,同样需要移动元素。

在这里插入图片描述

如上图所示,为了删除第4个数据元素,必须将第5个至第8个元素都依次向前移动一个位置

算法步骤:

  • 判断删除位置i是否合法,若不合法则返回ERROR。
  • 将第i+1个至第n个的元素依次向前移动一个位置(i=n时无须移动)。
  • 表长减 1。
    由此可见,顺序表删除算法的平均时间复杂度为O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Solidworks:钣金设计中的参数设定

利用草图工具画一个折线,夹角135度、边长为5mm。参见下图: 然后利用此草图创建钣金基本法兰: 调整视图角度,看一下钣金件与草图的关系: 可以看出,默认情况下草图中的线段对应钣金件的外侧。可以调整“钣…

Innodb底层原理与Mysql日志机制深入剖析

MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函…

Redis篇----第七篇

系列文章目录 文章目录 系列文章目录前言一、Redis 的回收策略(淘汰策略)?二、为什么 edis 需要把所有数据放到内存中?三、Redis 的同步机制了解么?四、Pipeline 有什么好处,为什么要用 pipeline?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍…

Android的Compose

Jetpack Compose 是用于构建原生 Android 界面的新工具包,无需修改任何 XML 布局,也不需要使用布局编辑器。相反,只需调用可组合函数来定义所需的元素,Compose 编译器即会完成后面的所有工作。 简而言之,使用Compose&…

数据脱敏(五)脱敏算法-变换算法

脱敏算法篇使用阿里云数据脱敏算法为模板,使用算子平台快速搭建流程来展示数据 "变换脱敏"是一种数据处理技术,主要用于保护个人隐私和数据安全。它通过将敏感信息(如姓名、身份证号、电话号码等)进行某种形式的转换,使…

SpringBoot自动注入源码分析

Spring Boot何时注入Autowired标注的属性? 是在Bean实例化后,填充Bean的时候注入Autowired标注的属性 如果注入类型的Bean存在多个,Spring Boot是如何处理的? 如果存在多个类型的Bean,会根据primary—>javax.ann…

Redis典型应用之分布式锁

目录 前言 分布式锁的基础实现 引入过期时间: 引入校验ID: 引入lua lua的简介: 引入看门狗 (watch dog) 引入Redlock算法 前言 在一个分布式系统中,也会涉及到多个节点同时去访问一个公共资源的时候&am…

ArcGIS API for JavaScript 4.X 本地部署(js,字体)

0 目录(4.19) /4.19/ 1 修改文件 1.1 init.js 编辑器打开/4.19/init.js搜索文本[HOSTNAME_AND_PATH_TO_JSAPI],然后将其连同前面的https://替换为http://ip地址/4.19,可以是localhost,只能本机引用 替换后&#xff…

Selenium 自动化测试—如何搭建自动化测试环境

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前…

【linux】体系结构和os管理

冯诺依曼体系结构 输入单元:包括键盘, 鼠标,扫描仪, 写板等 中央处理器(CPU):含有运算器和控制器等 输出单元:显示器,打印机等 这里的存储器指的是内存 三者是相互连接的,设备之间会进行数据的来回拷贝&am…

社区店经营全攻略:如何选址、运营并打造火爆生意?

随着电商的兴起,实体店的经营面临着越来越多的挑战。然而,社区店依然具有独特的优势,如便捷的地理位置、与消费者的紧密互动等。 作为在社区店开鲜奶吧5年的创业者,我深有感触,那么这篇文章将为你提供最有价值的干货信…

计算机设计大赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…