咳咳,讲重点了讲重点了
先来一波考研的考纲内容对线性表的要求:
无疑,线性表肯定是考研的重点,加上这部分内容代码量来说不多,实现起来的话也相对容易一些,但是在性能要求(时间、空间)上就很有要求了。
看一波结构🥐
在上一节的绪论小知识中就对数据结构这个玩意儿的概念和我的理解讲的很清楚了所以在看到上面的结构图应该不会陌生(还没有看的+对“数据结构”这个魔鬼还不是很理解的小朋友,欢迎阅读后续内容前先点击预览:数据结构一:绪论小知识)
定义
我对线性表这个东西的理解就是:就像一个军队一样,不管这个军队的装备多么悲催,但是起码要保证军队的每一个人身上的装备都是相同的,并且军队里的每个人之间都有个编号,可以通过这个编号可以直接连接到前一个人或者后一个人,这就是我们说的“直接前驱”和“直接后继”,可以想象一下,军队里的每个人想找只要“拍拍”前一个人或者后一个人就可以联系上这个人啦,够“直接”!
那么这个“装备”就如上面的概念所说的“数据类型”,不用理解的那么复杂,就是里面所有的元素都是相同的“装备”,然后再一起去搞个事情。
这个表就像一个军队,一个军队特殊的肯定就是第一个“领队人“”和最后一个“收队人”,线性表的第一个元素a₁由于所处位置为第一个,前面没有人了,所以它没有直接前驱,同样的,最后一个an没有直接后继
通过上面的概念定义的理解,我们就可以直接总结线性表的特点了:
再简单插一个我的理解哈:
①:人类数量是有限的,军队由人组成,所以军队个数有限
②:在逻辑上,军队里的每个人都有编号的嘛,比如我们常说的第几路军代号谁谁谁,体现出“顺序性”
③:军队每个人都是一个完整的个体——单个元素
④:军队每个人装备都相同——数据类型;每个人都是190标准模特的大帅哥,在地球上的占有相同大小存储空间
线性表最明显的特点就是:有限序列、相同数据类型(考的最多的两个特点)
例如:2021年王道一道题:
C选项显然是无穷个,排除;D是存储结构,线性表是逻辑结构;A选项没有前后驱关系(乱的);只有B符合要求。
很简单的啦,跳跳跳~~~~~~
在这里插入一个小知识点:
我们知道线性表里面的元素具有“抽象性”,线性表是一种逻辑结构,即我们所说的一对一的相邻关系,而顺序表和链表是存储结构,两者是不一样的,这也就是为什么还不够理解什么是“数据结构”的朋友先去看看前面也有链接。
线性表的不同存储方式🌮
基本操作大致可以分为:
当然了,这些算法的实现也同时取决于你使用的是什么存储结构,不同的存储结构对应的算法结构不同
顺序表
线性表的顺序存储又称为“顺序表”,很多人对这一块理解是理解了但是有一点就是:顺序表的特点就是其逻辑顺序和物理顺序是相同的
很多人会认为顺序表就是数组,这种理解是片面的
线性表中元素位序是从1开始的,而数组是从0开始的
静态分布定义方式:
ElemType为元素类型(可能是常规的也可能是一个结构体等)
一维数组在定义的时候既可以是静态分布的同样也可以是动态分布的,这一点比较好理解,静态就是在定义的时候就已经有那么多了,动态就是不够了还可以继续申请一块内存空间。
动态分布定义:
动态分布大家都懂啦,malloc一下就OK
注意注意:
动态分配在这里不是链式存储,它同样属于顺序存储的,物理结构没有发生变化,只是分配空的大小间可以在运行时候决定(不理解?你想想链式存储,都说了是链式,怎么说没个next指针我怎么链起来,往上看看,SeqList并没有,说明它的空间是顺序的)
特点:
来点小例题
这道题很容易就选了B选项,在这里有必要解释一下什么是“存取方式”,这玩意儿指的就是“读取方式”,在线性表的顺序存储特点中我们知道它是支持随机存储这种读取方式的,随机存取就是:给出一个起始的地址,我就可以随机访问它之后的任何一个元素这就是随机存储。
这道题选D,这道题没有难度,只是希望大家明确这是“连续”、“顺序”的
有关这方面的题目不会很难,掌握好概念+多加代码练习应该没问题
链式存储🍤
线性表的链式存储又称为单链表,它是通过一组任意的存储单元来存储线性表中的数据元素。
单链表中的结点类型:
熟悉链表的朋友对这一部分肯定不会陌生,大家也可以看到这有一个next的指针,说明这存在浪费存储空间的缺点(比如这个链表很长很长,就需要很多指针),根据链表特点也可以知道单链表的元素离散地分布在存储空间中,故它是非随机存储的存储结构,即如果要查找某一个元素的时候就必须从表头开始遍历,依次寻找
那么头结点和头指针的区别?
头结点和头指针对初学者来说也是有点困惑的地方,在这里解释一下:
我们在定义的时候就比较喜欢引入头结点,因为这可以带来起码以下两个优点:
①、第一个数据节点的位置被存放在头结点的指针域中,所以在处理的链表的第一个结点时候就不用特殊处理了
②、就是判空为题,无论链表是否为空:头结点指针域为NULL—空表,否则为非空表
总结🍱
只有在非常理解这两个存储方式的优缺点才能够进行一个比较完善、全面的比较,以下是我大致总结的一些区别:
①、存储方面
容易啦,在难以估计线性表长度或者规模的时候,就不宜采用顺序表,在这里是与“存储密度”有关的,密度越大,就比较…比较难搞,就是在用的时候就比较不太好,大家能理解就行,跳跳跳~~~~链表的存储密度就比较低,是小于1的
②、运算方面
运算就是我们常说的操作方面了,比如查询某个结点啊、插入某个节点啊、删除某个结点啊之类的,这就与表中的数据元素个数有关了,当数据元素很大且表很长的情况下,顺序表进行插入和删除就很难受了,平均下来要移动表中一半的元素,在这里链表的优势就体现出来了,虽然在进行插入和删除的时候,链表一开始也是要先从头开始查询查找位置,但是操作主要就是比较操作,从各个角度来说链式都优于顺序存储
③、空间方面
前面说到了链式存储是需要另外开辟一块指针域的,有时候也是比较浪费的,而顺序表啥也不需要,所以在实现方面顺序表比较容易实现
这两种方式各有春秋、希望大家都能够掌握,欢迎私信和评论