文章目录
第二章线性表总览
第一节,线性表的定义和基本操作概览
什么是线性表?
线性表是一种线性结构。
Day11-【软考】稀疏矩阵考试中如何计算?以及线性表的分类有哪些?,中:是线性结构的基本表现
来自AI:
线性结构有:
1、线性表
2、栈
一种特殊的线性表,操作受限,仅允许在表的一端进行插入和删除操作,遵循后进先出(LIFO,Last - In - First - Out)原则。比如往弹夹里压子弹,最 后压入的子弹会最先被射出。
3、队列
也是特殊的线性表,同样操作受限,只允许在表的一端进行插入(队尾),在另一端进行删除(队头)操作,遵循先进先出(FIFO,First - In - First - Out)原则。例如排队买票,先到的人先买到票离开队伍。
4、字符串,也就是串
由零个或多个字符组成的有限序列,是一种特殊的线性表,表中的数据元素为字符。在文本处理中,一篇文章、一个句子等都可以看作字符串,对字符串 的查找、替换、截取等操作都是基于其线性结构的特点。比如在 Python 中,字符串 “hello” 就是一个线性结构,每个字符都有确定的位置顺序,可以通 过索引访问其中的字符。
5、数组
由相同类型的元素按一定顺序排列的集合,是顺序存储的线性结构。元素在内存中地址连续存放,可通过下标快速访问元素。例如
int arr[10]
定义了 一个包含 10 个整型元素的数组,这些元素在内存中依次排列,arr[0]
是第一个元素,arr[1]
是第二个元素,依此类推,每个元素(除第一个和最后 一个外)都有唯一的前驱和后继元素。 此外,还有多维数组,虽然形式上更复杂,但本质上也是线性结构的扩展,例如二维数组可以看作是数组的数组,其元素同样具有线性关系。
在这种结构中,存在唯一的“第一个”元素、唯一的“第二个”元素,依此类推。线性表中各个元素依次排列。
也就是头部一定是固定的
线性表是一种线性结构。在这种结构中,存在唯一的“第一个”元素、唯一的“第二个”元素,依此类推。
线性表中各个元素依次排列。例如,在例1-1中,表1-1列出的某班30名学生的基本信息能够组成一个线性表,可以按照学号排列名单。
Day24-【13003】短文,数据结构与算法开篇,什么是数据元素?数据结构有哪些类型?什么是抽象类型?,中:表1-1某班30名学生的基本信息,某班30名学生的基本信息能够组成一个线性表,可以按照学号排列名单。
【例2-1】 将例1-1的学生基本信息表表示为线性表Student。
Student=( (M2022103001王义平男2004年11月22日山东),(M2022103002陆东男2004年02月05日河南) (M2022103030杨志强男2004年10月30日陕西) )
每位学生的信息又包含5个数据项,为清楚起见,使用一对括号将数据项括起来。
- 意思是这30个数据元素,能够,可以组成一个线性表,当按照学号排列是就是如此,是不是也可以不组成线性表
定义2-1:
一个线性表是由同类型数据元素构成的有限序列。一般而言,由n(n>0)个元素组成的线性表L可以表示为:
L
=
(
a
0
,
a
1
,
⋯
,
a
n
−
1
)
这里,
a
i
(
0
<
i
<
n
−
1
)
是线性表中的数据元素,也称为表项。
第一个元素是
a
0
,称为表头元素或开始元素
;
第二个元素是
a
1
…
…
…
第
n
个
(
即最后一个
)
元素是
a
n
−
1
,称为表尾元素或终端元素。
线性表中常使用从
0
开始的连续非负整数来表示各元素的位置,
表头
a
0
的位置为
0
,
a
1
的位置为
1
,一般地,
a
i
(
0
≤
i
≤
n
−
1
)
的位置为
i
。
对于元素
a
i
(
1
≤
i
≤
n
−
1
)
,
1
、元素
a
j
(
0
≤
j
<
i
)
称为
a
i
的前驱,
其中元素
a
i
−
1
称为
a
i
的直接前驱
;
对于元素
a
i
(
0
≤
i
≤
n
−
2
)
,
2
、元素
a
j
(
i
<
j
≤
n
−
1
)
称为
a
i
的后继,
其中元素
a
i
+
1
称为
a
i
的直接后继。
在不引起歧义的情况下,直接前驱简称为前驱,直接后继简称为后继。
除表头元素
a
0
以外,每个元素有且仅有一个直接前驱
;
除表尾元素
a
n
−
1
以外,每个元素有且仅有一个直接后继。
线性表中各元素的次序是固有的,
3
、即元素
a
i
(
0
≤
i
≤
n
−
2
)
排在
a
i
−
1
之后,
且排在元素
a
i
+
1
之前。其实大部分都是线性结构本身共有的特点
L = (a_0, a_1, \cdots, a_{n - 1})\\ 这里,a_i(0<i<n-1)是线性表中的数据元素,也称为表项。\\ 第一个元素是a_0,称为表头元素或开始元素;\\ 第二个元素是a_1………\\ 第n个(即最后一个)元素是a_n-1,称为表尾元素或终端元素。\\ 线性表中常使用从0开始的连续非负整数来表示各元素的位置,\\ 表头a_0的位置为0,a_1的位置为1,一般地,a_i(0≤i≤n-1)的位置为i。\\ 对于元素a_i(1≤i≤n-1),\\ 1、元素a_j(0≤j<i)称为a_i的前驱,\\ 其中元素a_{i-1}称为a_i的直接前驱;\\ 对于元素a_i(0≤i≤n-2),\\ 2、元素a_j(i<j≤n-1)称为a_i的后继,\\ 其中元素a_{i+1}称为a_i的直接后继。\\ 在不引起歧义的情况下,直接前驱简称为前驱,直接后继简称为后继。\\ 除表头元素a_0以外,每个元素有且仅有一个直接前驱;\\ 除表尾元素a_{n-1}以外,每个元素有且仅有一个直接后继。\\ 线性表中各元素的次序是固有的,\\ 3、即元素a_i(0≤i≤n-2)排在a_{i-1}之后,\\ 且排在元素a_{i+1}之前。 其实大部分都是线性结构本身共有的特点\\
L=(a0,a1,⋯,an−1)这里,ai(0<i<n−1)是线性表中的数据元素,也称为表项。第一个元素是a0,称为表头元素或开始元素;第二个元素是a1………第n个(即最后一个)元素是an−1,称为表尾元素或终端元素。线性表中常使用从0开始的连续非负整数来表示各元素的位置,表头a0的位置为0,a1的位置为1,一般地,ai(0≤i≤n−1)的位置为i。对于元素ai(1≤i≤n−1),1、元素aj(0≤j<i)称为ai的前驱,其中元素ai−1称为ai的直接前驱;对于元素ai(0≤i≤n−2),2、元素aj(i<j≤n−1)称为ai的后继,其中元素ai+1称为ai的直接后继。在不引起歧义的情况下,直接前驱简称为前驱,直接后继简称为后继。除表头元素a0以外,每个元素有且仅有一个直接前驱;除表尾元素an−1以外,每个元素有且仅有一个直接后继。线性表中各元素的次序是固有的,3、即元素ai(0≤i≤n−2)排在ai−1之后,且排在元素ai+1之前。其实大部分都是线性结构本身共有的特点
线性表中所有数据元素的数据类型必须相同。
也就是说,要么是基本类型中的原子类型,比如整型,或者是结构类型,比如数组
要么是抽象类型
- 线性表本身的定义,加上操作,这个整体就组成了线性表的抽象数据类型,LinearList
总之数据类型要一样
数据元素的次序就是它们在表中的排列次序。
元素的个数n称为表长。
在n=0时,也就是表长为0,线性表称为空表,表示为()。
如果线性表中各元素的值可以进行比较,并且表中元素的值按位置顺序递增或递减排列,即按值的“大小”有序排列,则线性表称为有序表,这个“序”指的是大小有序。
与之相对的,表中元素的值不满足按位置顺序递增或递减关系的线性表则称为无序表。
- 意思是,如果无序,但只要位置固定,也可以组成线性表
线性表3个特点?次序关系很重要,大小关系不一定-有序线性表和无序线性表
1、所有元素属于同一个类型。
2、元素个数是有限的。;这其实是和算法的有穷性有点像
3、各元素之间不一定有大小关系,但一定有次序关系。;原来这种排序,其实叫大小关系,位置固定,叫次序关系
线性表的基本操作?也符合一些逻辑结构的基本操作
线性表上可以进行的基本操作通常有:
1、向线性表中添加新元素、
以插入操作insertList为例,当在表L的位置pos处插入元素x后,原pos位置的元素及它的所有后继元素的位置均增1。
2、从线性表中删除某个元素、
删除操作removeList也是类似的,当删除表L中位置pos处的元素后,被删除元素的所有后继元素的位置均减1。
3、求线性表的表长;也就是n的值、
例如,length返回的是线性表的当前长度,即线性表所含元素的个数;只表示操作执行的结果
4、求线性表中某元素的直接前驱或直接后继、
5、判断线性表是否为空、;和逻辑结构中的集合的操作类似,判断是否为空;逻辑结构的另一类,就是线性结构,因为都是逻辑结构,所以这个操作差不多
当表为空时,isEmpty返回1,否则返回0;
6、判断线性表是否为满、
当表已满时,isFull返回1,否则返回0
7、按位置查找元素、
find返回的是要查找的元素x在表中第一次出现的位置,如果表中不包含x,则返回-1。;仅表示操作是否已正确执行,意思-1这个值,表示查找操作并未正确 执行,因为根本表中就找不到
8、查找某元素所在位置等。
注:
步骤7,叫传址,传一个地址,查找值是多少
步骤8,也叫传值,传一个值,查找值的位置
见,Day13-【软考】雄文!一口气看懂程序设计语言所有内容!有限自动机如何求解?正规式如何解析(核心!)?传值和传址原理是什么?(重点!),中:传址原理是什么?(重点!)传值原理是什么?(重点!)
定义+操作,组成线性表的抽象数据类型?
线性表的定义加上对它的操作组成线性表的抽象数据类型(ADT)的定义,表示为LinearList。
为简单起见,表中元素的类型使用ELEMType来表示。
在实际应用中,可以将ELEMType替换为具体使用的数据类型,如整型int),或自定义的复杂结构等。
线性表的许多操作都涉及位置,使用Position表示位置类型。
线性表中有几个基本操作会涉及位置Position,操作后有些元素的位置会发生变化。
LinearList中定义的操作都有返回值,有些返回值代表操作的执行结果,另外一些仅表示操作是否已正确执行。
initList、clear、1、insertList、2、removeList、setValue、7、getValue等操作的返回值表示操作是否已正确执行。
果然操作7,就是表示操作是否已正确执行
在这种情况下,通常1代表执行成功,0或-1代表执行时遇到了某些问题,比如参数值不正确。
线性表的抽象数据类型定义如下:
ADT LinearList{
数据部分:
L; //线性表
操作部分:
int initList(LinearList *L); // 初始化线性表,创建一个空表L
int clear(LinearList *L); // 将表L置空
int isEmpty(LinearList *L); // 5、如果表L为空,则返回1,否则返回0
int isFull(LinearList *L); // 6、如果表L为满,则返回1,否则返回0
int length(LinearList *L); // 3、返回表L的当前长度
int insertList(LinearList *L, Position pos, ELEMType x); // 1、在表L的位置pos处插入元素x
int removeList(LinearList *L, Position pos, ELEMType *x); // 2、删除表L中位置pos处的元素并通过x返回
int setValue(LinearList *L, Position pos, ELEMType x); // 给表L位置pos处的元素赋值x
int getValue(LinearList *L, Position pos, ELEMType *x); // 7、返回表L中位置pos处的元素
Position find(LinearList *L, ELEMType x); // 8、返回元素x在表L中第一次出现的位置
}
- 线性表定义中给出的操作可以根据需要有所变化。
例如,
9、可以增加显示操作,
即依次列出线性表中的所有元素;
10、也可以增加对位置进行处理的操作,
如setFirst用于定位到线性表的首位置,
prev和next分别返回当前位置的前驱与后继位置。
- 另外,可以去掉冗余的操作,
例如,如果length返回的值是0,则是空表;
若返回的值大于0,则是非空表。
所以,可以去掉判定表是否为空的isEmpty。