【线性表】

         好久没更新啦,来喽来喽~~~

    喏,看这个图,什么意思呢?先容大家思考思考......


目录:

1.线性表的定义

2.线性表的抽象数据类型

3.线性表的顺序存储结构

(1)顺序存储定义

(2)顺序存储方式

  (3)数组长度与线性表长度区别

(4)地址计算方法

4.顺序存储结构的插入与删除

(1)获得元素操作

(2)插入操作

(3)删除操作

(4)线性表顺序存储结构的优缺点


1.线性表的定义

线性表,从名字来听,是不是觉得是具有像线一样性质的表呢?接下来进入正题:

线性表:是零个或者多个具有相同特性的数据元素的有限序列。

说明:首先,其是一个序列,换言之,元素之间是有顺序的,如果说元素存在多个,那第一个元素它是没有前驱,最后一个元素是没有后继的,而其他中间部分的元素有且仅有一个前驱和后继了。

其次,线性表它是有限的!

     线性表在逻辑上是线性结构,也就是说是连续的一条直线,但在物理结构上并非是这个样子的,一般来说,线性表在物理上存储时,通常是以数组和链式结构的形式存储的。(后面我们都会介绍到的哦,不用着急哦~)

2.线性表的抽象数据类型

  对于一个线性表来说,插入数据和删除数据都是必须的操作,所以就会出现线性表的抽象数据类型,如下:

   说明:这些操作是线性表中最基本的一些操作,对于不同场景不同应用,线性表的基本操作是不相同的,如果遇到更复杂的操作,还可以用这些基本操作的组合来实现。

线性表的数据对象集合为{a1,a2,......,an},每个元素的类型均为DataType。数据元素之间的关系是一对一的关系。

3.线性表的顺序存储结构

(1)顺序存储定义

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

(2)顺序存储方式

  线性表的顺序存储结构,简单来讲,就是在内存中找了块空地,通过占位置的方式,把一定的内存空间给占有了,接着把相同数据类型的数据元素依次存放在这块空地中。(由于线性表的每个数据元素它的类型都是一样的,所有我们可以通过用某种程序语言的一维数组进而来实现顺序存储结构。)总结一下就是,把第一个数据元素存到数组下标为0的位置中,然后把线性表相邻的元素存储在数组中相邻的元素即可。

描述顺序存储结构需要的属性:

a:存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。

b:线性表的最大存储容量:数组的长度

c:线性表的当前长度length

(3)数组长度与线性表长度区别

数组长度:存放线性表的存储空间的长度,存储分配后这个量一般是不变的。

线性表长度:线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。

不过,在任意时刻,线性表的长度应该小于等于数组的长度。

(4)地址计算方法

因为在C语言中,数组是从0开始第一个下标的,所以线性表的第i个元素也是要存储在数组下标为 i-1的位置(也就是数据元素的序号和存放它的数组下标之间存在着对应关系)

前面刚提到,数组存储分配后这个量一般是不变化的,也就是要分配固定长度的数组空间,而又因为线性表可以进行修改操作,所以,这里分配的数组空间要大于等于当前线性表的长度! 

   由于每个数据元素,无论是什么类型的,其都需要占有一定的存储单元空间。这里假设一下,帮助大家理解,假设每个数据元素它占用了c个存储单元(存储单元:指存储器中可存放一个字或若干个字节的基本单位),那么,线性表中第 i+1 个数据元素与第 i 个数据元素的存储位置满足关系:

看图可以更快理解哦:

那么,通过这个公式的话,无论遇到什么样的,你都是可以算出线性表中任意位置的地址,这里可就不管它是第一个或者最后一个啦,都是相同的时间。

4.顺序存储结构的插入与删除
(1)获得元素操作

对线性表得顺序存储结构而言,如果将线性表L中的第 i 个位置元素返回,其实蛮简单的,对我们来说,也就是当 i 的数值在数组下标范围内,就是把数组第 i - 1 个下标的值返回就好啦~

上代码,哈哈哈哈

typedef int Status;
//操作结果:用e返回L中第i个数据元素的值
Status GetElem(SqList L, int i, ElemType* e)
{if (L.length == 0 || i<1 || i>L.length)return ERROR;*e = L.data[i - 1];return OK;
}

注意:这里返回值类型Status是一个整型。 

           这里是把指针*e的值修改成L.data[i-1],这才是真正要返回的数据。

(2)插入操作

如果说在线性表L中的第 i 个位置插入新元素e -----ListInsert(*L,i,e) ,又该如何操作呢?

讲思路之前给大家举个例子吧,可能会帮助大家理解哦~

     假如某天早上大家去上课,排队在买早餐,两眼朦胧的排着队,排的好好的,突然来了一位很漂亮的小姐姐,轻声细语的跟你说  同学,不好意思,我可以插个队吗,我昨晚到现在没吃饭,饿的胃都疼,欸,你一瞧,心软了,说好吧,那既然点头答应了,不得自己往后退啊,要不然这位小姐姐进不来,可后面排了好多人嘞,可这是,后面好多人都在骂骂咧咧,也许你前后的人知道因果,可后边的人不知道哇,哗哗一大片吵闹声......那如果说让这个小姐姐插队,是不是只能这样啊,哈哈哈

 思路:

a.如果插入位置不合理,抛出异常;

b:如果线性表长度大于等于数组长度,那么就应该抛出异常或者动态增容;

c:从最后一个元素开始向前遍历到第 i 个位置,然后分别将它们都向后移动一个位置;

d:将要插入元素填入位置 i 处;

e:最后表长加 1;

如果我们把这个思路转换成代码的形式呢?

//插入操作Status ListInsert(SqList* L, int i, ElemType e)
{int m;if (L->length == MAXSIZE)return ERROR;if (i < 1 || i > L->length + 1)return ERROR;if (i <= L->length){for (m = L->length - 1; m >= i - 1; m--){L->data[m + 1] = L->data[m];}}L->data[i - 1] = e;L->length++;return OK;
}
(3)删除操作

如果说,这位小姐姐在后面同学的吵闹中,插队没成功,那大家都往前移动一步,整个队伍是不是恢复原状了~ 那么,这个过程就很类似线性表的顺序存储结构删除元素的过程。

思路:

a:如果删除位置不合理的话,抛出异常;

b:取出删除的元素;

c:从删除元素位置开始遍历到最后一个元素位置,然后分别将它们都向前移动一个位置;

d:最后表长减1;

同理,如果将整个思路转换成代码,又是怎样的呢?

//删除操作
Status ListDelete(SqList* L, int i, ElemType* e)
{int m;if (L->length == 0)return ERROR;if (i<1 || i>L->length)return ERROR;*e = L->data[i - 1];if (i < L->length){for (m = i; m < L->length;m++){L->data[m - 1] = L->data[m];}}L->length--;return OK;
}

通过上面的插入删除,就能够总结出,线性表的顺序存储结构,在读数据的时候,无论处于哪个位置,时间复杂度都是O(1),在插入或者删除数据的时候,时间复杂度都是O(n) 

(4)线性表顺序存储结构的优缺点

好啦,本篇文章就先介绍到这里啦,后面还有一小点内容(线性表的链式存储结构),它会引出我们单链表的到来,所以下篇文章接着分享哦,小编可没有忘记呢~

欢迎各位小伙伴提出问题哦,评论区见吖,可不要忘记看完来个小爱心吆,哈哈哈哈~ 

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

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

相关文章

LeetCode 面试题 02.07. 链表相交

文章目录 一、题目二、C# 题解 一、题目 给你两个单链表的头节点 headA 和 headB&#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null。 图示两个链表在节点 c1 开始相交&#xff1a;   题目数据 保证 整个链式结构中不存在环。…

Vue + Element UI 前端篇(九):接口格式定义

接口请求格式定义 前台显示需要后台数据&#xff0c;我们这里先把前后端交互接口定义好&#xff0c;没有后台的时候&#xff0c;也方便用mock模拟。 接口定义遵循几个规范&#xff1a; 1. 接口按功能模块划分。 系统登录&#xff1a;登录相关接口 用户管理&#xff1a;用户…

Windows无法删除分区怎么办?

我们知道Windows系统内置的磁盘管理工具是一个很实用的程序&#xff0c;可以帮助我们完成很多磁盘分区相关的基础操作&#xff0c;比如当我们想要删除硬盘上的某一个分区时&#xff0c;先想到的可能会是磁盘管理工具。但是当我们准备在磁盘管理工具中删除某个分区时&#xff0c…

ArcGIS Maps SDK for JS(二):MapView简介----创建2D地图

文章目录 1 AMD 引用 ArcGIS Maps SDK for JavaScript2 加载相应模块3 创建地图4 创建 2D 视图 view5 确定页面内容6 CSS 样式7 完整代码 本教程使用 AMD 模块&#xff0c;指导您如何在二维地图视图中创建一个简单的地图。 1 AMD 引用 ArcGIS Maps SDK for JavaScript 在 <…

【zookeeper】zookeeper日常运维

本文将分享一些zookeeper在日常使用中一些维护经验。 zookeeper清理快照 脚本或者命令清理 zookeeper长时间运行&#xff0c;快照逐渐增多可能造成服务器磁盘被占满的情况&#xff0c;但我们不能贸然用rm命令删除快照文件&#xff0c;如果直接删完会导致丢失好多数据&#x…

使用ppt和texlive生成eps图片(高清、可插入latex论文)

一、说明 写论文经常需要生成高清的图片插入到论文中&#xff0c;本文以ppt画图生成高质量的eps图片的实现来介绍具体操作方法。关于为什么要生成eps图片&#xff0c;一个是期刊要求&#xff08;也有不要求的&#xff09;&#xff0c;另一个是显示图像的质量高。 转化获得eps…

vue 页面加水印

首先创建一个waterMark.js文件&#xff0c;当然文件命名可自定义&#xff0c; use strictconst watermark {}/**** param {要设置的水印的内容} str* param {需要设置水印的容器} container*/ const setWatermark (str, container) > {const id 1.23452384164.123412415…

9.8day58 单调栈

739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 知识点&#xff1a;1.建栈 2.如果后面要加入的数小于栈顶元素就把数组的下标压进栈里 3.反之 就让该数于栈顶元素进行比较 如果该数大于栈顶元素&#xff08;while&#xff09; 就把栈顶元素下表对应的arr数组的值进行…

嵌入式Linux驱动开发(同步与互斥专题)(二)

一、自旋锁spinlock的实现 自旋锁&#xff0c;顾名思义&#xff1a;自己在原地打转&#xff0c;等待资源可用&#xff0c;一旦可用就上锁霸占它。 ① 原地打转的是CPU x&#xff0c;以后CPU y会解锁&#xff1a;这涉及多个CPU&#xff0c;适用于SMP系统&#xff1b; ② 对于单…

4.3.3.1 【MySQL】CHAR(M)列的存储格式

我们知道 Compact 行格式在 CHAR(M) 类型的列中存储数据的时候还挺麻烦&#xff0c;分变长字符集和定长字符集的情况&#xff0c;而在 Redundant 行格式中十分干脆&#xff0c;不管该列使用的字符集是啥&#xff0c;只要是使用 CHAR(M) 类型&#xff0c;占用的真实数据空间就是…

Java-HashMap中put()方法是如何实现的,内含详细流程图

文章目录 Java中的HashMap什么是HashMap&#xff1f;对比其他Map中put()方法HashMap中put()方法使用示例 HashMap中put()源码解析手绘流程图实现原理源码探究&#xff08;JDK 1.8&#xff09; 设计put()的意义总结 Java中的HashMap 什么是HashMap&#xff1f; HashMap是Java中…

2023国赛数学建模C题模型代码

C题代码全部都完成了&#xff0c;可以看文末名片 我们先看C题的一个背景 在生鲜商超中,蔬菜类商品保鲜期短,且品相会随销售时间增加而变差。商超需要根据历史销售和需求每天进行补货。由于蔬菜品种众多、产地不同,补货时间在凌晨,商家须在不明确具体单品和价格的情况下进行补…

好奇!为什么很少看到女项目经理?

最近被刚进公司的新人问到&#xff0c;在项目管理领域&#xff0c;为什么女性项目经理的数量相对较少。一时之间我也有些茫然&#xff0c;下了班总结一下&#xff0c;跟大家探讨探讨。 一、职业选择的局限性 其实大多数时候&#xff0c;出现和性别有关的问题时&#xff0c;都是…

mockjs+json-server模拟百万条数据

文章目录 前言场景前置操作安装axios或者Ajax&#xff08;作者用的是axios&#xff09;mock.js文件编辑编辑json-server文件夹添加百万条虚拟数据后言 前言 hello world 欢迎来到前端的世界 &#x1f61c;当前文章系列专栏&#xff1a;前端 &#x1f431;‍&#x1f453;博主在…

QT文件对话框,将标签内容保存至指定文件

一、主要步骤 首先&#xff0c;通过getSaveFileName过去想要保存的文件路径及文件名&#xff0c;其次&#xff0c;通过QFile类实例化一个文件对象&#xff0c;再读取文本框中的内容&#xff0c;最后将读取到的内容写入到文件中&#xff0c;最后关闭文件。 1.txt即为完成上述操作…

架构设计基础设施保障IaaS之网络

目录 1 DNS运用1.1 DNS功能作用1.2 DNS配置实践 2 DNS生产最佳实践方案2.1 全球加速功能2.2 不同运营商的加速方案2.3 全球业务高可用方案2.4 跨地域负载均衡 3 DNS域名劫持解决方案4 CDN剖析4.1 CDN原理4.2 缓存过期配置处理流程4.3 缓存配置规则 5 CDN运用6 CDN最佳实践方案6…

检索与毒害 —— 对抗人工智能供应链攻击

作者&#xff1a;DAVE ERICKSON 在这篇文章中&#xff0c;了解人工智能大语言模型的供应链漏洞&#xff0c;以及如何利用搜索引擎的人工智能检索技术来对抗人工智能的错误信息和故意篡改。 虽然对于人工智能研究人员来说可能是新鲜事&#xff0c;但供应链攻击对于网络安全世界…

入栏需看——学习记忆

记忆方法千千种&#xff0c;本栏意在梳理其中道道来&#xff0c;旦有小得&#xff0c;肥肠幸耶。从不同角度分析学习记忆。 逻辑篇 有逻辑 用思维导图 思维导图记忆有逻辑的文本/内容 理论 巧记书本结构–思维导图 模仿 HCIE-Cloud Computing LAB备考第一步&#xff1a…

解某麦数据请求参数analysis加密

意外发现一个可以查询app下载量得网站&#xff0c; 想筛选一下哪些下载量在1w-10w之间&#xff0c;大概需要5k个.。 感觉应该没啥加密&#xff0c;好把&#xff0c;是我小看了&#xff0c;有个参数是加密得&#xff0c;如图。 analysis 扣js开始&#xff0c; f12 去资源文件…

六大排序算法(Java版):从插入排序到快速排序(含图解)

目录 插入排序 (Insertion Sort) 直接插入排序的特性总结&#xff1a; 选择排序 (Selection Sort) 直接选择排序的特性总结 冒泡排序 (Bubble Sort) 冒泡排序的特性总结 堆排序&#xff08;Heap Sort&#xff09; 堆排序的特性总结 希尔排序 (Shell Sort) 希尔排序的…