线性表的顺序存储-顺序表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法参数说明
SqList *L; L=(SqList *)malloc(sizeof(SqList));
L ?1?010?
1010
顺序表的空间
顺序表
L
顺序表
通过顺序表指 针L操作顺序表
16/32
顺序表指针引用
void CreateList(SqList *&L,ElemType a[],int n)
6/32
7/32
线性表的作用 应用程序
基本运算1 … 基本运算n
实 现
了
的
线
数据
性
表
8/32
逻辑特性
线性表ADT=逻辑结构+ 基本运算 (运算描述)
顺序存储结构
顺序表中基本 运算的实现
链式存储结构
单链表
双链表
循环链表
单链表中基本 双链表中基本 循环链表中基
运算的实现
运算的实现 本运算的实现
9/32
线性表重要的知识点:
10/32
线性表的顺序存储结构:把线性表中的所有元素按照 顺序存储方法进行存储。
11/32
逻辑结构
线性表 (a1,a2,…,ai,…an)
直接映射
存储结构
01
i-1
n-1
a1 a2 … ai … an
MaxSize-1
…
n
data 顺序表
length
12/32
假设线性表L存储在数组A中,A的起始存储位置为LOC(A)
ai+1 … an
在线性表L中共有n+1个可以插入元素的地方
1
在插入元素ai时,若为等概率情况,则pi = n 1
此时需要将ai~an的元素均后移一个位置,共移动n-i+1个 元素。
所以在长度为n的线性表中插入一个元素时所需移动元
素的平均次数为:
n1
n1
pi (n i 1)
n 11(n
e 删除完成
29/32
删除算法如下:
30/32
对于本算法来说,元素移动的次数也与表长n和删除元素 的位置i有关:
当i=n时,移动次数为0; 当i=1时,移动次数为n-1。
删除算法最好时间复杂度为O(1) 删除算法最坏时间复杂度为O(n)
31/32
平均情况分析: a1 a2 … ai
19/32
(3)判定是否为空表ListEmpty(L) 该运算返回一个值表示L是否为空表。若L为空表,则
返回true,否则返回false。
20/32
(4)求线性表的长度ListLength(L) 该运算返回顺序表L的长度。实际上只需返回length成员
的值即可。
21/32
(5)输出线性表DispList(L) 该运算当线性表L不为空时,顺序显示L中各元素的值。
1/32
线性表是一个具有相同特性的数据元素的有限序列。
相同特性:所有元素属于同一数据类型。 有限:数据元素个数是有限的。 序列:数据元素由逻辑序号唯一确定。一个线性表中可以有相 同值的元素。
线性表中所含元素的个数叫做线性表的长度,用n表示,n≥0。 n=0时,表示线性表是一个空表,即表中不包含任何元素。
2/32
线性表的逻辑表示为:
(a1,a2,…,ai,ai+1,…,an)
ai(1≤i≤n)表示第i(i表示逻辑位序)个元素。
表头元素
表尾元素
(a1,a2,…,ai,ai+1,…,an)
3/32
线性表是客观事物的抽象 一个汽车线性表 一个小人线性表
4/32
5/32
线性表的9个基本运算如下:
引用参数:将执行结果回传给实参
17/32
2、顺序表基本运算算法
(1)初始化线性表InitList(L) 该运算的结果是构造一个空的线性表L。实际上只需将length
成员设置为0即可。
18/32
(2)销毁线性表DestroyList(L) 该运算的结果是释放线性表L占用的内存空间。
L 顺序表
free(L)释放L所指向的空间
ai+1 … an
在线性表L中共有n个可以删除元素的地方
在删除元素ai时,若为等概率情况,则pi
=
1 n
此时需要将ai+1~an的元素均前移一个位置,共移动 n-(i+1)+1=n-i个元素。
所以在长度为n的线性表中删除一个元素时所需移动元
下标位置 线性表存储空间 存储地址
0
a1
பைடு நூலகம்
LOC(A)
1
a2
LOC(A)+sizeof(ElemType)
...
...
i-1
ai
LOC(A)+(i-1)sizeof(ElemType)
...
...
n-1
an
LOC(A)+(n-1)sizeof(ElemType)
... ...
...
MaxSize-1
LOC(A)+(MaxSize-1)sizeof(ElemType)
若这样的元素不存在,则返回值为0。
24/32
(8)插入数据元素ListInsert(L,i,e)
该运算在顺序表L的第i(1≤i≤ListLength(L)+1)个 位置上插入新的元素e。
01
i-1 i i+1
n-1 n
a1 a2 … ai ai+1
… an
length nn+1
e 插入完成
25/32
插入算法如下:
26/32
对于本算法来说,元素移动的次数不仅与表长L->length=n 有关,而且与插入位置i有关:
当i=n+1时,移动次数为0; 当i=1时,移动次数为n,达到最大值。
算法最好时间复杂度为O(1)
算法最坏时间复杂度为O(n)
27/32
平均情况分析: a1 a2 … ai
22/32
(6)求某个数据元素值GetElem(L,i,e) 该运算返回L中第 i(1≤i≤ListLength(L))个元素的值,
存放在e中。
本算法的时间复杂度为O(1)。 体现顺序表的随机存取特性
23/32
(7)按元素值查找LocateElem(L,e) 该运算顺序查找第1个值域与e相等的元素的逻辑位序。
i
1)
n 2
i 1
i 1
因此插入算法的平均时间复杂度为O(n)。
28/32
(9)删除数据元素ListDelete(L,i,e) 该运算删除顺序表L的第i(1≤i≤ListLength(L))个元素。
01
i-1 i
a1 a2 … ai ai+1
…
n-2 n-1 an-1 an
length nn-1
注:顺序表采用数组来实现,但不能将任何一个数组都当作是
一个顺序表。
13/32
顺序表类型定义:
这里,假设ElemType 为char类型
其中data成员存放元素,length成员存放线性表的实际 长度。
14/32
1、建立顺序表
a[0..n-1] 顺序表L ─ 整体创建顺序表。
传递顺序表 指针
15/32