【数据结构】之线性表(三)【详解,赶快学起来吧

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

文章目录

  • 开场白💨

  • 1.线性表的定义🔴

    • 2.线性表的特点🔺

    • 3.线性表的抽象数据类型🔶

  • 4.线性表的顺序存储🟡

    • 4.1 顺序存储的定义🗨️

    • 4.2顺序存储方式🕐

    • 4.3数据长度与线性长度的区别🌀

    • 4.4地址计算方法🍭

  • 5.顺序存储结构的插入和删除〰️

    • 5.1获得元素操作👋

    • 5.2插入操作🧺

    • 5.3删除操作❌

    • 5.4线性表顺序结构的优缺点💫

  • 总结☑️

开场白💨

=================================================================

在这里插入图片描述

大家好呀,今天我给大家带来数据结构中最常用和最简单的一种结构——【线性表】🚻

在介绍之前,我给大家讲个例子🏫:

在幼儿园中🏫,我们经常见到幼儿园的小朋友一个拉着一个人的衣服,依次从教室出来。而且我发现很有规律的是,每次他们的次序都是一样的。当谁走丢了的时候,可以根据谁在谁的前面,谁在谁的后面,按照事先规定好的可以在最短时间知道,并找到这个调皮的笨小孩。🧒

在这里插入图片描述

这种排好队的组织方式🪢,其实就是今天我要介绍的数据结构:线性表


1.线性表的定义🔴

======================================================================

线性表(List):零个或多个元素的有序序列。

线性表是具有相同数据类型的 n 个数据元素的有限序列,其中 n 为表长,当 n=0 时线性表是一个空表◻️。若用 L 命名线性表,则其一般表示为:L=(a1,a2,a3…ai,…an)。

  • 注意位序从 1️⃣ 开始(区分与数组下标从 0️⃣ 开始)

  • 在式中,a1 是唯一的“第一个”数据元素,又称表头元素

  • 在式中,an 是唯一的“最后一个”数据元素,又称表尾元素

  • 除第一个元素外,每个元素有且仅有一个直接前驱

  • 除最后一个元素外,每个元素有且仅有一个直接后继

先来一个大家最感兴趣的,一年里的星座列表♊,是不是线性表呢?如下图所示。

在这里插入图片描述

当然是,星座通常都是白羊座打头♈,魔蝎收尾,当中的星座都有前驱和后继,而且一共也只有12个,所有它完全符合线性表的定义。

我们再来看在这里插入图片描述

🏫班级同学之间的友谊关系,是不是线性关系?哈哈😆,不是,因为每个人都可以和多个同学建立友谊,不满足线性的定义。嗯?有人就说爱情关系💕就是了。胡扯,难道每个人都有一个人爱的人和爱自己的人,而且他们还不能重复爱同一个人这样的情况出现,最终形成一个班级情感人物串联?🪢这怎么可能,也许网络小说里可能出现,但现实中是不可能的❌。


2.线性表的特点🔺


班级同学的花名册📖,是不是线性表?是,这和刚才的友谊关系是完全不同了,因为它是有限序列,也满足类型相同的特点。

在叫复杂的线性表中,一个数据元素可以由若干个数据项组成

  • 表中元素的个数有限 表中元素具有逻辑上的顺序性🎊

  • 表中元素有先后次序 表中元素都是数据元素,每个元素都是单个元素

  • 表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间

  • 表中元素具有抽象性🙌,即讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容

注意:线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构,两者属于不同层面的概念,不要混淆。


3.线性表的抽象数据类型🔶


前面我们已经给出了线性表的定义,现在来分析一下,线性表应该有一些什么样的操作呢?

在这里插入图片描述

我👩🏾‍🦰用这张图片给大家解释_抽象_操作:既然排队,那肯定有分先后,先来的在前面,后来的在后面,这是添加;后面来的人因为赶时间想排前面,这是就要插入;当前面的人走开了,后面一个人就往前走,而走开的人就是输出走了,过来的人输入进去;其中排队的人有我们认识的,我们需要查找,而人都走完了,那我们就找不到,这就是空表◻️。

伪代码


ADT 线性表(List)

Data

	线性表的数据结构对象集合为{a1,a2,....,an},每个元素的类型均为DataType。

其中,除了第一个元素a1外,每个元素有且只有一个直接驱动元素,除了最后一个元素an外,

每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。

	InitList(&L):初始化表。构造一个空的线性表。

	Length(L): 求表长。返回线性表 L 的长度,即 L 中数据元素的个数。

	LocateElem(L,e):按值查找操作。在表 L 查找具有给定关键字值的元素。

	GetElem(L,i): 按位查找操作。获取表 L 中的第 i 个位置的元素的值。

	ListInsert(&L,i,e):插入操作。在表 L 中第 i 个位置插入指定元素 e。

	ListDelete(&L,i,&e):删除操作。删除表 L 中第 i 个位置的元素,并用 e 返回删除元素的值。

	PrintList(L):输出操作。按前后顺序输出线性表 L 的所有元素值。

	Empty(L):判空操作。若 L 为空表,则返回 true,否则返回 false。

	DestroyList(&L):销毁操作。销毁线性表,并释放线性表 L 所占用的内存空间。

endADT




4.线性表的顺序存储🟡

========================================================================

4.1 顺序存储的定义🗨️



	说了这么多的线性表,我们来看看线性表的两种物理结构的第一种——(顺序存储结构)



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

在这里插入图片描述

4.2顺序存储方式🕐


线性表的顺序表存储的结构代码:


#define MAXSIZE 20          /* 存储空间初始分配量 */

typedef int ElemType;       /* ElemType类型根据实际情况而定,这里假设为int */

typedef struct

{

    ElemType data[MAXSIZE]; /* 数组,存储数据元素 */

    int length;             /* 线性表当前长度 */

}SqList;



这里,我们发现描述顺序存储结构需要三个属性:

🥩

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

  • 线性表的最大存储容量:数组长度MAXSIZE。Ⓜ️

  • 线性表的当前长度:length。✅

注意:

① 在线性表中对元素的说法都是位序,而位序是从 1 开始的。区分与数组的下标从 0 开始。

② 在顺序表中,问题的规模变量为表长 L.length。

4.3数据长度与线性长度的区别🌀


注意:这里有两个概念“数组的长度”和“线性表的长度”需要区分一下。

[] []数组的长度是存放线性表的存储空间的长度,存储分配后这个量一般是不变的。有个别同学可能会问,数组的大小一定不可以变吗?我怎么看到有书中谈到可以动态分配的一维数组。是的,一般高级语言,比如C、VB、C++都可以用编程手段实现动态分配数组,不过这会带来性能上的损耗。

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

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

4.4地址计算方法🍭


由于我们数数都是从1开始数的,线性表的定义也不能免俗,起始也是1,可C语言中的数组却是从0开始第一个下标的,于是线性表的第i个元素是要存储在数组下标为i-1的位置,即数据元素的序号和存放它的数组下标之间存在对应关系,如图:在这里插入图片描述

存储器中的每个存储单元都有自己的编号,这个编号称为地址


5.顺序存储结构的插入和删除〰️

============================================================================

5.1获得元素操作👋


对于线性表的顺序存储结构来说,如果我们要实现GetElem操作,即将线性表L中的第i个位置元素值返回,其实是非常简单的。就程序而言,只要i的数值在数组下标范围内,就是把数组第i-1下标的值返回即可。来看代码:


#define OK 1

#define ERROR 0

#define TURE 1

#define FALSE 0

typedef int Status;

	/* Status是函数的类型,其值是函数结果状态代码,如OK等 */

	/* 初始条件:顺序线性表L已经存在,1 <= i <= ListLength(L) */

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

	Status GetElem(SqList L, int i, ElemType *e)

	{

		if (L.length == 0 || i < 1 || i > L.length)


### 最后

四轮技术面+一轮hr面结束,学习到了不少,面试也是一个学习检测自己的过程,面试前大概复习了 一周的时间,把以前的代码看了一下,字节跳动比较注重算法,面试前刷了下leetcode和剑指offer, 也刷了些在牛客网上的面经。大概就说这些了,写代码去了~



祝大家都能收获大厂offer~



**篇幅有限,仅展示部分内容**

![](https://img-blog.csdnimg.cn/img_convert/ac0b1c2376da47d727e0dc8a77e76478.png)



![](https://img-blog.csdnimg.cn/img_convert/b871b45fb2e6d5442144c863cbcff965.png)

![](https://img-blog.csdnimg.cn/img_convert/f5c18f4b2878302f1f53a8c393e7eb0d.png)


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)**
![img](https://img-blog.csdnimg.cn/img_convert/65fdce81a9b4b5e0914097947d3b90b8.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
g-blog.csdnimg.cn/img_convert/b871b45fb2e6d5442144c863cbcff965.png)

![](https://img-blog.csdnimg.cn/img_convert/f5c18f4b2878302f1f53a8c393e7eb0d.png)


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)**
[外链图片转存中...(img-HVMAjxMz-1713218027598)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值