收藏 分享(赏)

数据结构课件(清华版).ppt

上传人:scg750829 文档编号:5398564 上传时间:2019-02-28 格式:PPT 页数:539 大小:7.70MB
下载 相关 举报
数据结构课件(清华版).ppt_第1页
第1页 / 共539页
数据结构课件(清华版).ppt_第2页
第2页 / 共539页
数据结构课件(清华版).ppt_第3页
第3页 / 共539页
数据结构课件(清华版).ppt_第4页
第4页 / 共539页
数据结构课件(清华版).ppt_第5页
第5页 / 共539页
点击查看更多>>
资源描述

1、数据结构 Data Structure河南大学计算机与信息工程学院 83,学 分: 5 教 材:严蔚敏等,数据结构(C语言版),清华大学出版社,1997年4月 参考书: 1 殷人昆等,数据结构(用面向对象方法与C+描述),清华大学出版社,1999年7月。¥26 2 殷人昆等,数据结构习题解析,清华大学出版社,2002年4月。¥26 3 李春葆,数据结构习题与解析(C语言篇),清华大学出版社,2001年1月。¥28 4 严蔚敏等,数据结构题集(C语言版),清华大学出版社, 1997年4月。¥16,内 容 安 排,注:本学期共85学时,机动5学时。,第1章 序 论,1.1 什么是数据结构 1.2

2、基本概念和术语 1.3 抽象数据类型的表示和实现 1.4 算法和算法分析,作业,5,1.1 什么是数据结构,Q1 如何采用计算机解决问题? Q2 数据结构解决什么样的问题? Q3 数据结构课程介绍,6,Q1:如何采用计算机解决问题?,答:,寻求数学模型的实质:分析问题,从中提取操作的对象,并找出这些 操作对象之间含有的关系,然后用数学的语言加以 描述。,(2) 设计解此数学模型的算法;,(1) 从具体问题抽象出一个适当的数学模型;,(3) 编程,测试、调整直至得到最终解答。,7,Q2:数据结构解决什么样的问题?,答:,数据结构研究非数值计算的程序设计问 题中计算机的操作对象以及它们之间的关系

3、和操作等的学科。,8,介于数学、计算机硬件和计算机软件三者之间的一门核心课程,关系,对象 关系 操作,对象 关系 操作,Q3:数据结构课程介绍,1.2 基本概念和术语,Q1 什么是数据结构? Q2 学习数据结构有什么用? Q3 数据结构涵盖的主要内容?,讨论:,Q1:什么是数据结构?,答: (见教材P5) 是相互之间存在一种或多种特定关系的数据元素的集合,表示为:,(数值或非数值),Data_Structure=(D, S),或:是指同一数据元素类中各元素之间存在的关系。,亦可表示为:S(D, R) 或 B=(K, R),元素有限集,关系有限集,术语:数据、数据元素和数据项,(见教材P4定义)

4、: 数据(data)所有能被计算机识别、存储和处理的符号的集合(包括数字、字符、声音、图像等信息 )。 数据元素(data element)是数据的基本单位,具有完整确定的实际意义(又称元素、结点,顶点、记录等)。 数据项(Data item)构成数据元素的项目。是具有独立含义的最小标识单位(又称字段、域、属性 等)。,三者之间的关系:数据 数据元素 数据项,例:班级通讯录 个人记录 姓名、年龄,Q2:学习数据结构有什么用?,答:计算机内的数值运算依靠方程式,而非数值运算(如表、树、图等)则要依靠数据结构。这是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等的学科

5、。,程序设计实质好算法好结构,同样的数据对象,用不同的数据结构来表示,运算效率可能有明显的差异。,Q3:数据结构涵盖的内容?,解释1: 什么叫数据的逻辑结构?,答:指数据元素之间的逻辑关系。即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。逻辑结构可细分为4类:,集合结构: 仅同属一个集合线性结构: 一对一(1:1) 树 结 构: 一对多(1:n)图 结 构: 多对多 (m:n),非线性,线 性,例:用图形表示下列数据结构,并指出它 们是属于线性结构还是非线性结构。,(1) S=(D, R)D= a, b, c, d, e, f R=(a,e), (b,c), (c,a), (e,

6、f), (f,d),解: 上述表达式可用图形表示为:,b c a e f d,此结构为线性的。,(2) S=(D, R) D=di | 1i5 R=(di , dj ), ij,d1d5 d2d4 d3,该结构是非线性的。,解:上述表达式可用图形表示为:,解释2:什么叫数据的物理结构?,答:物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。它依赖于计算机。,存储结构可分为4大类:,例:(见教材P6)复数3.02.3i 的两种存储方式:,顺序、链式、索引、散列,法1:地址 内容,法2:地址 内容,2字节,解释3:什么是数据的运算?,答:在数据的逻辑结构上定义的操作算法。 它

7、在数据的存储结构上实现。,最常用的数据运算有5种:,插入、删除、修改、查找、排序,1.3 抽象数据类型的表示和实现,Q1 数据类型与抽象数据类型的区别? Q2 抽象数据类型如何定义? Q3 抽象数据类型如何表示和实现?,讨论:,提示:教材中例1-6和例1-7分别给出了抽象数据类型“三元组”的定义、表示和实现,请试阅读。,Q1 数据类型与抽象数据类型的区别?,数据类型:是一个值的集合和定义在该值上的一组操作的总称。,抽象数据类型:由用户定义,用以表示应用问题的数据模型。它由基本的数据类型构成,并包括一组相关的服务(或称操作),它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息

8、隐蔽(独立于计算机)。,Q2 抽象数据类型如何定义?,抽象数据类型可以用以下的三元组来表示:ADT = (D,S,P)数据对象 D上的关系集 D上的操作集,ADT抽象数据类型名 数据对象:数据关系: 基本操作 : ADT抽象数据类型名,ADT常用定义格式,例:给出自然数(Natural Number )的抽象数据类型定义。,ADT Natural_Number is objects: 一个整数的有序子集合,它开始于0,结束于机器能表示的最大整数 (MAX INT) functions: 对于所有的 x, y Natural_Number; TRUE, FALSE Boolean; +, -,

9、, = = ,=等都是可用的服务。 Zero ( ): Natural Number 返回 0 IsZero(x): Boolean if (x=0) 返回TRUE else 返回 FALSE Add(x, y): Natural Number if (x+y = MAX INT)返回 x+yelse 返回MAX INT Subtract(x,y): Natural Number if (xy)返回0 else 返回x-y Equal(x,y): Boolean if (x= y)返回TRUE else 返回FALSE Successor(x) : Natural Number if (x =

10、 MAX INT)返回x else 返回x+1 end Natural_Number,Q3 抽象数据类型如何表示和实现?,抽象数据类型可以通过固有的数据类型 (如整型、实型、字符型等)来表示和实现。即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。,注 :教材中用的是类C语言(介于伪码和C语言之间)作为描述工具。其描述语法见P10-11。,但上机时要用具体语言实现,如C或C+等,1.4 算法和算法分析,Q1. 什么是算法? Q2. 算法设计的要求? Q3. 时间复杂度如何表示? Q4. 空间复杂度如何表示?,讨论:,答:算法是解决某一特定类型问题的有限运算 序列。是

11、一系列输入转换为输出的计算步骤。,Q1. 什么是算法?,算法有5个基本特性:,有穷性、确定性、可行性、输入和输出,26,Q2. 算法设计的要求?,答:,(1) 正确性,(2) 可读性,(3) 健壮性,(4) 效率与低存储需求,时间复杂度T(n)按数量级递增顺序为:,注1 O()为渐近符号。 注2 空间复杂度S(n)按数量级递增顺序也与上表类同。,复杂度高,复杂度低,Q3. 时间复杂度如何表示?,渐进符号(O)的定义:当且仅当存在一个正的常数 C,使得对所有的 n n0 ,有 f(n) Cg(n), 则f(n) = O(g(n),3n+2=O(n) /* 3n+24n for n2 */ 3n+

12、3=O(n) /* 3n+34n for n3 */ 100n+6=O(n) /* 100n+6101n for n10 */ 10n2+4n+2=O(n2) /* 10n2+4n+211n2 for n5 */ 6*2n+n2=O(2n) /* 6*2n+n2 7*2n for n4 */,例:,例:分析以下程序段的时间复杂度。,i=1; while(i=n)i=i*2; ,该算法的运行时间由算法中所有语句的频度(即该语句重复执行的次数)之和构成。,解:,分析:显然,语句的频度是1。设语句2的频度是f(n),则有:,即f(n)log2n,取最大值f(n)=log2n,所以该程序段的时间复杂度

13、T(n)=1+f(n)=1+ log2n= O( log2n),算法的时间复杂度是由嵌套最深层语句的频度决定的。,30,Q4. 空间复杂度如何表示?,S(n) = O(f(n),一个上机执行的程序除了需要存储空间来寄存本身所用指令、常数、变量和输入数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。,原地工作:若额外空间相对于输入数据量来说是常数,则称此算法为原地工作。,注:若额外空间所占空间量依赖于特定的输入,则除特别指明外,均按最坏情况来分析。,作业:,思考:数据结构、数据类型、抽象数据类型的区别算法与程序的区别 2. 请试做配套习题集(P10_16)。 3.

14、 复习C+语言。,32,上堂课要点回顾,数据结构课程涉及数学、计算机硬件和计算机软件 数据结构定义指互相有关联的数据元素的集合,用D_S=( D, S ) 或 S=( D, R) 表示。 数据结构内容数据的逻辑结构、存储结构和运算 算法效率指标时间效率和空间效率,33,数据结构课程的内容,逻辑结构唯一存储结构不唯一运算的实现依赖于存储结构,34,近3周 上课 内容,第2章 线性表 第3章 栈和队列 第4章 串 第5章 数组和广义表,线性结构,若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。,可表示为:(a1 , a2 , , an),

15、线性结构的定义:,(逻辑、存储和运算),35,线性结构的特点:, 只有一个首结点和尾结点; 除首尾结点外,其他结点只有一个直接前驱和一个直接后继。,线性结构表达式:(a1 , a2 , , an),线性结构包括线性表、堆栈、队列、字符串、数组等等,其中,最典型、最常用的是-,线性表,简言之,线性结构反映结点间的逻辑关系是 一对一 的,见第2章,36,第2章 线性表,2.1 线性表的逻辑结构 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 应用举例 (一元多项式的表示及相加),作业,37,(a1, a2, ai-1,ai, ai1 ,, an),2.1 线性表的类型定义,

16、一. 线性表的定义:用数据元素的有限序列表示,n=0时称为,数据元素,线性起点,ai的直接前趋,ai的直接后继,下标,是元素的序号,表示元素在表中的位置,n为元素总个数,即表长,空表,线性终点,38,例1 分析26 个英文字母组成的英文表,( A, B, C, D, , Z),例2 分析学生情况登记表,数据元素都是记录; 元素间关系是线性,数据元素都是字母; 元素间关系是线性,同一线性表中的元素必定具有相同特性,39,练:判断下列叙述的正误:,1. 数据的逻辑结构是指数据元素之间的逻辑关系,是用户按使用需要建立的。 2. 线性表的逻辑结构定义是唯一的,不依赖于计算机。 3. 线性结构反映结点间

17、的逻辑关系是一对一的。 4. 一维向量是线性表,但二维或N维数组不是。 5. “同一数据逻辑结构中的所有数据元素都具有相同的特性”是指数据元素所包含的数据项的个数都相等。,40,二.线性表的类型定义(详见课本P19),对线性表的有关操作举例请大家看课本P20例2-1,例2-2,41,2.2 线性表的顺序表示和实现,2.2.1 顺序表的表示 2.2.2 顺序表的实现 2.2.3 顺序表的运算效率分析,本节小结,作 业,42,2.2.1 顺序表的表示,用一组地址连续的存储单元依次存储线性表的元素,可通过数组Vn来实现。,把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。,线性表的顺序表

18、示又称为顺序存储结构或顺序映像。,顺序存储定义:,顺序存储方法:,简言之,逻辑上相邻,物理上也相邻,1.顺序表示,43,2.线性表顺序存储特点:,1) 逻辑上相邻的数据元素,其物理上也相邻; 2)若已知表中首元素在存储器中的位置,则其他元素存放位置亦可求出(利用数组下标)。计算方法是(参见存储结构示意图):设首元素a1的存放地址为LOC(a1)(称为首地址),设每个元素占用存储空间(地址长度)为L字节,则表中任一数据元素的存放地址为:LOC(ai) = LOC(a1) + L *(i-1)LOC(ai+1) = LOC(ai)+L,注意:C语言中的数组的下标从0开始,即:Vn的有效范围是V0V

19、n-1,44,线性表的顺序存储结构示意图,地址 内容 元素在表中的位序,1,i,2,n,空闲区,i+1,L,b=LOC(a1),b + L,b +(i-1)L,b +(n-1)L,b +(max-1)L,45,一个一维数组,下标的范围是到,每个数组元素用相邻的个字节存储。存储器按字节编址,设存储数组元素的第一个字节的地址是,则的第一个字节的地址是,113,因此:LOC( M3 ) = 98 + 5 (3-0) =113,解:地址计算通式为:,LOC(ai) = LOC(a1) + L *(i-1),例1,46,3.线性表的动态分配顺序存储结构,# define LIST_INIT_SIZE 1

20、00/ 线性表存储空间的初始分配量 # define LISTINCREMENT 10/ 线性表存储空间的分配增量 Typedef struct /若后面不再用,可省略结构名ElemType *elem; /表基址int length; /表长(特指元素个数)int listsize; /表当前存储容量(字节数) SqList;,47,问1:自定义结构类型变量test的长度m是多少? msizeof(test) 问2:结构变量test的首地址(指针p)是多少?p(test*)malloc(m) 问3:怎样删除结构变量test?只能借助其指针删除! free(p),补充:介绍三个有用的库函数(都

21、在 中): sizeof(x)计算变量x的长度; malloc(m) 开辟m字节长度的地址空间,并返回这段空间的首地址; free(p) 释放指针p所指变量的存储空间,即彻底删除一个变量。,48,2.2.2 顺序表的实现(或操作),回忆:数据结构基本运算操作有:修改、插入、删除、查找、排序,1.修改 通过数组的下标便可访问某个特定 元素并修改之。,核心语句: Vi=x;,显然,顺序表修改操作的时间效率是T(n)=O(1),49,2.建立 Status InitList_Sq( SqList / InitList_Sq,50,3.插入 在线性表的第i个位置前插入一个元素,实现步骤:(n为表长)

22、将第n至第i 位的元素向后移动一个位置; 将要插入的元素写到第i个位置; 表长加1。 注意:事先应判断: 插入位置i 是否合法?表是否已满? 应当有1in+1 或 i=1,n+1,for (p=,/ 元素后移一个位置,/ 插入e,/ 表长加1,核心语句:,51,在线性表的第i个位置前插入一个元素的示意图如下:,插入25,52,实现步骤:(n为表长) 将第i +1至第n 位的元素向前移动一个位置; 表长减1。 注意:事先需要判断,删除位置i 是否合法? 应当有1in 或 i=1, n,4.删除 删除线性表的第i个位置上的元素,for (+p;p=q;+p) *(p-1)=*p; -n;,/ 元素

23、前移一个位置,/ 表长减1,核心语句:,53,删除顺序表中某个指定的元素的示意图如下:,54,2.2.3 顺序表的运算效率分析,算法时间主要耗费在移动元素的操作上,因此计算时间复杂度的基本操作(最深层语句频度) T(n)= O (移动元素次数) 移动元素的个数取决于插入或删除元素的位置.,思考:若插入在尾结点之后,则根本无需移动(特别快); 若插入在首结点之前,则表中元素全部要后移(特别慢); 若要考虑在各种位置插入(共n+1种可能)的平均移动次数,该如何计算?,讨论1:若在长度为 n 的线性表的第 i 位前 插入一 元素,则向后移动元素的次数f(n)为:f(n) =,n i + 1,时间效率

24、分析:,55,证明:假定在每个元素位置上插入x的可能性都一样(即概率P相同),则应当这样来计算平均执行时间: 将所有位置的执行时间相加,然后取平均。 若在首结点前插入,需要移动的元素最多,后移n次; 若在a1后面插入,要后移n-1个元素,后移次数为n-1; 若在an-1后面插入,要后移1个元素; 若在尾结点an之后插入,则后移0个元素;所有可能的元素移动次数合计: 0+1+n = n(n+1)/2,共有多少种插入形式?连头带尾有n+1种,所以平均移动次数为:n(n+1)/2(n+1)n/2O(n),同理可证:顺序表删除一元素的时间效率为: T(n)=(n-1)/2 O(n),56,讨论2:若在

25、长度为n的线性表上删除第i位元素,向前移动元素的次数f(n)为: f(n)=,思考:若删除尾结点,则根本无需移动(特别快); 若删除首结点,则表中元素全部要前移(特别慢); 若要考虑在各种位置删除(共n种可能)的平均移动次数,该如何计算?,n i,可以证明: 插入、删除操作平均需要移动一半元素(n/ 2) 插入、删除算法的平均时间复杂度为:O(n),显然,顺序表的空间复杂度S(n)=O(1) (没有占用辅助空间),57,教材P25算法2.5也是对执行效率的推导:,假定在表中任意位置插入、删除元素都是等概率的, 插入概率p(i)=1/(n+1) ,删除概率q(i)=1/n ,则:,插入操作时间效

26、率(平均移动次数),删除操作时间效率(平均移动次数),58,本节小结,线性表顺序存储结构特点:逻辑关系上相邻的两个元素在物理存储位置上也相邻; 优点:可以随机存取表中任一元素; 缺点:在插入,删除某一元素时,需要移动大量元素。 为克服这一缺点,我们引入另一种存储形式:,链式存储结构,见2.3节,59,作业:,实验: P181实验一: 集合的交并和差运算的实现,60,第2章 线性表,2.1 线性表的逻辑结构 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 应用举例,作业,61,上堂课要点回顾,线性结构(包括表、栈、队、数组)的定义和特点:仅一个首、尾结点,其余元素仅一个直

27、接前驱和 一个直接后继。,2. 线性表,逻辑结构:“一对一” 或 1:1 存储结构:顺序、链式 运 算 :修改、插入、删除,3.顺序存储,特征:逻辑上相邻,物理上也相邻; 优点:随机查找快 O(1) 缺点:插入、删除慢 O(n),62,2.3 线性表的链式表示和实现,2.3.1 链表的表示 2.3.2 链表的实现线性链表,循环链表,双向链表 2.3.3 链表的运算效率分析,本节小结,作 业,(续上堂课),63,2.3.1 链表的表示,链式存储特点 与链式存储有关的术语 线性表的单链表存储结构,64,1. 链式存储特点:逻辑上相邻,物理上不一定相邻,链表存放示意图如下:,讨论1:每个存储结点都包

28、含两部分:数据和 。,讨论2:在单链表中,除了首元结点外,任一结点的存储位置由 指示。,其直接前驱结点的链域的值,指针域(链域),65,2. 与链式存储有关的术语,1) 结点: 数据元素的存储映像。由数据域和指针域两部分组成; 2)链表: n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构。 3)单链表、双链表、多链表、循环链表: 结点只有一个指针域的链表,称为单链表或线性链表; 有两个指针域的链表,称为双链表; 有多个指针域的链表,称为多链表; 首尾相接的链表称为循环链表。,4)头指针、头结点和首元结点,以教材P27 图2.5和图2.6内容为例说明。,66,何

29、谓头指针、头结点和首元结点?,头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针。单链表可由一个头指针唯一确定。 头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息; 首元结点是指链表中存储线性表第一个数据元素a1的结点。,67,一个线性表的逻辑结构为:(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存储结构用单链表表示如下,请问其头指针的值是多少?,例:,答:头指针是指向链表中第一个结点的指针,因此关键是要寻找第一个结点的地址。,31,头指针的值是31,68,上例链表的逻辑结构示意图有以下两种形式:,区别: 无头结点 有头结点

30、,69,Typedef struct Lnode ElemType data; /数据域struct Lnode *next; /指针域Lnode, *LinkList; / *LinkList为Lnode类型的指针,3. 线性表的单链表存储结构,70,2.3.2 链表的实现,1. 单链表的建立 2. 单链表的查找 3. 单链表的插入 4. 单链表的删除 5. 其它链表形式,71,1. 单链表的建立,难点分析:每个数据元素在内存中是“零散”存放的,其首地址怎么找?又怎么一一链接?,实现思路:先开辟头指针,然后陆续为每个数据元素开辟存储空间并赋值,并及时将地址送给前面的指针。,72,Void C

31、reateList_L (LinkList / 插入到表头 / CreateList_L,73,2. 单链表的查找,思路:要修改第i个数据元素,关键是要先找到该结 点的指针p,然后用p-data=new_value 即可。,难点:单链表中想取得第i个元素,必须从头指针出 发寻找(顺藤摸瓜),不能随机存取 。,核心语句:见教材P29的GetElem_L函数说明,74,Status GetElem_L(LinkList L, int i, ElemType / GetElem_L,讨论:要统计链表中数据元素的个数,该如何改写?,75,3. 单链表的插入,在链表中插入一个元素的示意图如下:,插入步骤

32、(即核心语句):,Step 1:s-next=p-next; Step 2:p-next=s ;,p-next,s-next,思考:步骤1和2能互换么?,元素x结点应预先生成: S=(test*)malloc(m); S-data=x; S-next=p-next,76,4. 单链表的删除,在链表中删除某元素的示意图如下:,删除步骤(即核心语句):,q = p-next; /保存b的指针,靠它才能指向c p-next=q-next; /a、c两结点相连 free(q) ; /删除b结点,彻底释放,p-next,思考: 省略free(q)语句行不行?,(p-next) - next,77,应用举

33、例:两个链表的归并(教材P31),算法要求: 已知:线性表 A、B,分别由单链表 LA , LB 存储,其中数据元素按值非递减有序排列, 要求:将 A ,B 归并为一个新的线性表C , C 的数据元素仍按值非递减排列 。设线性表 C 由单链表 LC 存储。 假设:A=(3,5,8,11),B=(2,6,8,9,11) 预测:合并后 C =( 2 , 3 , 5 , 6 , 8 , 8 , 9 , 11,11 ),78,用链表可表示为:,头结点,79,算法分析:,算法主要包括:搜索、比较、插入三个操作:搜索:需要两个指针搜索两个链表;比较:比较结点数据域中数据的大小;插入:将两个结点中数据小的结

34、点插入新链表。,80,La,Pa、Pb用于搜索La和Lb, Pc指向新链表当前结点,81,算法实现:,Void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) /按值排序的单链表LA,LB,归并为LC后也按值排序,free(Lb); /释放Lb的头结点 /MergeList_L,pc-next = pa?pa:pb ; /插入剩余段,while(pa pb=pb-next ,pa=Lanext; pb=Lbnext; Lc=pc=La; /初始化,82,思考:,1、不用Lc,直接把La表插到Lb表中;或者把Lb表插到La表中,如何编程?,

35、2、要求不能有重复的数据元素,如何编程?,83,5. 其它链表形式,1) 循环链表:将表中最后一个结点的指针域指向头结 点(P-next=head;),整个链表形成一个环。(示例见课本P35 图2.12) A.特点:从任一结点出发均可找到表中其他结点。B. 与单链表的区别:循环条件单链表 - p = NULL 或 p -next =NULL循环链表- p= head 或 p-next = headC. 设立尾指针:可以使链表合并简化(课本P35-图2.13)。,84,2)双向链表:有两个指针域的链表,称为双链表。(示例见课本P36图2.14) A.结点结构:B.特点:可以双向查找表中结点。 C

36、.运算:插入课本P36算法2.18,图2.16。删除课本P37算法2.19,图2.15。注:双向链表在非线性结构(如树结构)中将大量使用。,85,2.3.3 链表的运算效率分析,时间效率分析 1. 查找 因线性链表只能顺序存取,即在查找时要从头指针找起,查找的时间复杂度为 O(n)。 2. 插入和删除 因线性链表不需要移动元素,只要修改指针,一般情况下时间复杂度为 O(1)。但是,如果要在单链表中进行前插或删除操作,由于 要从头查找前驱结点,所耗时间复杂度为 O(n)。,86,练习: 在n个结点的单链表中要删除已知结点*P,需找到它的前驱结点的地址,其时间复杂度为 O(n) 。空间效率分析 链

37、表中每个结点都要增加一个指针空间,相当于总共增加了n 个整型变量,空间复杂度为 O(n)。,87,2.4 应用举例,一元多项式的数学通式? 用抽象数据类型如何描述它的定义? 用C语言如何描述它的定义? 如何编程实现两个一元多项式相加?,一元多项式的表示及相加 (参见教材P39 43),讨论:,88,1. 一元多项式的数学通式?,一元多项式的通式可表示为:,分析:一元多项式在计算机内存储时,既可用顺序表存储,又可用链表存储。但当多项式的次数很高且零系数项很多时,则更适于用链表存储(通常设计两个数据域和一个指针域)。,顺序表,链表,或,89,2. 用抽象数据类型如何定义一元多项式?,(参见P40)

38、,ADT Polynomial 数据对象:D=ai|aiTermSet,i=1,2,m, m0 TermSet中的每个元素包含一个表示系数的实数和表示指数的整数 数据关系:R1=| ai-1, ai D,且ai-1中的指数值ai中的指数值, i=1,2,n 基本操作: CreatPolyn(&P,m) 操作结果:输入m项的系数和指数,建立一元多项式P。/建表,90,DestroyPolyn(&P) 初始条件:一元多项式P已存在。 操作结果:销毁一元多项式P。 /释放表PrintPolyn(P) 初始条件:一元多项式P已存在。 操作结果:打印输出一元多项式P。 /输出表PolynLength(P

39、) 初始条件:一元多项式P已存在。 操作结果:返回一元多项式P中的项数。/求表长,91,AddPolyn(&Pa,&Pb) 初始条件:一元多项式Pa和Pb已存在。 操作结果:完成多项式相加运算,即:PaPaPb, 并销毁一元多项式Pb。 /两表相加,SubtractPolyn(&Pa,&Pb) 初始条件:一元多项式Pa和Pb已存在。 操作结果:完成多项式相减运算,即:PaPaPb, 并销毁一元多项式Pb。 /两表相减,ADT Polynomial,MultiplyPolyn(&Pa,&Pb) 初始条件:一元多项式Pa和Pb已存在。 操作结果:完成多项式相乘运算,即:PaPaPb, 并销毁一元多

40、项式Pb。 /两表相乘,92,3. 用C语言如何具体描述它的定义?,法一:用类C语言,参见教材P42,法二:用标准C语言:typedef struct poly_node *poly_pointer;typedef struct poly_node int coef;int expon;poly_pointer link;poly_pointer a, b, c;,93,实现思路:,依次比较Pa和Pb所指结点中的指数项,依 Pa-expon =、Pb-expon等情况,再决定是将两系数域的数值相加(并判其和是否为0),还是将较高指数项的结点插入到新表c中。,+,94,具体编程(用C语言),利用

41、建表操作CreatPolyn(&P,m)分别建立链表a和链表b;详细内容参见教材P42下部描述。,2. 利用加操作AddPolyn(&Pa,&Pb)对链表a和链表b进行相加;详细内容参见教材P43描述。,编程时请注意,在前面定义中已规定: 初始条件:一元多项式Pa和Pb已存在。 操作结果:完成多项式相加运算,即:PaPaPb, 并销毁一元多项式Pb。,从教材程序中可“猜”出,例中的链表是按指数项升序排列的。,95,Void AddPolyn(polynomial&Pa, polynomial &Pb),ha=GetHead(Pa); hb =GetHead(Pb); /取二表头指针(指向头结点

42、) qa=NextPos(Pa,ha); qb = NextPos(Pb,hb); /指向二表首元结点 while (qa ,96,elseDelFirst(ha,qa); FreeNode(qa);/若系数为0,则两结点都删DelFirst(hb,qb); FreeNode(qb); qa=NextPos(Pa,ha); qb=NextPos(Pb,hb); break; case 1: / 若a的指数值大于b,应前插b(保持升序) DelFirst(hb,qb); InsFirst(ha,qb); qb=NextPos(Pb,hb); ha=NextPos(Pa,ha); break; /

43、a表大结点后移 /switch /while If(!List Empty(Pb) Append(Pa,qb); / 若a表空,则b表剩余项全部/链接到a表中;而b表空时无需动作,因为a表本身就是求和结果。 FreeNode(hb); /无论什么结局,最终b表都是要废掉的。 / AddPolyn,97,运算效率分析:,(1) 系数相加0 加法次数 min(m, n)其中 m和n分别表示表A和表B的结点数。 (2) 指数比较极端情况是表A和表B 没有一项指数相同,比较次数最多为m+n-1 (3) 新结点的创建极端情况是产生m + n 个新结点合计时间复杂度为 O(m+n),98,本章小结(讨论题

44、形式),问1:线性表的逻辑结构特点是什么?其顺序存储结构和链式存储结构的特点是什么? 答:线性表逻辑结构特点是,只有一个首结点和尾结点;除首尾结点外其他结点只有一个直接前驱和一个直接后继。简言之,线性结构反映结点间的逻辑关系是一对一(1:1)的。顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。,99,问2:顺序存储和链式存储各有哪些优缺点?,答:顺序存储的优点是存储密度大(1),存储空间利用率高。缺点是插入或删除元素时不方便。链式

45、存储的优点是插入或删除元素时很方便,使用灵活。缺点是存储密度小(1),存储空间利用率低。事实上,链表插入、删除运算的快捷是以空间代价来换取时间。,100,问3:在什么情况下用顺序表比链表好?,答:顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。,101,作业:,请试做配套题集.,102,数据结构课程的内容,103,3.1 栈(Stack),第三章 栈和队列,3.2 队列(Queue),1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5.

46、实现方式,1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式,104,1. 定义,3.1 栈,与同线性表相同,仍为一对一关系。,用顺序栈或链栈存储均可,但以顺序栈更常见,只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则。,关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。 基本操作有入栈、出栈、读栈顶元素值、建栈、或判断栈满、栈空等。,限定只能在表的一端进行插入和删除运算的线性表(只能在栈顶操作),105,问:堆栈是什么?它与一般线性表有什么不同?,3.1 栈,答:堆栈是一种特殊的线性表,它只能在表的一端(即栈顶)进行插入和删

47、除运算。与一般线性表的区别:仅在于运算规则不同。,一般线性表 堆栈 逻辑结构:一对一 逻辑结构:一对一 存储结构:顺序表、链表 存储结构:顺序栈、链栈 运算规则:随机存取 运算规则:后进先出(LIFO),“进” 压入=PUSH(x) “出” 弹出=POP ( y ),106,栈 是仅在表尾进行插入、删除操作的线性表。 表尾(即 an 端)称为栈顶 top ; 表头(即 a1 端)称为栈底base,例如: 栈 s= (a1 , a2 , a3 , .,an-1 , an ),a1 称为 栈底元素 an 称为 栈顶元素,插入元素到栈顶(即表尾)的操作,称为入栈。 从栈顶(即表尾)删除最后一个元素的操作,称为出栈。,教材P44对栈有更详细定义:,强调:插入和删除都只能在表的一端(栈顶)进行!,

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

当前位置:首页 > 中等教育 > 职业教育

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


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

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

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