第2章线性表1(顺序表)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.线性表抽象数据类型
它包括两个方面: 数据集合:{ a0, a1, … , an-1 } ai的数据类型为 DataType 操作集合:(1)ListInitiate(L) 初始化线性表
(2)ListInsert(L,i,x) 插入数据元素 (3)ListLength(L) 求当前数据元素个数 (4)ListDelete(L,i,x) 删除数据元素 (5)ListGet(L,i,x) 取数据元素等
6
3.线性表的存储结构
(1)顺序存储结构:它是使用一片地址连续的有限内存单ห้องสมุดไป่ตู้元空间存储数据元素的一种计算机存储数据方法。
特点:(任意两个在逻辑上相邻的数据元素在物理位置 上也必然相邻)逻辑上相邻的元素,物理上也相邻。
(2)链式存储结构:它是把数据元素和指针定义成一个存 储体,使用指针把发生联系的数据元素链接起来的 一种计算机存储数据方法。
所有可能的元素移动次数合计: 0+1+…+n = n(n+1)/2
共有多少种插入形式?——连头带尾有n+1种!
故 插 入 时 的 平 均 移 动 次 数 为 : n(n+1)/2÷ ( n+1 ) = n/2≈O(n)
22
同理可证:顺序表删除一元素的时间效率为: T(n)=(n-1)/2 ≈O(n)
特点:任意两个在逻辑上相邻的数据元素在物理上不 一定相邻,数据元素的逻辑次序是通过链中的指针 链接实现的。
7
2.2 线性表的顺序表示和实现
一 、 顺序表的存储结构 二、 顺序表的实现 三、 顺序表的运算效率分析
8
一、 顺序表的存储结构表示 可以利用数组V[n]来实现
1、顺序表:用一组地址连续的存储单元依次存储线
元素存放位置亦可求出(利用数组V[n]的下标)。 设首元素a0的存放地址为LOC(a0)(称为首地址), 设每个元素占用存储空间(地址长度)为L字节, 则表中任一数据元素的存放地址为:
LOC ( ai+1 ) = LOC( ai ) + L LOC ( ai ) = LOC( a0 ) + L *i
12
例1 设有一维数组M,下标的范围是0到9, 每个数组元素用相邻的5个字节存储。存储器 按字节编址,设存储数组元素M[0]的第一个 字节的地址是98,则M[3]的第一个字节的 地址是多少?
113
解:已知地址计算通式为: LOC(ai) = LOC(a0) + L *i
LOC( M[3] ) = 98 + 5 ×3 =113
性表的各个数据元素。即采用顺序存储结构的线性 表。它通常采用静态数组实现数据元素的存储。
注意:在C语言中数组的下标是从0开始,即: V[n]的有效范围是从 V[0]~V[n-1]
9
2、线性表顺序存储特点:
(1) 逻辑上相邻的数据元素,其物理上也相邻; (2) 若已知表中首元素在存储器中的位置,则其他
20
三、 顺序表操作的效率分析
时间效率分析: 算法时间主要耗费在移动元素的操作上,因此 计算时间复杂度的基本操作(最深层语句频度)
T(n)= O (移动元素次数) 而移动元素的个数取决于插入或删除元素的位置.
思考:若插入在尾结点之后,则根本无需移动(特别快); 若插入在首结点之前,则表中元素全部要后移(特别慢); 应当考虑在各种位置插入(共n+1种可能)的平均移动次数才合理。
教材有对执行效率的推导:
插入效率:Eis
n1 i 1
pi (n i 1)
1 n 1
n1
(n i
i 1
1)
n 2
删除效率:Edl
n i 1
qi (n i)
1 n
n i 1
(n i)
n 1 2
即插入、删除算法的平均 时间复杂度为 O(n)
23
本节小结
线性表顺序存储结构特点:逻辑关系上相邻的两个元素 在物理存储位置上也相邻; 优点:可以随机存取表中任一元素,方便快捷; 缺点:在插入或删除某一元素时,需要移动大量元素。 解决问题的思路:改用另一种线性存储方式:
链式存储结构
24
作业:
参考教材课后习题 (<<数据结构题集>>,严蔚敏、吴伟民 著)
线性结构的定义:
若结构是非空有限集,则有且仅有一个开始结点和一个 终端结点,并且所有结点都最多只有一个直接前趋和一个直 接后继。 →可表示为:(a1 , a2 , ……, an) 特点① 只有一个首结点和尾结点; 特点② 除首尾结点外,其他结点只有一个直接前驱和一个直
接后继。
简言之,线性结构反映结点间的逻辑关系是 一对一 (1:1) 的。
个相同类型数据元素a0, a1, … , an-1组成的线
性结构。
3
线性表的逻辑结构:
(a0, a1, … ai-1,ai, ai+1 ,…, an-1)
线性起点
下标,是元素的 序号,表示元素 在表中的位置
数据元素
ai的直接前趋 ai的直接后继 线性终点
n=0时称为 空表
n为元素总
个数,即表 长。n≥0
2.10,2.12
25
15
int ListInsert(SeqList *L,int i,DataType x)
{ int j;
if(L->size>=MaxSize) {
插
printf(“顺序表已满无法插入!\n”);
入
return 0;
数
} else if(i<0 // i>L->size) {
据
printf(“参数i不合法!\n”);
L->size--; // 表长减1
return 1;
18
删除顺序表中某个指定的元素的示意图如下:
1 12 2 13 3 21 4 24 5 25 6 28 7 30 8 42 9 77
1 12 2 13 3 21 4 24 5 28 6 30 7 42 8 77
19
例:建立一个线性表,先依次输入数据元素1,2, 3,4,…,10,然后删除5,最后依次显示当前 线性表中的数据元素。假设该线性的数据元素个 数最坏情况下不会超过100个。 实现方法: 1、采用直接编写一个主函数实现。 2、利用已设计实现的抽象数据类型模块。(存 放在头文件名为SeqList.h中,通过 #include “SeqList.h” )
对上述公式的解释如图所示
10
3、线性表的顺序存储结构示意图
地址 b=LOC(a0)
b+L b +iL
b +(n-1)L
内容
a0 a1 …… ai ai+1 …… an-1
元素在表中的位序 L0
1
i i+1
n-1
b +(MaxSize1)L LOC ( ai ) = LOC( a0 ) + L *i
6 30
7 42
8 77
1 12 2 13 3 21 4 24 5 25 6 28 7 30 8 42 9 77
17
3)删除 删除线性表的第i个位置上的元素 实现步骤: 将第i+1 至第n 位的元素向前移动一个位置; 表长减1。 注意:事先需要判断,删除位置i 是否合法?
核心语句: for ( j=i+1; j<=L->size-1; j++ ) L->list[j-1]= L->list[j] ; // 元素前移一个位置
线性结构包括:线性表、堆栈、队列、字符串、数组
等,其中最典型、最常用的是------ 线性表
1
第2章 线性表
2.1 线性表的基本概念 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 应用举例
2
2.1 线性表的基本概念
1、线性表 它是一种最简单的线性结构。是一种可以在任
意位置进行插入和删除数据元素操作的,由n(n≥0)
元
return 0;
素}
else {
for (j=L->size; j>i; j--) L->list[j]=L->list[j-1] ;
L->list[i]=x;
L->size++;
return 1;
}
}
16
在线性表的第i个位置前插入一个元素的示意图如下:
1 12
2 13
3 21
插入254
5
24 28
18 2003级电信0302 班
01200301081 王 泽 男 3
19 2003级电信0303 班
01200301090 薛 荃 男 6
19 2003级电信0304 班
0120注0意830:11同01一线王性春表中的男元素必定19具有相20同03特级性电班信!0305 分析:数:据元素都是:同类型(: 记录),:元素间关系:是线性的。 5
4
例1 分析26 个英文字母组成的英文表是什么结构。
( A, B, C, D, …… , Z)
分析: 数据元素都是同类型(字母), 元素间关系是线性的。
例2 分析学生情况登记表是什么结构。
学号
姓名 性别 年龄
班级
01200301062 陈建武 男 2
19 2003级电信0301 班
01200301070 赵玉凤 女 4
21
推导:假定在每个元素位置上插入x的可能性都一样(即 概率P相同),则应当这样来计算平均执行时间:
将所有位置的执行时间相加,然后取平均。
若在首结点前插入,需要移动的元素最多,后移n次; 若在a1后面插入,要后移n-1个元素,后移次数为n-1; …… 若在an-1后面插入,要后移1个元素; 若在尾结点an之后插入,则后移0个元素;
空闲区
11
4、用C语言描述 typedef struct {
DateType list[MaxSize]; int size;
}SeqList;
/* MaxSize表示数组的最大元素个数,list表示顺序表 的数组名,size表示顺序表中当前存储的数据元素个 数,它必须满足size≤ MaxSize,SeqList是该结构体 的名字。*/
13
二、 顺序表的实现(或操作)
数据结构的基本运算: 修改、插入、删除、查找、排序
1) 修改 通过数组的下标便可访问某个特定元素并修 改之。
核心语句: V[i]=x; 显然,顺序表修改操作的时间效率是 O(1)
14
2)插入 在线性表(n个元素)的第i个位置前插入一个元素
实现步骤: • 将第n至第i 位的元素向后移动一个位置; • 将要插入的元素写到第i个位置; • 表长加1。 注意:事先应判断: 插入位置i 是否合法?表是否已满?