文章目录
- 数据结构—线性表
- 1.线性表的定义和基本操作
- 线性表的定义
- 线性表的特点
- 线性表的基本操作
- 2.线性表的顺序存储和链式存储表示
- 顺序存储
- 链式存储
- 单链表
- 循环链表
- 双向链表
数据结构—线性表
1.线性表的定义和基本操作
线性表的定义
定义:线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列。(n=0时称为空表)
线性表的特点
- 表中元素的个数有限。
- 表中元素具有逻辑上的顺序性,表中元素有其先后次序。
- 表中元素都是数据元素,每个元素都是单个元素。
- 表中元素的数据类型都相同,这意味着每个元素占用相同大小的存储空间。
- 表中元素具有抽象性,即讨论元素间的逻辑关系,而不考虑元素元素的内容。
注意:线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构,两者属于不同层面的概念,因此不要将其混淆。
线性表的基本操作
- InitList(&L) 初始化表。操作结果:构造一个空的线性表L。
- GetElem(L,i,&e) 线性表的取值。初始条件:线性表L已存在,且1≤i≤ListLength(L)。操作结果:用e返回L中第i个数据元素的值。
- LocateElem(L,e) 线性表的查找。初始条件:线性表L已存在。操作结果:返回L中第1个值与e相同的元素在L中的位置。若这样的数据元素不存在,则返回值为0。
- ListInsert(&L,i,e) 线性表的插入。初始条件:线性表L已存在,且1≤i≤ListLength(L)+1。操作结果:在L的第i个位置之前插入新的数据元素e,L的长度加1。
- ListDelete(&L,i) 线性表的删除。初始条件:线性表L已存在且非空,且1≤i≤ListLength(L)。操作结果:删除L的第i个数据元素,L的长度加1。
注意:符号“&”表示C++语言中的引用调用。
2.线性表的顺序存储和链式存储表示
顺序存储
- 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称为线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表(Sequential List)。
- 特点:逻辑上相邻的数据元素,其物理次序也是相邻的。顺序存储结构是一种随机存取的存储结构。
- 假设线性表L存储的起始位置为LOC(A),sizeof(ElemType)是每个数据元素所占用存储空间的大小。
数组下标 | 内存状态 | 内存地址 | 位序 |
---|---|---|---|
0 | a1 | LOC(A) | 1 |
1 | a2 | LOC(A)+sizeof(ElemType) | 2 |
i-1 | ai | LOC(A)+(i-1)sizeof(ElemType) | i |
n-1 | an | LOC(A)+(n-1)sizeof(ElemType) | n |
- 注意:要区分清楚位序和下标;线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。
链式存储
单链表
- 线性表的链式存储又称单链表,它是指通过一组任意的的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继结点的指针; 其中存储数据元素信息的域称为数据域(data);存放直接后继存储位置的域称为指针域(next)。
- 首元结点是指链表中存储第一个元素a1的结点。
- 头结点是在首元结点之前附设一个结点,其指针域指向首元结点。头结点的数据域可以不存储任何信息,也可以存储与数据元素类型相同的其他附加信息。
- 链表增加头结点的作用:
- 便于首元结点的处理:增加了头结点后,首元结点的地址保存在头结点的指针域中,则对链表的第一个数据元素的操作与其他数据元素相同,无需进行特殊处理。
- 便于空表与非空表的统一处理:当不设头结点时,假设L为单链表的头指针,它应该指向首元结点,则当链表长度为0时,L指针为空(判定空表的条件记为:L==NULL);增加头结点后,无论链表是否为空,头指针都是指向头结点的非空指针。若为空表,则头结点的指针域为空(判定空表的条件可记为:L->next==NULL)。
- 特点:逻辑上相邻的数据元素,其物理次序不一定相邻;单链表为顺序存取结构。
循环链表
-
循环链表(Circular Linked List):是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环)。
-
优点:从表中任意一结点出发均可找到表中其他结点。
-
注意:由于循环链表中没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断P或P->next是否为空,而是判断它们是否等于头指针。
双向链表
-
双向链表(Double Linked List):在单链表的每个节点里增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表。
-
在单链表中,查找直接后继结点的执行时间为O(1),而查找直接前驱的执行时间为O(n)。为了克服单链表这种单向性的缺点,可利用双向链表。