数据结构与算法之线性表(上)

建议关注收藏,持续更新中……

1.线性表的定义

线性表的定义: 像排队一样具有线的性质,由零个或多个数据元素组成的有限序列(序列前驱和后继)。(有且只有一个)

数学定义: 若将线性表记作为(a1,…,ai-1,ai,…an),则表中ai-1领先于ai,ai领先于ai+1,称作ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。
所以线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。

2.抽象数据类型

数据类型: 指一组性质相同的值的集合及定义在此集合上的一些操作的总称。

原子类型: 不可以再分解的基本类型。例如整型。
结构类型: 由若干个类型组合而成,是可以再分解的。例如数组。

抽象: 指抽取出事物具有的普遍性的本质。它要求抽出问题的特征而忽略非本质的细节,是对具体事务的一个概括。抽象是一种思考问题的方式,它隐藏了复杂的细节。

抽象数据类型(ADT): 指一个数学模型及定义在该模型上的一组操作。

抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机的内部如何表示和实现无关。

抽象的意义在于数据类型的数学抽象特性。

3.抽象数据类型的标准格式:

ADT 抽象数据类型名

Data
数据元素之间逻辑关系的定义(元素间的关系一对一)

Operation
操作:initList(*L):初始化操作,建立一个空的线性表L。
ListEmpty(L):判断线性表是否为空表,若线性表为空表,返回true,否则返回false.
ClearList(*L):将线性表清空。
GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e.
LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。
ListInsert(*L,i,e):在线性表L中第i个位置插入新元素e。
ListDelete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值。
ListLength(L):返回线性表L的元素个数。

EndADT

4.线性表的存储结构

线性表的顺序存储结构: 通过占位形式,依次存储于内存空间实际上是对数组进行封装,增加了个当前长度的变量。(起始位置,最大存储容量,当前长度)

线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1)。而在插入或删除时,时间复杂度都是O(n)。说明适合元素个数比较稳定。

优点:
(1).无需为表示中间元素之间的逻辑关系而增加额外的存储空间。
(2). 可以快速的存取表中任意位置的元素。
缺点:
(1).插入和删除操作需要移动大量元素。
(2). 当线性表长度变化较大时,难以确定存储空间的容量。
(3). 容易造成存储空间的“碎片“。

线性表的链式存储结构: 用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。比起顺序存储结构每个数据元素只需要存储一个位置就可以了。现在链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)。也就是说除了存储其本身的信息外,还需要存储一个指示其直接后继的存储位置的信息。

把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数据元素称为存储影像,称为结点。n个结点链接成一个链表,即为线性表的链式存储结构。因为此链表的每个结点中只包含一个指针域,所以叫做单链表

对于线性表来说,总得有头尾,链表也不例外,我们把链表中的第一个结点的存储位置叫做头指针,最后一个结点指针为空(NULL)

备注:欢迎加入qq群交流学习。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45823731/article/details/113093853
今日推荐