收藏 分享(赏)

线性表及其顺序存储结构.ppt

上传人:Facebook 文档编号:2590655 上传时间:2018-09-23 格式:PPT 页数:32 大小:200.50KB
下载 相关 举报
线性表及其顺序存储结构.ppt_第1页
第1页 / 共32页
线性表及其顺序存储结构.ppt_第2页
第2页 / 共32页
线性表及其顺序存储结构.ppt_第3页
第3页 / 共32页
线性表及其顺序存储结构.ppt_第4页
第4页 / 共32页
线性表及其顺序存储结构.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、2.2 线性表及其顺序存储结构,线性表的基本概念 线性表的顺序存储及运算 队列,2.2.1 线性表及其运算 1、概念,线性表(简称表):零个或多个具有相同类型的数据元素的有限序列。数据元素的个数称为线性表的长度。 长度等于零时称为空表,通常记为:L( ); 非空表通常记为:L(a1,a2,an)。 理解线性表的定义有以下要点: 序列顺序性:元素具有线性顺序,第一个元素无前驱,最后一个元素无后继,其他每个元素有且仅有一个前驱和一个后继。 有限有限性:元素个数有限,在计算机中处理的对象都是有限的。 相同类型相同性:元素取自于同一个数据对象,这意味着每个元素占用相同数量的存储单元。 元素类型不确定抽

2、象性:数据元素的类型是抽象的、不具体的,需要根据具体问题确定。,顺序表用一段地址连续的存储单元依次存储线性表的数据元素。线性表(a1,a2,an)的顺序存储示意图如图2.5所示。由于线性表中每个数据元素的类型相同,可以用C+语言中的一维数组来实现顺序表,也就是把线性表中相邻的元素存储在数组中相邻的位置,如图2.6所示,在稍微复杂的线性表中,一个数据元素还可以由若干个数据项组成。例如,某班的学生情况登记表是一个复杂的线性表,表中每一个学生的情况就组成了线性表中的每一个元素,每一个数据元素包括学号、姓名、性别、入学成绩4个数据项。,2、线性表的顺序存储线性表的顺序存储结构称为顺序表。,线性表的顺序

3、存储结构具有两个基本特点: 线性表中所有元素所占的存储空间是连续的; 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。,假设线性表中的第一个数据元素的存储地址(即首地址)为 ADR(a1),每一个数据元素占k个字节,则线性表中第i个元素ai在计算机存储空间中的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,长度为n的线性表在计算机中的顺序存储结构,在程序设计语言中,通常定义一个一维数组来表示线性表的顺序存储空间。应注意数组的基本类型要与线性表中数据元素的类型相同。,数组需要根据情况预设足够的大小,同时还需要一个变量指出线性表在数组中的当前状况,如元素个数或最后一个元素在数组中的

4、位置等。这两方面的信息共同描述一个顺序表,可将它们封装在一起。对C语言,顺序表可定义如下:,对C语言,顺序表可定义如下: #define MaxLength 50 typedef int ElemType; typedef struct ElemType listMaxLength;int length; SeqList; 今后使用此定义时,MaxLength及ElemType要根据实际问题的需要可重新选定。,3、顺序表的基本运算,1.顺序表的插入操作接口void Insert(int i, T x):在线性表的第i(1in+1)个位置上插入一个新元素x。 插入前:(a1,ai-1,ai,an

5、),插入后:(a1,ai-1,x,ai,an),顺序表在插入前后的状态对比如图2.12所示。,插入操作要点: 顺序存储要求逻辑上相邻的元素存储在数组中相邻的单元。 注意元素移动的方向后移一个单元。 从最后一个元素开始移动,直至第i个元素。 分析边界条件: 如果表满了,则引发上溢异常。 如果元素的插入位置不合理,则引发位置异常。,C语言描述template void SeqList:Insert(int i, T x) if (length=MaxSize) throw “上溢“;if (ilength+1) throw “位置“; for (j=length; j=i; j-) /注意j指的是

6、元素序号dataj=dataj-1; /注意第j个元素存储在数组下标为j-1处datai-1=x;length+;,2.顺序表的删除,操作接口T Delete(int i):将线性表中的第i(1in)个元素删除,并返回被删除元素的值。 删除前:(a1,ai-1,ai,ai+1,an),删除后:(a1,ai-1,ai+1,an),顺序表删除前后状态的对比如图2.13所示,删除操作要点:元素移动的方向前移一个单元;从第i+1个元素开始移动,直至最后一个元素;在移动元素之前要取出被删元素。分析边界情况:如果表空,则发生下溢异常; 如果元素的删除位置不合理,则引发删除位置异常。1. 如果表空,则抛出下

7、溢异常;2. 如果删除位置不合理,则抛出删除位置异常;3. 取出被删元素;4. 将第i+1个元素直至最后一个元素分别向前移动一个位置;5. 表长减1,返回被删元素值;,C语言描述template T SeqList:Delete(int i)if (length=0) throw “下溢“;if (ilength) throw “位置“;x=datai-1;for (j=i+1; j=length; j+) for (j=i; jlength; j+)dataj-2=dataj-1; dataj-1=dataj;length-;return x;,2.2.3 队列及其基本运算,1.什么是队列,

8、队列(queue )是一种只允许在表的一端进行插入,而在另一端进行删除的线性表。允许插入(入队)的一端称为队尾(rear),允许删除(出队)的一端称为队头(front)。不含元素的队列称为空队列。,退出队列时,也只能按a1,a2,a3,an 的顺序出队。这和日常生活中的排队是一致的。,在队列中,最先插入的元素,将最先能够被删除。反之,最后插入的元素,将最后才能被删除。因此,队列又称为“先进先出” 或后进后出的线性表。,2. 队列的顺序存储结构和基本运算,队列的顺序存储结构称为顺序队列。顺序队列通常用一个一维数组来存放队列中的数据元素。此外,还需设置两个整形变量front和rear作为队头指示器

9、和队尾指示器,分别指示队头和队尾元素在向量空间中的位置。,我们约定在队列初始化时,这两个指示器均置0值。入队时,将新元素插入到rear所指位置后,再将rear的值加1;出队时,删除front所指位置的元素后,再将front的值加1并返回被删元素。由此可见,当队头和队尾指示器值相等时,队列为空 。在非空队列里,front始终指向队头元素,而rear始终指向队尾元素的下一位置。在队列中,队尾指示器 rear 与队头指示器 front 共同反映了队列中元素动态变化的情况。,假设给队列分配的最大存储空间为4。在图(b)所示满队列状态下,如果还有新元素请求入队,则会出现“上溢” 错误。,在图(c)所示状

10、态下,如果还有新元素请求入队,这时,虽然队列的实际可用空间没有占满,但由于尾指针已超越存储空间的上界,故不能做入队操作,否则会出现“假上溢”的错误;在图(d)所示状态下,如果还要进行出队操作,由于这时队列已空,队列的头、尾指针均已超越存储空间的上界,故不能进行出队操作,否则会出现“下溢”的错误。,3.循环队列及其运算为避免发生顺序队列的“假上溢”现象,充分利用队列的存储空间,可以将顺序队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用,我们称这样的队列为循环队列。,front rear frontrear(a) 初始队列为空 (b) A、B、C入队rear fron

11、tfront rear(c) D入队后队满 (d) A、B、C、D出队队空循环队列入、出队操作示意图,在循环队列中进行出队、入队操作时,头、尾指针仍要加1,只不过当头尾指针指向上界时,其加1的操作结果是指向下界0。假设当前循环队列最多能容纳 MAXSIZE个元素,这种循环意义下的加1操作可表示为:,i=(i+1) % MAXSIZE /* i表示front或rear */,在循环队列中,仅依据头尾指针相等,是无法判断队列是“空”还是“满”。要解决这个问题,常用的方法是:少用一个元素空间,约定入队前,若尾指针加1后等于头指针,则认为队列满(rear所指单元始终为空)。,#define MAXSI

12、ZE 100 /*符号常量MAXSIZE代表队列的最大容量100*/ typedef char ElemType; /*说明新类型ElemType是字符型*/ typedef struct ElemType dataMAXSIZE;int front; int rear; CircularQueue; /*新类型CircularQueue是结构体*/,1) 构造一个空队列 Void InitQueue(CircularQueue *q) q-front=q-rear=0; 2)判断队列空 int QueueEmpty(CircularQueue *q) /*队列为空返回1,否则返回0*/if(

13、q-front=q-rear) exit(1);else exit(0); ,3)入队 void InsertQueue(CircularQueue *q,ElemType x) if(q-rear+1)%MAXSIZE=q-front)printf(“n 队满,上溢!“); exit(1);q-dataq-rear=x; /*新元素插入到队尾*/ q-rear=(q-rear+1)%MAXSIZE;/*尾指针加1*/ ,4)出队 ElemType DeleteQueue(CircularQueue *q) ElemType x;if(QueueEmpty(q)printf(“n 队空,下溢!

14、“);exit(1);x=q-dataq-front; /*取出队头元素*/q-front=(q-front+1)%MAXSIZE;/*队头指针加1*/return x; ,5)读取队头元素 ElemType GetHead(CircularQueue *q) ElemType x;if(QueueEmpty(q) printf(“n 队空,下溢!“);exit(1); x=q-dataq-front; /*取出队头元素*/ return x; ,4.队列应用举例,例如,某银行储蓄所有一个服务窗口,该窗口在某个时刻只能接待一位顾客,假设为一位顾客服务的时间为定值,在顾客人数众多时需要在窗口排队,若队列用q表示,顾客到达的时间是随机的,约定按如下方式处理:每单位时间内产生一个随机数arrive (0arrive1),如果arrive 小于prob( 0 prob 1 ,由程序输入的特定值),则记为有1人到达。顾客用整数表示,其值为该顾客进入队列的时间。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报