《软件技术基础完整版课件全套ppt教学教程最全整套电子讲义幻灯片最新》由会员分享,可在线阅读,更多相关《软件技术基础完整版课件全套ppt教学教程最全整套电子讲义幻灯片最新(642页珍藏版)》请在金锄头文库上搜索。
1、01:30:07第第1 1章章绪论绪论 第一章第一章 绪绪 论论 计算机发展的初期,其应用主要是数值计算问题,即所计算机发展的初期,其应用主要是数值计算问题,即所处理的数据都是整型、实型及布尔型等简单数据。随着计算处理的数据都是整型、实型及布尔型等简单数据。随着计算机应用领域的不断扩大,非数值计算问题占据了目前计算机机应用领域的不断扩大,非数值计算问题占据了目前计算机应用的绝大部分,计算机所处理的数据也不再是简单的数值,应用的绝大部分,计算机所处理的数据也不再是简单的数值,而是扩展到字符串、图形、图像、语音、视频等复杂的数据。而是扩展到字符串、图形、图像、语音、视频等复杂的数据。这些复杂的数据
2、不仅量大,而且具有一定的结构。这些复杂的数据不仅量大,而且具有一定的结构。例如,一幅图像是由简单的数值组成的矩阵;一个图形中例如,一幅图像是由简单的数值组成的矩阵;一个图形中的几何坐标可以组成表;语言编译程序中使用的栈、符号表的几何坐标可以组成表;语言编译程序中使用的栈、符号表和语法树,操作系统中所用到的队列、树形目录等,都是有和语法树,操作系统中所用到的队列、树形目录等,都是有结构的数据。为了有效地组织和管理好这些数据,设计出高结构的数据。为了有效地组织和管理好这些数据,设计出高质量的程序以及高效率地使用计算机,就必须深入研究这些质量的程序以及高效率地使用计算机,就必须深入研究这些数据自身的
3、特性以及它们之间的相互关系。数据自身的特性以及它们之间的相互关系。本章内容提要本章内容提要: :l数据结构的概念数据结构的概念l逻辑结构与存储结构逻辑结构与存储结构l算法与算法分析算法与算法分析 第一章第一章 绪论绪论1.1 1.1 数据结构的概念数据结构的概念l l 数据结构的概念数据结构的概念数据结构的概念数据结构的概念l l 数据结构数据结构数据结构数据结构l l 数据与数据元素数据与数据元素数据与数据元素数据与数据元素l l 绪论绪论绪论绪论用计算机解决实际问题的软件开发一般分为下面几个步骤:用计算机解决实际问题的软件开发一般分为下面几个步骤:l数据结构的概念数据结构的概念数据结构的概
4、念数据结构的概念l l (1 1)分析阶段:分析实际问题,从中抽象出一个数学模型。)分析阶段:分析实际问题,从中抽象出一个数学模型。)分析阶段:分析实际问题,从中抽象出一个数学模型。)分析阶段:分析实际问题,从中抽象出一个数学模型。l l (2 2)设计阶段:设计出解决数学模型的算法。)设计阶段:设计出解决数学模型的算法。)设计阶段:设计出解决数学模型的算法。)设计阶段:设计出解决数学模型的算法。l l (3 3)编程阶段:用适当的编程语言编写出可执行的程序。)编程阶段:用适当的编程语言编写出可执行的程序。)编程阶段:用适当的编程语言编写出可执行的程序。)编程阶段:用适当的编程语言编写出可执行
5、的程序。l l (4 4)测试阶段:测试、修改直到得到问题的解答。)测试阶段:测试、修改直到得到问题的解答。)测试阶段:测试、修改直到得到问题的解答。)测试阶段:测试、修改直到得到问题的解答。l l 绪论绪论绪论绪论数据结构课程集中讨论软件开发过程中的设计阶段,同时涉数据结构课程集中讨论软件开发过程中的设计阶段,同时涉及分析阶段和编程阶段的若干基本问题。此外,为了构造出及分析阶段和编程阶段的若干基本问题。此外,为了构造出好的数据结构及其实现,还需考虑数据结构及其实现的评价好的数据结构及其实现,还需考虑数据结构及其实现的评价与选择。因此,数据结构课程的内容包括了下表所示的数据与选择。因此,数据结
6、构课程的内容包括了下表所示的数据表示方面和数据处理方面的表示方面和数据处理方面的3个层次。个层次。l数据结构的概念数据结构的概念数据结构的概念数据结构的概念方方 面面层层 次次数据表示数据表示数据处理数据处理抽象逻辑结构基本运算实现存储结构算法评价不同数据结构的比较与算法分析l l 绪论绪论绪论绪论数据结构的核心内容是分解与抽象。通过对问题的抽象,舍弃数据元素数据结构的核心内容是分解与抽象。通过对问题的抽象,舍弃数据元素(含义见后)的具体内容,就得到逻辑结构;类似地,通过分解将处理(含义见后)的具体内容,就得到逻辑结构;类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现的细节,就得到
7、基本运算的要求划分成各种功能,再通过抽象舍弃实现的细节,就得到基本运算的定义。上述两个方面的结合使人们将问题转换为数据结构,这是一个从定义。上述两个方面的结合使人们将问题转换为数据结构,这是一个从具体(即具体问题)到抽象(即数据结构)的过程。通过增加对实现细具体(即具体问题)到抽象(即数据结构)的过程。通过增加对实现细节的考虑,进一步得到存储结构和实现算法,从而完成设计任务,这是节的考虑,进一步得到存储结构和实现算法,从而完成设计任务,这是一个从抽象(即数据结构)到具体(即具体实现)的过程。熟练掌握这一个从抽象(即数据结构)到具体(即具体实现)的过程。熟练掌握这两个过程是数据结构课程在专业技能
8、培养方面的基本目标。两个过程是数据结构课程在专业技能培养方面的基本目标。在系统地学习数据结构知识之前,先对一些基本概念和术语予以说明。在系统地学习数据结构知识之前,先对一些基本概念和术语予以说明。l数据结构的概念数据结构的概念数据结构的概念数据结构的概念1.1 1.1 数据结构的概念数据结构的概念l l 数据结构的概念数据结构的概念数据结构的概念数据结构的概念l l 数据结构数据结构数据结构数据结构l l 数据与数据元素数据与数据元素数据与数据元素数据与数据元素l l 绪论绪论绪论绪论数据数据是人们利用文字符号、数学符号以及其他规定的符号对现实世是人们利用文字符号、数学符号以及其他规定的符号对
9、现实世界的事物及其活动所做的抽象描述。简言之,数据是信息的载体,是对界的事物及其活动所做的抽象描述。简言之,数据是信息的载体,是对客观事物的符号化表示。从计算机的角度看,数据是计算机程序对所描客观事物的符号化表示。从计算机的角度看,数据是计算机程序对所描述客观事物进行加工处理的一种表示,凡是能够被计算机识别、存取和述客观事物进行加工处理的一种表示,凡是能够被计算机识别、存取和加工处理的符号、字符、图形、图像、声音、视频信号等都可以称为数加工处理的符号、字符、图形、图像、声音、视频信号等都可以称为数据。据。我们日常涉及的数据主要分为我们日常涉及的数据主要分为两类两类:一类是数值数据,包括整数、实
10、:一类是数值数据,包括整数、实数和复数等,它们主要用于工程和科学计算以及商业事务处理;另一类数和复数等,它们主要用于工程和科学计算以及商业事务处理;另一类是非数值数据,主要包括字符和字符串以及文字、图形、语音等,它们是非数值数据,主要包括字符和字符串以及文字、图形、语音等,它们多用于控制、管理和数据处理等领域。多用于控制、管理和数据处理等领域。数据元素数据元素是数据集合中的一个是数据集合中的一个“个体个体”,是数据的基本单位。在计算,是数据的基本单位。在计算机中,数据元素通常被作为一个整体来进行考虑和处理。在有些情况下,机中,数据元素通常被作为一个整体来进行考虑和处理。在有些情况下,数据元素也
11、称为元素、结点、顶点和记录等。一个数据元素可以由一个数据元素也称为元素、结点、顶点和记录等。一个数据元素可以由一个或多个数据项组成,数据项是具有独立含义的数据最小单位,有时也称或多个数据项组成,数据项是具有独立含义的数据最小单位,有时也称为字段或域。为字段或域。l l 数据与数据元素数据与数据元素数据与数据元素数据与数据元素l l 绪论绪论绪论绪论【例【例1.1】一个学生信息(数据)表如表一个学生信息(数据)表如表1.2所示,请指出表中的数所示,请指出表中的数据、数据元素及数据项,并由此得出三者之间的关系。据、数据元素及数据项,并由此得出三者之间的关系。表表1.2学生信息表学生信息表l l 数
12、据与数据元素数据与数据元素数据与数据元素数据与数据元素姓姓 名名性性 别别年年 龄龄专专 业业其其 他他刘小平男21计算机王 红女20数 学吕 军男20经 济.马文华女19管 理l l 绪论绪论绪论绪论表表1.1构成了全部学生信息的数据。表中的每一行即为记录一个学生信息构成了全部学生信息的数据。表中的每一行即为记录一个学生信息的数据元素,而该行中的每一项则为一个数据项。数据、数据元素和数的数据元素,而该行中的每一项则为一个数据项。数据、数据元素和数据项实际上反映了数据组织的三个层次,数据可以由若干个数据元素构据项实际上反映了数据组织的三个层次,数据可以由若干个数据元素构成,而数据元素则又可以由
13、若干数据项构成。成,而数据元素则又可以由若干数据项构成。l l 数据与数据元素数据与数据元素数据与数据元素数据与数据元素1.1 1.1 数据结构的概念数据结构的概念l l 数据结构的概念数据结构的概念数据结构的概念数据结构的概念l l 数据结构数据结构数据结构数据结构l l 数据与数据元素数据与数据元素数据与数据元素数据与数据元素l l 绪论绪论绪论绪论数据结构是指数据以及数据之间的相互关系,即数据的组织数据结构是指数据以及数据之间的相互关系,即数据的组织形式。它可以看作是相互之间存在着某种特定关系的数据元形式。它可以看作是相互之间存在着某种特定关系的数据元素集合。因此,可以把数据结构看成是带
14、结构的数据元素集素集合。因此,可以把数据结构看成是带结构的数据元素集合。数据结构包含以下三个方面的内容。合。数据结构包含以下三个方面的内容。(1)数据元素之间的逻辑关系,即数据的逻辑结构。)数据元素之间的逻辑关系,即数据的逻辑结构。(2)数据元素及其关系在计算机存储器中的存储方式,即数)数据元素及其关系在计算机存储器中的存储方式,即数据的存储结构(物理结构)。据的存储结构(物理结构)。(3)施加在数据上的操作,即数据的运算。)施加在数据上的操作,即数据的运算。l l 数据结构数据结构数据结构数据结构l l 绪论绪论绪论绪论数据的逻辑结构是从逻辑关系上(主要指相邻关系)来数据的逻辑结构是从逻辑关
15、系上(主要指相邻关系)来描述数据的,它与数据如何存储无关,是独立于计算机的。描述数据的,它与数据如何存储无关,是独立于计算机的。因此,数据的逻辑结构可以看成是从具体问题抽象出来的数因此,数据的逻辑结构可以看成是从具体问题抽象出来的数学模型。学模型。数据的存储结构是指数据的逻辑结构在计算机存储器中数据的存储结构是指数据的逻辑结构在计算机存储器中的映像表示,即在能够反映数据逻辑关系的前提下数据在存的映像表示,即在能够反映数据逻辑关系的前提下数据在存储器中的存储方式。储器中的存储方式。数据的运算是在数据上所施加的一系列操作,称为抽象数据的运算是在数据上所施加的一系列操作,称为抽象运算。它只考虑这些操
16、作的功能,而暂不考虑如何完成,只运算。它只考虑这些操作的功能,而暂不考虑如何完成,只有在确定了存储结构后,才会具体实现这些操作。也就是说,有在确定了存储结构后,才会具体实现这些操作。也就是说,抽象运算是定义在逻辑结构上的,而实现则是建立在存储结抽象运算是定义在逻辑结构上的,而实现则是建立在存储结构上的。最常用的运算有检索、插入、删除、更新、排序等。构上的。最常用的运算有检索、插入、删除、更新、排序等。l l 数据结构数据结构数据结构数据结构1.2 1.2 逻辑结构与存储结构逻辑结构与存储结构l l 逻辑结构逻辑结构逻辑结构逻辑结构l l 存储结构存储结构存储结构存储结构l l 绪论绪论绪论绪论
17、数据的逻辑结构是对数据元素之间逻辑关系的描述。根据数据元素之间数据的逻辑结构是对数据元素之间逻辑关系的描述。根据数据元素之间关系的不同特性,可以划分为以下四种基本逻辑结构。关系的不同特性,可以划分为以下四种基本逻辑结构。(1)集合结构:数据元素之间除了)集合结构:数据元素之间除了“属于同一集合属于同一集合”的联系之外,没有的联系之外,没有其他关系。其他关系。(2)线性结构:数据元素之间存在着)线性结构:数据元素之间存在着“一对一一对一”的关系。的关系。(3)树形结构:数据元素之间存在着)树形结构:数据元素之间存在着“一对多一对多”的关系。的关系。(4)图结构(或称网状结构):数据元素之间存在着
18、)图结构(或称网状结构):数据元素之间存在着“多对多多对多”的关系。的关系。l l 逻辑结构逻辑结构逻辑结构逻辑结构l l 绪论绪论绪论绪论由于集合结构的简单性和松散性,所以通常只讨论其他三种逻辑结由于集合结构的简单性和松散性,所以通常只讨论其他三种逻辑结构。构。数据的逻辑结构可以分为线性结构和非线性结构两类。若数据元素数据的逻辑结构可以分为线性结构和非线性结构两类。若数据元素之间的逻辑关系可以用一个线性序列简单地表示出来,则称为线性结构,之间的逻辑关系可以用一个线性序列简单地表示出来,则称为线性结构,否则称为非线性结构。否则称为非线性结构。树形结构和图结构就属于非线性结构。现实生活中的楼层编
19、号就属于树形结构和图结构就属于非线性结构。现实生活中的楼层编号就属于线性结构,而省、市、地区的划分则属于树形结构,城市交通图则属于线性结构,而省、市、地区的划分则属于树形结构,城市交通图则属于图结构。图结构。l l 逻辑结构逻辑结构逻辑结构逻辑结构l l 绪论绪论绪论绪论关于逻辑结构需要注意以下几点关于逻辑结构需要注意以下几点:(1)逻辑结构与数据元素本身的形式和内容无关。例如,给表)逻辑结构与数据元素本身的形式和内容无关。例如,给表1.1中的中的每个学生增加一个数据项每个学生增加一个数据项“学号学号”,就得到另一个数据,但由于所有的,就得到另一个数据,但由于所有的数据元素仍是数据元素仍是“一
20、个接一个排列一个接一个排列”,故新数据的逻辑结构与原来数据的,故新数据的逻辑结构与原来数据的逻辑结构相同,仍是一个线性结构。逻辑结构相同,仍是一个线性结构。(2)逻辑结构与数据元素的相对位置无关。例如,将表)逻辑结构与数据元素的相对位置无关。例如,将表1.1中的学生按中的学生按年龄由大到小的顺序重新排列就得到另一个表格,但这个新表格中的所年龄由大到小的顺序重新排列就得到另一个表格,但这个新表格中的所有数据元素有数据元素“一个接一个排列一个接一个排列”的性质并没有改变,其逻辑结构与原表的性质并没有改变,其逻辑结构与原表格相同,还是线性结构。格相同,还是线性结构。(3)逻辑结构与所含数据元素的个数
21、无关。例如,在表)逻辑结构与所含数据元素的个数无关。例如,在表1.1中增加或删中增加或删除若干学生信息(数据元素),所得到的表格仍为线性结构。除若干学生信息(数据元素),所得到的表格仍为线性结构。l l 逻辑结构逻辑结构逻辑结构逻辑结构1.2 1.2 逻辑结构与存储结构逻辑结构与存储结构l l 逻辑结构逻辑结构逻辑结构逻辑结构l l 存储结构存储结构存储结构存储结构l l 绪论绪论绪论绪论数据的存储结构是数据结构在计算机中的实现方法,包括数据结构数据的存储结构是数据结构在计算机中的实现方法,包括数据结构中数据元素的表示以及数据元素之间关系的表示。中数据元素的表示以及数据元素之间关系的表示。数据
22、元素及数据元素数据元素及数据元素之间的关系在计算机中可以有以下四种基本存储结构。之间的关系在计算机中可以有以下四种基本存储结构。(1)顺序存储结构:借助于数据元素在存储器中的相对位置来表示)顺序存储结构:借助于数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系。通常顺序存储结构是利用程序语言中的数组数据元素之间的逻辑关系。通常顺序存储结构是利用程序语言中的数组来描述。来描述。(2)链式存储结构:在数据元素上附加指针域,并借助指针来指示)链式存储结构:在数据元素上附加指针域,并借助指针来指示数据元素之间的逻辑关系。通常是利用程序语言中的指针类型来描述。数据元素之间的逻辑关系。通常是利用程序
23、语言中的指针类型来描述。(3)索引存储结构:在存储所有数据元素信息的同时建立附加索引)索引存储结构:在存储所有数据元素信息的同时建立附加索引表。索引表中表项的一般形式是:(关键字,地址);关键字是数据元表。索引表中表项的一般形式是:(关键字,地址);关键字是数据元素中某个数据项的值,它唯一标识该数据元素;地址则是指向该数据元素中某个数据项的值,它唯一标识该数据元素;地址则是指向该数据元素的指针。由关键字可以立即通过地址找到该数据元素。素的指针。由关键字可以立即通过地址找到该数据元素。(4)哈希(或散列)存储结构:此方法的基本思想是根据数据元素)哈希(或散列)存储结构:此方法的基本思想是根据数据
24、元素的关键字通过哈希(或散列)函数直接计算出该数据元素的存储地址。的关键字通过哈希(或散列)函数直接计算出该数据元素的存储地址。l l 存储结构存储结构存储结构存储结构l l 绪论绪论绪论绪论l l 存储结构存储结构存储结构存储结构顺序存储结构顺序存储结构的主要优点是节省存储空间,即分配给的主要优点是节省存储空间,即分配给数据的存储单元全部用于存放数据元素的数据信息,数据数据的存储单元全部用于存放数据元素的数据信息,数据元素之间的逻辑关系没有占用额外的存储空间。元素之间的逻辑关系没有占用额外的存储空间。采用这种存储结构可以实现对数据元素的随机存取,采用这种存储结构可以实现对数据元素的随机存取,
25、即每个数据元素对应有一个序号,并由该序号可以直接计即每个数据元素对应有一个序号,并由该序号可以直接计算出数据元素的存储地址(例如,对于数组算出数据元素的存储地址(例如,对于数组A其序号为数其序号为数组元素的下标,数组元素组元素的下标,数组元素Ai可以通过可以通过*(A+i)进行存取)。进行存取)。顺序存储结构的主要缺点是不便于修改,对数据元素顺序存储结构的主要缺点是不便于修改,对数据元素进行插入、删除运算时,可能要移动一系列的数据元素。进行插入、删除运算时,可能要移动一系列的数据元素。l l 绪论绪论绪论绪论l l 存储结构存储结构存储结构存储结构链式存储结构链式存储结构的主要优点是便于修改,
26、在进行插入、的主要优点是便于修改,在进行插入、删除运算时仅需修改相应数据元素的指针值,而不必移动删除运算时仅需修改相应数据元素的指针值,而不必移动数据元素。数据元素。与顺序存储结构相比,链式存储结构的主要缺点是存与顺序存储结构相比,链式存储结构的主要缺点是存储空间的利用率较低,因为除了用于数据元素的存储空间储空间的利用率较低,因为除了用于数据元素的存储空间外,还需要额外的存储空间来存储数据元素之间的逻辑关外,还需要额外的存储空间来存储数据元素之间的逻辑关系。此外,由于逻辑上相邻的数据元素在存储空间中不一系。此外,由于逻辑上相邻的数据元素在存储空间中不一定相邻,所以不能对数据元素进行随机存取。定
27、相邻,所以不能对数据元素进行随机存取。l l 绪论绪论绪论绪论l l 存储结构存储结构存储结构存储结构线性结构线性结构采用索引存储方法后就可以对结点进行随机采用索引存储方法后就可以对结点进行随机访问。在进行插入、删除运算时,只需改动存储在索引表访问。在进行插入、删除运算时,只需改动存储在索引表中数据元素的存储地址,而不必移动数据元素,所以仍保中数据元素的存储地址,而不必移动数据元素,所以仍保持较高的数据修改和运算效率。索引存储结构的缺点是增持较高的数据修改和运算效率。索引存储结构的缺点是增加了索引表,这也降低了存储空间的利用率。加了索引表,这也降低了存储空间的利用率。哈希(或散列)存储结构哈希
28、(或散列)存储结构的优点是查找速度快,只要的优点是查找速度快,只要给出待查数据元素的关键字,就可以立即计算出该数据元给出待查数据元素的关键字,就可以立即计算出该数据元素的存储地址。与前面三种存储方法不同的是,哈希存储素的存储地址。与前面三种存储方法不同的是,哈希存储结构只存储数据元素的数据而不存储数据元素之间的逻辑结构只存储数据元素的数据而不存储数据元素之间的逻辑关系。哈希存储结构一般只适合于对数据进行快速查找和关系。哈希存储结构一般只适合于对数据进行快速查找和插入的场合。插入的场合。l l 绪论绪论绪论绪论l l 存储结构存储结构存储结构存储结构表表1.2在顺序存储结构和链式存储结构下的示意
29、如图所示:在顺序存储结构和链式存储结构下的示意如图所示:1.3 1.3 算法与算法分析算法与算法分析l l 算法的定义和描述算法的定义和描述算法的定义和描述算法的定义和描述l l算法分析和复杂度计算算法分析和复杂度计算算法分析和复杂度计算算法分析和复杂度计算l l 绪论绪论绪论绪论l l 算法的定义和描述算法的定义和描述算法的定义和描述算法的定义和描述算法是建立在数据结构基础上对特定问题求解步骤的一种描述,算法是建立在数据结构基础上对特定问题求解步骤的一种描述,是若干条指令组成的有限序列,其中每一条指令表示一个或多个操是若干条指令组成的有限序列,其中每一条指令表示一个或多个操作。算法必须满足以
30、下性质。作。算法必须满足以下性质。(1)有穷性:一个算法必须在有穷步之后结束,即必须在有限)有穷性:一个算法必须在有穷步之后结束,即必须在有限时间内完成。时间内完成。(2)确定性:算法的每一步必须有确切的含义而没有二义性。)确定性:算法的每一步必须有确切的含义而没有二义性。对于相同的输入,算法执行的路径是唯一的。对于相同的输入,算法执行的路径是唯一的。(3)可行性:算法所描述的操作都可以通过可实现的基本运算)可行性:算法所描述的操作都可以通过可实现的基本运算在有限次执行后得以完成。在有限次执行后得以完成。(4)输入:一个算法可以有零个或多个输入。)输入:一个算法可以有零个或多个输入。(5)输出
31、:一个算法具有一个或多个输出,且输出与输入之间)输出:一个算法具有一个或多个输出,且输出与输入之间存在某种特定的关系。存在某种特定的关系。l l 绪论绪论绪论绪论l l 算法的定义和描述算法的定义和描述算法的定义和描述算法的定义和描述算法的含义与程序十分相似但又有区别。一个程序不一定满足算法的含义与程序十分相似但又有区别。一个程序不一定满足有穷性,如操作系统程序只要不停机执行就永不停止,因此,操作有穷性,如操作系统程序只要不停机执行就永不停止,因此,操作系统不是一个算法。此外,程序中的语句最终都要转化(编译)成系统不是一个算法。此外,程序中的语句最终都要转化(编译)成计算机可执行的指令;而算法
32、中的指令则无此限制,即一个算法可计算机可执行的指令;而算法中的指令则无此限制,即一个算法可采用自然语言如英语、汉语描述,也可以采用图形方式如流程图、采用自然语言如英语、汉语描述,也可以采用图形方式如流程图、拓扑图描述。算法给出了对一个问题的求解,而程序仅是算法在计拓扑图描述。算法给出了对一个问题的求解,而程序仅是算法在计算机上的实现。一个算法若用程序设计语言来描述,则此时算法也算机上的实现。一个算法若用程序设计语言来描述,则此时算法也就是一个程序。就是一个程序。对某个特定问题的求解究竟采用何种数据结构及选择什么算法,对某个特定问题的求解究竟采用何种数据结构及选择什么算法,需要看问题的具体要求和
33、现实环境的各种条件;数据结构的选择是需要看问题的具体要求和现实环境的各种条件;数据结构的选择是否恰当将直接影响到算法的效率,只有把数据结构与算法有机地结否恰当将直接影响到算法的效率,只有把数据结构与算法有机地结合起来才能设计出高质量的程序来。合起来才能设计出高质量的程序来。l l 绪论绪论绪论绪论l l 算法的定义和描述算法的定义和描述算法的定义和描述算法的定义和描述【例【例1.2】对两个正整数对两个正整数m和和n,给出求它们最大公因子的算法。,给出求它们最大公因子的算法。算法流程如图所示。算法流程如图所示。l l 绪论绪论绪论绪论l l 算法的定义和描述算法的定义和描述算法的定义和描述算法的
34、定义和描述解解:算法设计如下:算法设计如下:(1)求余数:以)求余数:以n除除m,余数为,余数为r且且0rn。(2)判断余数)判断余数r是否等于零:如果是否等于零:如果r为零,则输出为零,则输出n的当前值(即的当前值(即为最大公因子),算法结束;否则执行(为最大公因子),算法结束;否则执行(3)。)。(3)将)将n值传给值传给m,将,将r值传给值传给n,转(,转(1)。)。上述算法给出了三个计算步骤,而且每一步骤意义明确并切实上述算法给出了三个计算步骤,而且每一步骤意义明确并切实可行。虽然出现了循环,但可行。虽然出现了循环,但m和和n都是已给定的有限整数,并且每次都是已给定的有限整数,并且每次
35、m除以除以n后得到的余数后得到的余数r即使不为零也总有即使不为零也总有rmin(m,n),这就保证循,这就保证循环执行有限次后必然终止,即满足算法的所有特征,所以是一个正环执行有限次后必然终止,即满足算法的所有特征,所以是一个正确的算法。确的算法。1.3 1.3 算法与算法分析算法与算法分析l l 算法的定义和描述算法的定义和描述算法的定义和描述算法的定义和描述l l算法分析和复杂度计算算法分析和复杂度计算算法分析和复杂度计算算法分析和复杂度计算l l 绪论绪论绪论绪论l l 算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算算法设计主要是考虑可解算法的设计,而算
36、法分析则是研究和算法设计主要是考虑可解算法的设计,而算法分析则是研究和比较各种算法的性能与优劣。算法的时间复杂度和空间复杂度是算比较各种算法的性能与优劣。算法的时间复杂度和空间复杂度是算法分析的两个主要方面,其目的主要是考察算法的时间和空间效率,法分析的两个主要方面,其目的主要是考察算法的时间和空间效率,以求改进算法或对不同的算法进行比较。以求改进算法或对不同的算法进行比较。(1)时间复杂度:一个程序的时间复杂度是指程序运行从开始)时间复杂度:一个程序的时间复杂度是指程序运行从开始到结束所需要的时间。到结束所需要的时间。(2)空间复杂度:一个程序的空间复杂度是指程序运行从开始)空间复杂度:一个
37、程序的空间复杂度是指程序运行从开始到结束所需的存储量。到结束所需的存储量。在复杂度计算中,实际上是把求解问题的关键操作,如加法、减在复杂度计算中,实际上是把求解问题的关键操作,如加法、减法和比较运算指定为基本操作,然后把算法执行基本操作的次数作法和比较运算指定为基本操作,然后把算法执行基本操作的次数作为算法的时间复杂度,而把算法执行期间占用存储单元的数量作为为算法的时间复杂度,而把算法执行期间占用存储单元的数量作为算法的空间复杂度。算法的空间复杂度。l l 绪论绪论绪论绪论l l 算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算在此涉及频度的概念,即语句(指令)
38、的频度是指它在算法中被重在此涉及频度的概念,即语句(指令)的频度是指它在算法中被重复执行的次数。一个算法的时间耗费就是该算法中所有语句(指令)的复执行的次数。一个算法的时间耗费就是该算法中所有语句(指令)的频度之和(记作频度之和(记作T(n)),它是该算法所求解问题规模),它是该算法所求解问题规模n的某个函数的某个函数f(n)。当问题规模当问题规模n趋向无穷大时,趋向无穷大时,T(n)的数量级称为时间复杂度,记作:的数量级称为时间复杂度,记作:T(n)O(f(n)上述式子中上述式子中“O”的文字含义是的文字含义是T(n)的数量级,其严格的数学定义是的数量级,其严格的数学定义是:若:若T(n)和
39、和f(n)是定义在正整数集合上的两个函数,则存在正常数是定义在正整数集合上的两个函数,则存在正常数C和和n0,使得当,使得当nn0时都满足时都满足0T(n)Cf(n)例如,一个程序的实际执行时间为例如,一个程序的实际执行时间为T(n)=2.7n3+8.3n2+5.6,则,则T(n)=O(n3)。也即,当。也即,当n趋于无穷大时,趋于无穷大时,n3前的前的2.7可以忽略,即该程序可以忽略,即该程序的时间复杂度的数量级是的时间复杂度的数量级是n3。算法的时间复杂度采用这种数量级的形式表示后,将给分析算法的算法的时间复杂度采用这种数量级的形式表示后,将给分析算法的时间复杂度带来很大的方便,即对一个算
40、法,只需分析影响该算法时间时间复杂度带来很大的方便,即对一个算法,只需分析影响该算法时间复杂度的主要部分即可,而无需对该算法的每一个语句都进行详细的分复杂度的主要部分即可,而无需对该算法的每一个语句都进行详细的分析。析。l l 绪论绪论绪论绪论l l 算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算若一个算法中的两个部分的时间复杂度分别为若一个算法中的两个部分的时间复杂度分别为T1(n)=O(f(n)和和T2(n)=O(g(n),则,则(1)在)在“O”下的求和准则为下的求和准则为T1(n)+T2(n)O(max(f(n),g(n)。(2)在)在“O”下的乘法准
41、则为下的乘法准则为T1(n)T2(n)O(f(n)g(n)。当算法转换为程序后,每条语句执行一次所需的时间取决于机器的当算法转换为程序后,每条语句执行一次所需的时间取决于机器的指令性能、速度以及编译所生成的代码质量,这是难以确定的。因此,指令性能、速度以及编译所生成的代码质量,这是难以确定的。因此,我们假设每条语句执行一次所需的时间均是单位时间,则程序计算的时我们假设每条语句执行一次所需的时间均是单位时间,则程序计算的时间复杂度法则如下。间复杂度法则如下。(1)执行一条读写语句或赋值语句所用的时间为)执行一条读写语句或赋值语句所用的时间为O(1)。(2)依次执行一系列语句所用的时间采用求和准则
42、。)依次执行一系列语句所用的时间采用求和准则。(3)条件语句)条件语句if的耗时主要是当条件为真时执行语句体所用的时间,的耗时主要是当条件为真时执行语句体所用的时间,而检测条件是否为真还需耗费而检测条件是否为真还需耗费O(1)。(4)对)对while、dowhile和和for这样的循环语句,其运行时间为每这样的循环语句,其运行时间为每次执行循环体及检测是否继续循环的时间,故常用乘法准则。次执行循环体及检测是否继续循环的时间,故常用乘法准则。l l 绪论绪论绪论绪论l l 算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算【例【例1.3】试求下面程序段的时间复杂度。
43、试求下面程序段的时间复杂度。for(i=0;in;i+)for(j=0;jn;j+)Cij=0;for(k=0;kn;k+)Cij=Cij+Aik*Bkj;解:解:给程序中的语句进行编号,并在其右侧列出该语句的频度:给程序中的语句进行编号,并在其右侧列出该语句的频度:(1)for(i=0;in;i+)n+1(2)for(j=0;jn;j+)n(n+1)(3)Cij=0n2(4)for(k=0;kn;k+)n2(n+1)(5)Cij=Cij+Aik*Bkj;n3l l 绪论绪论绪论绪论l l 算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算算法分析与复杂度计算语句(语句(1)的)的i
44、值由值由0递增到递增到n,并且测试到,并且测试到i等于等于n时(即条件时(即条件“idatai均均 表表 示示 顺顺 序序 表表 中中 第第 i个个 元元 素素 的的 值值 , 而而List.len或或L-len均表示顺序表的表长,两种表示如图所示。均表示顺序表的表长,两种表示如图所示。l线性表的顺序存储线性表的顺序存储线性表的顺序存储线性表的顺序存储顺序表顺序表顺序表顺序表2.2 2.2 线性表的顺序存储结构及运算实现线性表的顺序存储结构及运算实现l 线性表的顺序存储线性表的顺序存储线性表的顺序存储线性表的顺序存储l 顺序表基本运算的实现顺序表基本运算的实现顺序表基本运算的实现顺序表基本运算
45、的实现l l 线性表线性表线性表线性表1.顺序表的初始化顺序表的初始化顺序表的初始化就是构造一个空表。将顺序表的初始化就是构造一个空表。将L设为指针变量,设为指针变量,然后动态分配顺序表的存储空间,并设表长然后动态分配顺序表的存储空间,并设表长len=0。算法如下:算法如下:SeqList*Init_SeqList()SeqList*L;L=(SeqList*)malloc(sizeof(SeqList);L-len=0;returnL;l顺序表算法实现顺序表算法实现顺序表算法实现顺序表算法实现l l 线性表线性表线性表线性表2.建立顺序表建立顺序表依次输入顺序表的长度依次输入顺序表的长度n和
46、和n个顺序表元素即可建立顺序个顺序表元素即可建立顺序表。算法如下:表。算法如下:voidCreatList(SeqList*L)inti,n;printf(InputlengthofList:);scanf(%d,&n);printf(InputelementsofList:n);for(i=1;idatai);(*L)-len=n;l顺序表算法实现顺序表算法实现顺序表算法实现顺序表算法实现l l 线性表线性表线性表线性表3.插入运算:插入运算:在表的第在表的第i个位置插入一个值为个位置插入一个值为x的新元素,使得原表长为的新元素,使得原表长为n的表变的表变为表长为为表长为n+1的表。插入的表
47、。插入x的过程如下:的过程如下:(1)按)按an到到ai的顺序依次将的顺序依次将anai后移一个元素位置,为插入的后移一个元素位置,为插入的x让出存储位置。让出存储位置。(2)将)将x放入空出的第放入空出的第i个位置。个位置。(3)修改表长)修改表长len的值(的值(len同时是指向最后一个元素的指针),同时是指向最后一个元素的指针),使其指向新的表尾元素。使其指向新的表尾元素。插入时可能出现下列非法情况:插入时可能出现下列非法情况:(1)当)当L-len=MAXSIZE-1,顺序表已放满元素。,顺序表已放满元素。(2)当)当i1或或iMAXSIZE时,时,i已超出数组范围。已超出数组范围。(
48、3)当)当L-len+1iMAXSIZE时,时,i虽没有超出数组范围,但虽没有超出数组范围,但i指指示的位置使得顺序表元素不再连续存放。示的位置使得顺序表元素不再连续存放。(2)、()、(3)可以用)可以用i1或或iL-len+1表示。表示。顺序表算法实现顺序表算法实现顺序表算法实现顺序表算法实现l l 线性表线性表线性表线性表插入算法如下:插入算法如下:voidInsert_SeqList(SeqList*L,inti,datatypex)intj;if(L-len=MAXSIZE-1)/表满表满printf(TheListisfull!n);elseif(iL-len+1) /插入位置非法
49、插入位置非法printf(Thepositionisinvalid!n);elsefor(j=L-len;j=i;j-) /将将anai顺序后移一个元素位置顺序后移一个元素位置L-dataj+1=L-dataj;L-datai=x;/插入插入x到第到第i个位置个位置L-len+; /表长增表长增1l顺序表算法实现顺序表算法实现顺序表算法实现顺序表算法实现l l 线性表线性表线性表线性表4.删除运算:删除运算:将顺序表中第将顺序表中第i个元素从表中除去,删除后使原表长为个元素从表中除去,删除后使原表长为n的顺序表成为表长为的顺序表成为表长为n-1的顺序表。删除的顺序表。删除ai的过程如下:的过程
50、如下:(1)按)按ai+1到到an的顺序依次将的顺序依次将ai+1an前移一个元素位前移一个元素位置,移动的同时即完成了对置,移动的同时即完成了对ai的删除。的删除。(2)修改)修改len值,使其仍指向表的最后一个元素。值,使其仍指向表的最后一个元素。删除时可能会出现下列非法情况:删除时可能会出现下列非法情况:(1)当)当L-len=0时,顺序表为空而无法删除。时,顺序表为空而无法删除。(2)当)当i1或或iL-Len时,时,i位置上没有元素,即删除位置上没有元素,即删除位置非法。位置非法。l顺序表算法实现顺序表算法实现顺序表算法实现顺序表算法实现l l 线性表线性表线性表线性表删除算法如下:
51、voidDelete_SeqList(SeqList*L,datatypei)intj;if(L-len=0)/表为空printf(TheListisempt!n);elseif(iL-len)/删除位置非法printf(Thepositionisinvalid!n);elsefor(j=i+1;jlen;j+)/将ai+1an顺序前移一个位置实现对ai的删除L-dataj-1=L-dataj;L-len-;/表长减1l顺序表算法实现顺序表算法实现顺序表算法实现顺序表算法实现l l 线性表线性表线性表线性表5.查找运算:查找运算:在顺序表中查找与给定值在顺序表中查找与给定值x相等的元素。完成该
52、运算最简单的方法相等的元素。完成该运算最简单的方法是:从第一个元素是:从第一个元素a1起依次和起依次和x比较,直至找到一个与比较,直至找到一个与x相等的元素相等的元素时则返回该元素的存储位置(即下标);如果查遍整个表都没找到时则返回该元素的存储位置(即下标);如果查遍整个表都没找到与与x相等的元素则返回相等的元素则返回0值。值。算法如下:算法如下:intLocation_SeqList(SeqList*L,datatypex)inti=1;/从第一个元素开始查找从第一个元素开始查找while(ilen&L-datai!=x)/顺序表未查完且当前元素不是要找的元素顺序表未查完且当前元素不是要找的
53、元素i+;if(L-datai=x)returni;/找到则返回其位置值找到则返回其位置值elsereturn0;/未找到则返回未找到则返回0值值l顺序表算法实现顺序表算法实现顺序表算法实现顺序表算法实现l l 线性表线性表线性表线性表查找算法的主要运算是比较。显然,比较的次数与查找算法的主要运算是比较。显然,比较的次数与x在在表中的位置有关,当表中的位置有关,当ai=x时,对算法需要比较时,对算法需要比较i次,在等次,在等概率的情况下,查找成功的平均比较次数为概率的情况下,查找成功的平均比较次数为因此,查找算法的时间复杂度为因此,查找算法的时间复杂度为O(n)。l顺序表算法实现顺序表算法实现
54、顺序表算法实现顺序表算法实现2.3 2.3 线性表的链式存储结构及运算实现线性表的链式存储结构及运算实现顺序表表示的线性表特点是用物理位置上的邻接关系来表示元顺序表表示的线性表特点是用物理位置上的邻接关系来表示元素之间的逻辑关系,使我们可以随机存取表中的任意一个元素,但素之间的逻辑关系,使我们可以随机存取表中的任意一个元素,但也产生了在插入和删除操作中移动大量元素的问题。也产生了在插入和删除操作中移动大量元素的问题。链式存储可用连续或不连续的存储单元来存储线性表中的元素,链式存储可用连续或不连续的存储单元来存储线性表中的元素,元素之间的逻辑关系无法用物理位置上的邻接关系来表示,因此,元素之间的
55、逻辑关系无法用物理位置上的邻接关系来表示,因此,需要用需要用“指针指针”来指示元素之间的逻辑关系,即通过来指示元素之间的逻辑关系,即通过“指针指针”链接链接起元素之间的邻接关系,而起元素之间的邻接关系,而“指针指针”要占用额外存储空间。链式存要占用额外存储空间。链式存储方式失去了顺序表可以随机存取元素的功能储方式失去了顺序表可以随机存取元素的功能,但却换来了存储空间但却换来了存储空间操作的方便性:进行插入和删除操作时无需移动大量的元素。操作的方便性:进行插入和删除操作时无需移动大量的元素。本节将从四个方面介绍线性表的链式存储结构及运算实现。本节将从四个方面介绍线性表的链式存储结构及运算实现。2
56、.3 2.3 线性表的链式存储结构及运算实现线性表的链式存储结构及运算实现l 单链表单链表单链表单链表l 单链表运算实现单链表运算实现单链表运算实现单链表运算实现l 循环链表循环链表循环链表循环链表l 单链表应用示例单链表应用示例单链表应用示例单链表应用示例l l 线性表线性表线性表线性表l单链表单链表单链表单链表在每个元素中除了含有数据信息外,还要有一个指针用来指向在每个元素中除了含有数据信息外,还要有一个指针用来指向它的直接后继元素,即通过指针建立起元素之间的线性关系,我它的直接后继元素,即通过指针建立起元素之间的线性关系,我们称这种元素为结点。结点中存放数据信息的部分称为数据域,们称这种
57、元素为结点。结点中存放数据信息的部分称为数据域,存放指向后继结点指针的部分称为指针域线性表中的存放指向后继结点指针的部分称为指针域线性表中的n个元素通过个元素通过各自结点的指针域各自结点的指针域“链链”在一起又被称为链表。每个结点中只有在一起又被称为链表。每个结点中只有一个指向后继结点的指针,故称其为单链表。链表是由一个个结一个指向后继结点的指针,故称其为单链表。链表是由一个个结点构成的,单链表结点的定义如下:点构成的,单链表结点的定义如下:typedefstructnodedatatypedata;/data为结点的数据信息为结点的数据信息structnode*next;/next为指向后继
58、结点的指针为指向后继结点的指针LNode;/单链表结点类型单链表结点类型结点结构如图结点结构如图l l 线性表线性表线性表线性表l单链表单链表单链表单链表线性表(线性表(a1,a2,a3,a4,a5,a6)对应的链式存储结构示意如下图)对应的链式存储结构示意如下图所示。将第一个结点的地址所示。将第一个结点的地址200放入到一个指针变量如放入到一个指针变量如H中,最后一中,最后一个结点由于没有后继,其指针域必须置空(个结点由于没有后继,其指针域必须置空(NULL)以表明链表到)以表明链表到此结束。通过指针此结束。通过指针H就可以由第一个结点的地址开始就可以由第一个结点的地址开始“顺藤摸瓜顺藤摸瓜
59、”地找到每一个结点地找到每一个结点。l l 线性表线性表线性表线性表l单链表单链表单链表单链表 线性表的链式存储结构具有以下特点:线性表的链式存储结构具有以下特点:(1)逻辑关系相邻的元素在物理位置上可以不)逻辑关系相邻的元素在物理位置上可以不 相邻。相邻。(2)表中的元素只能顺序访问而不能随机访问。)表中的元素只能顺序访问而不能随机访问。(3)表的大小可以动态变化。)表的大小可以动态变化。(4)插入、删除等操作只需修改指针(地址)而无需移动元素。)插入、删除等操作只需修改指针(地址)而无需移动元素。 单链表单链表关心的是结点之间的逻辑关系,而对每个结点的实际存储关心的是结点之间的逻辑关系,而
60、对每个结点的实际存储地址并不感兴趣,可以地址并不感兴趣,可以形象地画为下图所示的形式。形象地画为下图所示的形式。 通常用通常用“头指针头指针”来标识一个单链表,如单链表来标识一个单链表,如单链表L、单链表、单链表H等均等均是指单链表中的第一个结点的地址存放在指针变量是指单链表中的第一个结点的地址存放在指针变量L或或H中;当头指针中;当头指针为为“NULL”时则表示单链表为空。时则表示单链表为空。l l 线性表线性表线性表线性表单链表单链表单链表单链表 在线性表的链式存储中,为了便于插入和删除算法的实现且使单链在线性表的链式存储中,为了便于插入和删除算法的实现且使单链表的操作在各种情况下统一,在
61、单链表的第一个结点之前添加了一个表的操作在各种情况下统一,在单链表的第一个结点之前添加了一个头结点,该头结点不存储任何数据信息,只是用其指针域中的指针指头结点,该头结点不存储任何数据信息,只是用其指针域中的指针指向单链表的第一个数据结点,即通过头指针指向的头结点,可以访问向单链表的第一个数据结点,即通过头指针指向的头结点,可以访问到单链表中的所有数据结点。到单链表中的所有数据结点。 添加头结点后,无论单链表中的结点如何变化,比如插入新结点、添加头结点后,无论单链表中的结点如何变化,比如插入新结点、删除单链表中任意一个数据结点,头结点将始终不变,这使得单链表删除单链表中任意一个数据结点,头结点将
62、始终不变,这使得单链表的运算变得更加简单。的运算变得更加简单。2.3 2.3 线性表的链式存储结构及运算实现线性表的链式存储结构及运算实现l 单链表单链表单链表单链表l 单链表运算实现单链表运算实现单链表运算实现单链表运算实现l 循环链表循环链表循环链表循环链表l 单链表应用示例单链表应用示例单链表应用示例单链表应用示例l l 线性表线性表线性表线性表l单链表运算实现单链表运算实现单链表运算实现单链表运算实现1.建立单链表建立单链表1)在链表头部插入结点的方式建立单链表)在链表头部插入结点的方式建立单链表单单链链表表的的建建立立是是从从空空表表开开始始的的,每每读读入入一一个个数数据据则则申申
63、请请一一个个结结点点,然然后后插插在在头头结结点点之之后后,存存储储线线性性表表(A,B,C,D)的的单单链链表表建建立立过过程程如如下下图图所所示示。因因为为是是在在单单链链表表头头部部插插入入,故故读读入入数数据据的的顺序与线性表中元素的顺序正好相反。顺序与线性表中元素的顺序正好相反。l l 线性表线性表线性表线性表l单链表运算实现单链表运算实现单链表运算实现单链表运算实现算法实现如下:算法实现如下:voidCreateLinkList(LNode*head)/将主调函数中指向待生成单链表的指针地址(如将主调函数中指向待生成单链表的指针地址(如&p)传给)传给*headcharx;LNod
64、e*p;*head=(LNode*)malloc(sizeof(LNode);/在主调函数空间生成链表头结在主调函数空间生成链表头结点点(*head)-next=NULL;/*head为链表头指针为链表头指针printf(Inputanycharstring:n);scanf(%c,&x);/结点的数据域为结点的数据域为char型,读入结点数据型,读入结点数据while(x!=n)/生成链表的其他结点生成链表的其他结点p=(LNode*)malloc(sizeof(LNode);/申请一个结点空间申请一个结点空间p-data=x;p-next=(*head)-next;/将头结点的将头结点的n
65、ext值赋给新结点值赋给新结点*p的的next(*head)-next=p;/头结点的头结点的next指针指向新结点指针指向新结点*p实现在表头插入实现在表头插入scanf(%c,&x);/继续生成下一个新结点继续生成下一个新结点l l 线性表线性表线性表线性表l单链表运算实现单链表运算实现单链表运算实现单链表运算实现2)在链表的尾部插入结点的方式建立单链表)在链表的尾部插入结点的方式建立单链表在头部插入结点的方式生成单链表较为简单,但生成结点的顺序与在头部插入结点的方式生成单链表较为简单,但生成结点的顺序与线性表中的元素顺序正好相反。若希望两者的次序一致,则可采用线性表中的元素顺序正好相反。
66、若希望两者的次序一致,则可采用尾插法来生成单链表。由于每次都是将新结点插入链表的尾部,所尾插法来生成单链表。由于每次都是将新结点插入链表的尾部,所以必须再增加一个指针以必须再增加一个指针q来始终指向单链表的尾结点,以方便新结点来始终指向单链表的尾结点,以方便新结点的插入。在链尾插入结点生成单链表的过程示意如下图所示。的插入。在链尾插入结点生成单链表的过程示意如下图所示。l l 线性表线性表线性表线性表l单链表运算实现单链表运算实现单链表运算实现单链表运算实现算法如下:算法如下:LNode*CreateLinkList()LNode*head,*p,*q;charx;head=(LNode*)m
67、alloc(sizeof(LNode); /生成头结点生成头结点head-next=NULL;p=head;q=p;/指针指针q始终指向链始终指向链尾结点尾结点printf(Inputanycharstring:n);scanf(%c,&x);while(x!=n)/生成链表的其他结点生成链表的其他结点p=(LNode*)malloc(sizeof(LNode);p-data=x;p-next=NULL;q-next=p;/在链尾插入在链尾插入q=p;scanf(%c,&x);returnhead;/返回单链表表头指针返回单链表表头指针l l 线性表线性表线性表线性表l单链表运算实现单链表运算
68、实现单链表运算实现单链表运算实现2.求表长求表长算法如下:算法如下:intLength_LinkList(LNode*head)LNode*p=head;/p指向单链表头结点指向单链表头结点inti=0; /i为结点计数器为结点计数器while(p-next!=NULL)p=p-next;i+;returni; /返回表长值返回表长值i求表长算法的时间复杂度为求表长算法的时间复杂度为O(n)l l 线性表线性表线性表线性表l单链表运算实现单链表运算实现单链表运算实现单链表运算实现3.查找查找1)按序号查找)按序号查找从链表的第一个结点开始查找,若当前结点是第从链表的第一个结点开始查找,若当前结
69、点是第i个结点,则返回个结点,则返回指向该结点的指针值,否则继续向后查找;如果整个表都无序号为指向该结点的指针值,否则继续向后查找;如果整个表都无序号为i的结点(的结点(i大于链表中结的个数),则返回空指针值。大于链表中结的个数),则返回空指针值。算法如下:算法如下:LNode*Get_LinkList(LNode*head,inti)/在单链表在单链表head中查找第中查找第i个结点个结点LNode*p=head; /由第一个结点开始查找由第一个结点开始查找intj=0;while(p!=NULL&jnext;j+;returnp;/找到则返回指向找到则返回指向i结点的指针值,找不到则结点的
70、指针值,找不到则p返回空值返回空值l l 线性表线性表线性表线性表l单链表运算实现单链表运算实现单链表运算实现单链表运算实现2)按值查找)按值查找从链表的第一个数据结点开始查找,若当前结点值等于从链表的第一个数据结点开始查找,若当前结点值等于x则返回指则返回指向该结点的指针值,否则继续向后查找;如果整个表都找不到值等于向该结点的指针值,否则继续向后查找;如果整个表都找不到值等于x的的结点则返回空值。结点则返回空值。算法如下:算法如下:LNode*Locate_LinkList(LNode*head,charx)/在单链表中查找结点值为在单链表中查找结点值为x的结点的结点LNode*p=head
71、-next;/由第一个数据结点开始查找由第一个数据结点开始查找while(p!=NULL&p-data!=x)/当未查到链尾且当前结点不等于当未查到链尾且当前结点不等于x时继续查找时继续查找p=p-next;returnp;/找到则返回指向值为找到则返回指向值为x的结点的指针值,找不到则的结点的指针值,找不到则p返回空值返回空值查找算法的时间复杂度均为查找算法的时间复杂度均为O(n)。l l 线性表线性表线性表线性表l单链表运算实现单链表运算实现单链表运算实现单链表运算实现4.插入插入链表中的各结点是通过指针链接起来的,因而可以通过改变链表结链表中的各结点是通过指针链接起来的,因而可以通过改变
72、链表结点中指针的指向来实现链表结点的插入与删除。数组进行插入或删除点中指针的指向来实现链表结点的插入与删除。数组进行插入或删除操作时需要移动大量的数组元素,但是链表的插入或删除操作由于仅操作时需要移动大量的数组元素,但是链表的插入或删除操作由于仅需修改有关指针的指向而变得非常容易。需修改有关指针的指向而变得非常容易。在链表结点在链表结点*p之后插入链表结点之后插入链表结点*q的示意如图所示。插入操作如下:的示意如图所示。插入操作如下:q-next=p-next;p-next=q;l l 线性表线性表线性表线性表l单链表运算实现单链表运算实现单链表运算实现单链表运算实现在涉及改变指针值的操作中一
73、定要注意指针值的改变次序,否则容易出错。在涉及改变指针值的操作中一定要注意指针值的改变次序,否则容易出错。假如上面插入操作的顺序改为假如上面插入操作的顺序改为p-next=q;q-next=p-next;此时,此时,将使链表结点将使链表结点*p的指针的指针p-next指向链表结点指向链表结点*q,将将*p的指针的指针p-next值(指向值(指向*q)赋给了结点)赋给了结点*q的指针的指针q-next,这使得结点,这使得结点*q的指针的指针q-next指向结点指向结点*q自身;这种结果将导致链表由此断为两截,而后面的一截自身;这种结果将导致链表由此断为两截,而后面的一截链表就链表就“丢失丢失”了
74、。因此,在插入链表结点了。因此,在插入链表结点*q时,应将链表结点时,应将链表结点*p的指针的指针p-next值(指向后继结点)先赋给结点值(指向后继结点)先赋给结点*q的指针的指针q-next(即语句(即语句“q-next=p-next;”),以防止链表的断开,然后再使结点),以防止链表的断开,然后再使结点*p的指针的指针p-next改为指向结点改为指向结点*q(即语句(即语句“p-next=q;”)。)。l l 线性表线性表线性表线性表l单链表运算实现单链表运算实现单链表运算实现单链表运算实现算法如下:算法如下:voidInsert_LinkList(LNode*head,inti,cha
75、rx)/在单链表在单链表head的第的第i个位置上插入值为个位置上插入值为x的元素的元素LNode*p,*q;p=Get_LinkList(head,i-1);/查找第查找第i-1个结点个结点*/if(p=NULL)printf(Error!n);/第第i-1个位置不存在而无法插入个位置不存在而无法插入elseq=(LNode*)malloc(sizeof(LNode);/申请结点空间申请结点空间q-data=x;q-next=p-next;/完成插入操作完成插入操作p-next=q;/完成插入操作完成插入操作该算法的时间花费在寻找第该算法的时间花费在寻找第i-1个结点上,故算法时间复杂度为个
76、结点上,故算法时间复杂度为O(n)。l l 线性表线性表线性表线性表l单链表的运算实现单链表的运算实现单链表的运算实现单链表的运算实现5.删除删除要删除一个链表结点必须知道它的前驱链表结点,只有使指针变量要删除一个链表结点必须知道它的前驱链表结点,只有使指针变量p指向这指向这个前驱链表结点时,才可以通过下面的语句实现所要删除的操作:个前驱链表结点时,才可以通过下面的语句实现所要删除的操作:p-next=p-next-next;即通过改变链表结点即通过改变链表结点*p中指针中指针p-nxet的指向,使它由指向待删结的指向,使它由指向待删结点改为指向待删结点的后继结点,由此达到从链表中删去待删结点
77、的目的,如图点改为指向待删结点的后继结点,由此达到从链表中删去待删结点的目的,如图所示,其中所示,其中为为p-next=p-next-next。多数情况下,在删除待删结点前都要先找到这个待删结点的前驱结点,多数情况下,在删除待删结点前都要先找到这个待删结点的前驱结点,这就需要借助一个指针变量(如这就需要借助一个指针变量(如p)来定位于这个前驱结点,然后才能进)来定位于这个前驱结点,然后才能进行删除操作,如图所示。行删除操作,如图所示。l l 线性表线性表线性表线性表l单链表的运算实现单链表的运算实现单链表的运算实现单链表的运算实现算法如下:算法如下:voidDel_LinkList(LNode
78、*head,inti)/删除单链表删除单链表head上的第上的第i个数据结点个数据结点LNode*p,*q;p=Get_LinkList(head,i-1);/查找第查找第i-1个结点个结点if(p=NULL)printf(第第i-1个结点不存在个结点不存在!n);/待删结点的前一个结点不存在,无待删结点待删结点的前一个结点不存在,无待删结点elseif(p-next=NULL)printf(第第i个结点不存在个结点不存在!n);/待删结点不存在待删结点不存在elseq=p-next;/q指向第指向第i个结点个结点p-next=q-next;/从链表中删除第从链表中删除第i个结点个结点free
79、(q);/系统回收第系统回收第i个结点的存储空间个结点的存储空间删除算法的时间复杂度为删除算法的时间复杂度为O(n)。2.3 2.3 线性表的链式存储结构及运算实现线性表的链式存储结构及运算实现l 单链表单链表单链表单链表l 单链表运算实现单链表运算实现单链表运算实现单链表运算实现l 循环链表循环链表循环链表循环链表l 单链表应用示例单链表应用示例单链表应用示例单链表应用示例l l 线性表线性表线性表线性表l循环链表循环链表循环链表循环链表循环链表,将单链表中最后一个结点的指针值由空改为指向单链表循环链表,将单链表中最后一个结点的指针值由空改为指向单链表的头结点,整个链表形成一个环。这样,从链
80、表中的任一结点位置出发都的头结点,整个链表形成一个环。这样,从链表中的任一结点位置出发都可以找到链表的其他结点。在循环链表上的操作基本上与单链表相同,只可以找到链表的其他结点。在循环链表上的操作基本上与单链表相同,只是将原来判断指针是否为是将原来判断指针是否为NULL改为判断是否为头指针,再无其他变化。改为判断是否为头指针,再无其他变化。带头结点的循环链表示意图为:带头结点的循环链表示意图为:l l 线性表线性表线性表线性表l循环链表循环链表循环链表循环链表在带头结点的循环链表中查找值等于在带头结点的循环链表中查找值等于x的结点,其实现算法如下:的结点,其实现算法如下:LNode*Locate
81、_CycLink(LNode*head,datatypex)LNode*p=head-next;/由第一个数据结点开始查由第一个数据结点开始查while(p!=head&p-data!=x)/未查完循环链表且当前结点不等于未查完循环链表且当前结点不等于x时继续查找时继续查找p=p-next;if(p!=head)returnp;/找到值等于找到值等于x的结点的结点*p,返回其指针值,返回其指针值pelsereturnNULL;/当当p又查到头结点时则无等于又查到头结点时则无等于x值的结点,故返回值的结点,故返回NULL值值由于链表的操作通常是在表头或表尾进行,故也可改变循环链表的标识方由于链表
82、的操作通常是在表头或表尾进行,故也可改变循环链表的标识方法,即不用头指针而用一个指向尾结点的指针法,即不用头指针而用一个指向尾结点的指针R来标识循环链表。这种标识的好来标识循环链表。这种标识的好处是可以直接找到链尾结点,而找到头结点也非常容易,处是可以直接找到链尾结点,而找到头结点也非常容易,R-next即为指向头结即为指向头结点的指针点的指针。2.3 2.3 线性表的链式存储结构及运算实现线性表的链式存储结构及运算实现l 单链表单链表单链表单链表l 单链表运算实现单链表运算实现单链表运算实现单链表运算实现l 循环链表循环链表循环链表循环链表l 单链表应用示例单链表应用示例单链表应用示例单链表
83、应用示例l l 线性表线性表线性表线性表l单链表应用示例单链表应用示例单链表应用示例单链表应用示例例例1.已知单链表已知单链表H如图所示,写一个算法将其逆置。如图所示,写一个算法将其逆置。解:由于头插法生成的单链表其结点序列正好与输入数据的顺序相反,解:由于头插法生成的单链表其结点序列正好与输入数据的顺序相反,因此,应依次取出题设链表中的每一个数据结点,然后用头插法再插入因此,应依次取出题设链表中的每一个数据结点,然后用头插法再插入新链表中即可实现单链表的逆置。在算法中,使指针新链表中即可实现单链表的逆置。在算法中,使指针p始终指向由剩余始终指向由剩余结点构成的链表中的第一个数据结点,而指针结
84、点构成的链表中的第一个数据结点,而指针q则从这剩余结点链表中则从这剩余结点链表中取出第一个数据结点插入头结点取出第一个数据结点插入头结点*H之后;当然,还应使指针之后;当然,还应使指针p继续指向继续指向剩余结点链表中的第一个数据结点,即移到刚取出的结点之后的下一个剩余结点链表中的第一个数据结点,即移到刚取出的结点之后的下一个数据结点位置。算法实现如下:数据结点位置。算法实现如下:voidConvert(LNode*H)LNode*p,*q;p=H-next;/p指向剩余结点链表的第一个数据结点指向剩余结点链表的第一个数据结点H-next=NULL;/新链表新链表H初始为空初始为空l l 线性表
85、线性表线性表线性表l单链表应用示例单链表应用示例单链表应用示例单链表应用示例while(p!=NULL)q=p;/从剩余结点链表中取出第一个结点从剩余结点链表中取出第一个结点p=p-next;/p继续指向剩余结点链表新的第一个数据结点继续指向剩余结点链表新的第一个数据结点q-next=H-next;/将取出的结点将取出的结点*q插入新链表插入新链表H的链首的链首H-next=q;该算法只对链表顺序扫描一遍即实现链表的逆置,故其时间复杂度为该算法只对链表顺序扫描一遍即实现链表的逆置,故其时间复杂度为O(n)。l l 线性表线性表线性表线性表l单链表应用示例单链表应用示例单链表应用示例单链表应用示
86、例例例2.对两个元素递增有序的单链表对两个元素递增有序的单链表A和和B,编写算法将,编写算法将A、B合并成一个合并成一个按元素递减有序(允许有相同值)的单链表按元素递减有序(允许有相同值)的单链表C,要求算法使用,要求算法使用A、B中的中的原有结点,不允许增加新结点。原有结点,不允许增加新结点。解:由例解:由例1可知,将递增有序改为递减有序只能采用头插法,如果仍保持可知,将递增有序改为递减有序只能采用头插法,如果仍保持递增有序则应采用尾插法,因此本题采用头插法实现。算法如下:递增有序则应采用尾插法,因此本题采用头插法实现。算法如下:voidMerge(LNode*A,LNode*B,LNode
87、*C) /将增序链表将增序链表A、B合并成降序链表合并成降序链表*CLNode*p,*q,*s;p=A-next;/p始终指向链表始终指向链表A的第一个未比较的数据结点的第一个未比较的数据结点q=B-next;/q始终指向链表始终指向链表B的第一个未比较的数据结点的第一个未比较的数据结点*C=A;/生成链表的生成链表的*C的头结点的头结点(*C)-next=NULL;free(B);/回收链表回收链表B的头结点空间的头结点空间while(p!=NULL&q!=NULL)/将将A、B两链表中当前比较结点中值小者赋给两链表中当前比较结点中值小者赋给*sl l 线性表线性表线性表线性表l单链表应用示
88、例单链表应用示例单链表应用示例单链表应用示例if(p-datadata)s=p;p=p-next;elses=q;q=q-next;s-next=(*C)-next;/用头插法将结点用头插法将结点*s插到链表插到链表*C的头结点之后的头结点之后(*C)-next=s;if(p=NULL)/如果指向链表如果指向链表A的指针的指针*p为空,则使为空,则使*p指向链表指向链表Bp=q;while(p!=NULL)/将将*p所指链表中的剩余结点依次摘下插入链表所指链表中的剩余结点依次摘下插入链表*C的链首的链首s=p;p=p-next;s-next=(*C)-next;(*C)-next=s;对对m个
89、结点的单链表个结点的单链表A和和n个结点的单链表个结点的单链表B,该算法的时间复杂度为,该算法的时间复杂度为O(m+n)。l l 线性表线性表线性表线性表l单链表应用示例单链表应用示例单链表应用示例单链表应用示例例例3.约瑟夫(约瑟夫(Josephus)问题:设有)问题:设有n个人围成一圈并顺序编号为个人围成一圈并顺序编号为1n。由编号为由编号为k的人进行的人进行1到到m的报数,数到的报数,数到m的人出圈;接着再从他的下一个人的人出圈;接着再从他的下一个人重新开始重新开始1到到m的报数,直到所有的人都出圈为止,请输出出圈人的出圈次序。的报数,直到所有的人都出圈为止,请输出出圈人的出圈次序。解解
90、:为了便于循环查找的统一性,我们采用不带头结点的循环链表,即每一:为了便于循环查找的统一性,我们采用不带头结点的循环链表,即每一个人对应链表中的一个结点,某人出圈相当于从链表中删去此人所对应的结个人对应链表中的一个结点,某人出圈相当于从链表中删去此人所对应的结点。整个算法可分为以下两个部分:点。整个算法可分为以下两个部分:(1)建立一个具有)建立一个具有n个结点且无头结点的循环链表。个结点且无头结点的循环链表。(2)不断从表中删除出圈人结点,直到链表中只剩下一个结点时为止。)不断从表中删除出圈人结点,直到链表中只剩下一个结点时为止。算法如下:算法如下:voidJosephus(intn,int
91、m,intk)LNode*p,*q;inti;p=(LNode*)malloc(sizeof(LNode);q=p;l l 线性表线性表线性表线性表l单链表应用示例单链表应用示例单链表应用示例单链表应用示例for(i=1;idata=k;k=k%n+1;q-next=(LNode*)malloc(sizeof(LNode);q=q-next;q-data=k;q-next=p;/链接成循环单链表,此时链接成循环单链表,此时p指向编号为指向编号为k的结点的结点while(p-next!=p)/当循环单链表中的结点个数不为当循环单链表中的结点个数不为1时时for(i=1;inext;/p指向报数为
92、指向报数为m的结点,的结点,q指向报数为指向报数为m-1的结点的结点q-next=p-next;/删除报数为删除报数为m的结点的结点printf(%4d,p-data);/输出出圈人的编号输出出圈人的编号free(p); /释放被删结点的空间释放被删结点的空间p=q-next;/p指向新的开始报数结点指向新的开始报数结点printf(%4d,p-data);/输出最后出圈人的编号输出最后出圈人的编号01:30:32第第3 3章章栈和队列栈和队列01:30:35 第第3章章栈和队列栈和队列栈和队列都是操作受限的线性表栈和队列都是操作受限的线性表栈:先进后出栈:先进后出队列:先进先出队列:先进先出
93、01:30:35本章主要内容本章主要内容: :栈的定义及基本运算栈的定义及基本运算栈的存储结构和运算实现栈的存储结构和运算实现队列的定义及基本运算队列的定义及基本运算队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:353.1 栈的定义及基本运算栈的定义及基本运算l l栈的定义栈的定义栈的定义栈的定义l l栈的基本操作栈的基本操作栈的基本操作栈的基本操作01:30:35l l 栈的定义栈的定义栈的定义栈的定义栈是限定仅在一端进行操作的线性表栈是限定仅在一端进行操作的线性表l栈顶(top):允许进行插入和删除元素操作的一端l栈底(bottom):固定不变的另一
94、端l空栈:不含元素的栈l满栈:存储空间被用完的栈先进后出先进后出01:30:353.1 栈的定义及基本运算栈的定义及基本运算l l栈的定义栈的定义栈的定义栈的定义l l栈的基本操作栈的基本操作栈的基本操作栈的基本操作01:30:36l l 栈的基本操作栈的基本操作栈的基本操作栈的基本操作l栈初始化栈初始化Init_Stack(s):生成一个空栈sl判栈空判栈空Empty_Stack(s):若栈s为空则返回1,否则返回0l入栈入栈Push_Stack(s,x):在栈s的顶部插入一个新元素x,使x成为新的栈顶元素,栈变化l出栈出栈Pop_Stack(s,x):在栈s非空的情况下,操作结果是将栈s的
95、顶部元素从栈中删除,并由x返回栈顶元素值,即栈中少了一个元素,栈变化l读栈顶元素读栈顶元素Top_Stack(s,x):在栈s非空的情况下,操作结果是将栈s的顶部元素读到x中,栈不变化01:30:36本章主要内容本章主要内容: :l栈的定义及基本运算栈的定义及基本运算l栈的存储结构和运算实现栈的存储结构和运算实现l队列的定义及基本运算队列的定义及基本运算l队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:363.2栈的存储结构和运算实现栈的存储结构和运算实现l l顺序栈顺序栈顺序栈顺序栈l l 两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空
96、间两个顺序栈共享连续空间l l 链栈链栈链栈链栈01:30:36l l 顺序栈顺序栈顺序栈顺序栈顺序栈:栈的顺序存储结构顺序栈:栈的顺序存储结构利用一组地址连续的存储单元来依次存放由栈底到栈顶的所有元素,附加一个top指针来指示栈顶元素在顺序栈中的位置typedefstructdatatypedataMAXSIZE;/栈中元素存储空间inttop;/栈顶指针SeqStack;顺序栈的类型定义顺序栈的类型定义01:30:36l l 顺序栈顺序栈顺序栈顺序栈顺序栈操作示意图顺序栈操作示意图01:30:37l l 顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:初始化栈顺序栈基本操作:初始化栈voidIni
97、t_SeqStack(SeqStack*s)*s=(SeqStack*)malloc(sizeof(SeqStack);/在主调函数中申请栈空间(*s)-top=-1;/置栈空标志01:30:37l l 顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:判断栈是否为空顺序栈基本操作:判断栈是否为空intEmpty_SeqStack(SeqStack*s)if(s-top=-1)/栈为空时返回1值return1;elsereturn0; /栈不空时返回0值01:30:37 顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:入栈顺序栈基本操作:入栈voidPush_SeqStack(SeqStack*s,dataty
98、pex)if(s-top=MAXSIZE-1)printf(Stackisfull!n);/栈已满elses-top+;/先使栈顶指针top增1s-datas-top=x;/再将元素x压入栈*s中01:30:37l l 顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:出栈顺序栈基本操作:出栈voidPop_SeqStack(SeqStack*s,datatype*x)/将栈*s中的栈顶元素出栈并通过参数x返回给主调函数if(s-top=-1)printf(Stackisempty!n);/栈为空else*x=s-datas-top;/栈顶元素出栈s-top-;/栈顶指针top减101:30:38l l
99、 顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:取栈顶元素顺序栈基本操作:取栈顶元素voidTop_SeqStack(SeqStack*s,datatype*x)if(s-top=-1)printf(Stackisempty!n);/栈为空else*x=s-datas-top;/取栈顶元素值赋给*x01:30:383.2栈的存储结构和运算实现栈的存储结构和运算实现l l顺序栈顺序栈顺序栈顺序栈l l 两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间l l 链栈链栈链栈链栈01:30:38l l两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间两
100、个顺序栈共享连续空间利用栈底位置相对不变这一特点,两个顺序栈利用栈底位置相对不变这一特点,两个顺序栈可以共享一个一维数据空间来互补余缺。可以共享一个一维数据空间来互补余缺。实现方法是将两个栈的栈底分设在一维数据空实现方法是将两个栈的栈底分设在一维数据空间的两端,让其各自的栈顶由两端向中间延伸间的两端,让其各自的栈顶由两端向中间延伸01:30:39l l两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间多个栈共享一维数据空间的问题就比较复杂,多个栈共享一维数据空间的问题就比较复杂,因为一个存储空间只有两端是固定的,需要:因为一个存储空间只有两端是固定的,需要
101、:设置设置栈顶指针栈顶指针和和栈底指针栈底指针。这种情况下,当某个栈发生上溢时,如果整个这种情况下,当某个栈发生上溢时,如果整个一维数据空间未被占满,则必须移动某些(或一维数据空间未被占满,则必须移动某些(或某个)栈来腾出空间解决所发生的上溢某个)栈来腾出空间解决所发生的上溢01:30:393.2栈的存储结构和运算实现栈的存储结构和运算实现l l顺序栈顺序栈顺序栈顺序栈l l 两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间 链栈链栈链栈链栈01:30:39l l链栈链栈链栈链栈链栈是指以链式存储结构存储的栈链栈是指以链式存储结构存储的栈链栈是动态分配元
102、素存储空间的,所以操作时无需考虑顺序栈容易出现的链栈是动态分配元素存储空间的,所以操作时无需考虑顺序栈容易出现的上溢问题,这样,多个栈的共享问题也就迎刃而解了上溢问题,这样,多个栈的共享问题也就迎刃而解了typedefstructnodedatatypedata;structnode*next;StackNode;链栈的定义:链栈的定义:01:30:39l l链栈链栈链栈链栈链栈的基本操作:初始化链栈链栈的基本操作:初始化链栈voidInit_LinkStack(StackNode*s)*s=NULL;/置栈顶指针*s为空01:30:39l l链栈链栈链栈链栈链栈的基本操作:判断链栈是否为空链
103、栈的基本操作:判断链栈是否为空intEmpty_LinkStack(StackNode*s)if(s=NULL)return1;/栈为空时返回1值elsereturn0;/栈不空时返回0值01:30:39l l链栈链栈链栈链栈链栈的基本操作:入栈链栈的基本操作:入栈voidPush_LinkStack(StackNode*top,datatypex)StackNode*p;p=(StackNode*)malloc(sizeof(StackNode);/申请一个结点空间p-data=x;/读入结点数据p-next=*top;/该结点作为栈顶元素链入链栈*top=p;/栈顶指针指向这个新栈顶元素0
104、1:30:39l l链栈链栈链栈链栈链栈的基本操作:出栈链栈的基本操作:出栈voidPop_LinkStack(StackNode*top,datatype*x)StackNode*p;if(*top=NULL)/栈顶指针为空时printf(Stackisempty!n);else /栈顶指针为空时*x=(*top)-data;/栈顶元素的数据赋给*xp=*top;/指针p指向栈顶元素*top=(*top)-next;/栈顶指针指向栈顶元素出栈后的新栈顶free(p);/回收已出栈的原栈顶元素空间01:30:40本章主要内容本章主要内容: :l栈的定义及基本运算栈的定义及基本运算l栈的存储结构
105、和运算实现栈的存储结构和运算实现l队列的定义及基本运算队列的定义及基本运算l队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:403.3队列的定义及基本运算队列的定义及基本运算l l队列的定义队列的定义队列的定义队列的定义l l 队列的基本操作队列的基本操作队列的基本操作队列的基本操作01:30:40l l 队列的定义队列的定义队列的定义队列的定义栈是只能在一端插入,在另一端删除的线性表栈是只能在一端插入,在另一端删除的线性表l队头(front):只能删除的一端l队尾(rear):只能插入的一端l空队:不含元素的队列l满队:存储空间被用完的队列先先进进先先出
106、出01:30:403.3队列的定义及基本运算队列的定义及基本运算l l队列的定义队列的定义队列的定义队列的定义l l 队列的基本操作队列的基本操作队列的基本操作队列的基本操作01:30:40l l 队列的基本操作队列的基本操作队列的基本操作队列的基本操作l队列初始化Init_Queue(&q):生成一个空队列ql判队空操作Empty_Queue(q):当队q存在时,若q为空队则返回1值,否则返回0值l入队操作In_Queue(q,x):当队q存在时,将元素x插到队尾,队列变化l出队操作Out_Queue(q,x):当队q非空时,删除队头元素并由x返回队头元素的值,队列变化l读队头元素Front
107、_Queue(q,x):当队q非空时,读出队头元素并由x返回队头元素的值,队列不变化01:30:40本章主要内容本章主要内容: :l栈的定义及基本运算栈的定义及基本运算l栈的存储结构和运算实现栈的存储结构和运算实现l队列的定义及基本运算队列的定义及基本运算l队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:413.4 队列的存储结构和运算实现队列的存储结构和运算实现l l顺序队形顺序队形顺序队形顺序队形l l 循环队列循环队列循环队列循环队列 链队列链队列链队列链队列01:30:41l l 顺序队列顺序队列顺序队列顺序队列顺序队列:队列的顺序存储结构顺序队列
108、:队列的顺序存储结构利用一组地址连续的存储单元来存放队列中的元素;设置队头指针和队尾指针分别指示当前的队头元素和队尾元素顺序队列的类型定义顺序队列的类型定义typedefstructdatatypedataMAXSIZE;/队中元素存储空间intrear,front;/队尾和队头指针SeQueue;01:30:41l l 顺序队列顺序队列顺序队列顺序队列顺序队列的操作顺序队列的操作l为顺序队列申请空间为顺序队列申请空间SeQueue*q;q=(SeQueue*)malloc(sizeof(SeQueue);队列的数据区:q-data0q-dataMAXSIZE-1队头指针q-front:指向队
109、头元素的前一个位置队尾指针q-rear:指向队尾元素(1)队空:q-frontq-rear。(2)队满:q-rearMAXSIZE。(3)队中元素个数:(q-rear)-(q-front)。01:30:41l l 顺序队列顺序队列顺序队列顺序队列顺序队列的操作顺序队列的操作l入队q-rear+;q-dataq-rear=x; /元素x入队l出队q-front+;x=q-datasq-front;/队头元素出队并送x01:30:41l l 顺序队列顺序队列顺序队列顺序队列顺序队列的操作示意图顺序队列的操作示意图01:30:423.4 队列的存储结构和运算实现队列的存储结构和运算实现l l顺序队形
110、顺序队形顺序队形顺序队形l l 循环队列循环队列循环队列循环队列l l 链队列链队列链队列链队列01:30:42l l 循环队列循环队列循环队列循环队列循环队列:循环队列: 将顺序队列假想为一个首尾相接的圆将顺序队列假想为一个首尾相接的圆环环解决了假溢出的问题。损失了一个数据元素的存储空间,用来区分队满和队空的条件:l队满条件(q-rear+1)%MAXSIZEq-frontl队空条件则维持不变 q-rearq-front。l队列的元素个数为(q-rearq-front+MAXSIZE)%MAXSIZE01:30:43l l 循环队列循环队列循环队列循环队列循环队列的操作:初始化循环队列的操作
111、:初始化voidInit_SeQueue(SeQueue*q)*q=(SeQueue*)malloc(sizeof(SeQueue);/申请队空间(*q)-front=0;/队头指针值和队尾指针值相等则队为空(*q)-rear=0;01:30:43l l 循环队列循环队列循环队列循环队列循环队列的操作:入队循环队列的操作:入队voidIn_SeQueue(SeQueue*q,datatypex)if(q-rear+1)%MAXSIZE=q-front)printf(Queueisfull!n);/队满,入队失败elseq-rear=(q-rear+1)%MAXSIZE;/队尾指针加1q-dat
112、aq-rear=x;/将元素x入队01:30:43l l 循环队列循环队列循环队列循环队列循环队列的操作:出队循环队列的操作:出队voidOut_SeQueue(SeQueue*q,datatype*x)if(q-front=q-rear)printf(Queueisempty);/队空,出队失败elseq-front=(q-front+1)%MAXSIZE;/队头指针加1*x=q-dataq-front;/队头元素出队并由x返回队头元素值01:30:43l l 循环队列循环队列循环队列循环队列循环队列的操作:判断队列是否为空循环队列的操作:判断队列是否为空intEmpty_SeQueue(S
113、eQueue*q)if(q-front=q-rear)return1;/队空elsereturn0;/队不空01:30:433.4 队列的存储结构和运算实现队列的存储结构和运算实现l l顺序队形顺序队形顺序队形顺序队形l l 循环队列循环队列循环队列循环队列l l 链队列链队列链队列链队列01:30:43l l 链队列链队列链队列链队列链队列:队列的链式存储结构链队列:队列的链式存储结构typedefstructnodedatatypedata;structnode*next;QNode;/链队列结点的类型typedefstructQNode*front,*rear;/将头、尾指针纳入到一个结
114、构体的链队列LQueue;/链队列类型01:30:43l l 链队列链队列链队列链队列链队列示意图链队列示意图01:30:44l l 链队列链队列链队列链队列链队列操作:创建一个带头结点的空队列链队列操作:创建一个带头结点的空队列voidInit_LQueue(LQueue*q)/*q是为了保证返回到主调函数时仍能够访问该队列QNode*p;*q=(LQueue*)malloc(sizeof(LQueue);/申请带头、尾指针的结点p=(QNode*)malloc(sizeof(QNode);/申请链队列的头结点p-next=NULL;/头结点的next指针置为空(*q)-front=p; /
115、队头指针指向头结点(*q)-rear=p;/队尾指针指向头结点01:30:45l l 链队列链队列链队列链队列链队列操作:入队链队列操作:入队voidIn_LQueue(LQueue*q,datatypex)QNode*p;p=(QNode*)malloc(sizeof(QNode);/申请新链队列结点p-data=x;p-next=NULL;/新结点作为队尾结点时其next域为空q-rear-next=p;/将新结点*p链到原队尾结点之后q-rear=p;/使队尾指针指向新的队尾结点*p01:30:45l l 链队列链队列链队列链队列链队列操作:判断队列是否为空链队列操作:判断队列是否为空i
116、ntEmpty_LQueue(LQueue*q)if(q-front=q-rear)return1;/队为空elsereturn0;/队不空01:30:45l l 链队列链队列链队列链队列链队列操作:出队链队列操作:出队voidOut_LQueue(LQueue*q,datatype*x)QNode*p;if(Empty_LQueue(q)printf(Queueisempty!n);/队空,出队失败elsep=q-front-next;/指针p指向链队列第一个数据结点(即队头结点)q-front-next=p-next;/头结点的next指针指向链队列第二个数据结点*x=p-data;/将删
117、除的队头结点数据经由*x返回free(p);if(q-front-next=NULL)/出队后队为空,则置为空队列q-rear=q-front;01:30:45本章主要内容回顾本章主要内容回顾: :l栈的定义及基本运算栈的定义及基本运算l栈的存储结构和运算实现栈的存储结构和运算实现l队列的定义及基本运算队列的定义及基本运算l队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:45第第3 3章章栈和队列栈和队列01:30:49 第第3章章栈和队列栈和队列栈和队列都是操作受限的线性表栈和队列都是操作受限的线性表栈:先进后出栈:先进后出队列:先进先出队列:先进先出0
118、1:30:49本章主要内容本章主要内容: :栈的定义及基本运算栈的定义及基本运算栈的存储结构和运算实现栈的存储结构和运算实现队列的定义及基本运算队列的定义及基本运算队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:493.1 栈的定义及基本运算栈的定义及基本运算l l栈的定义栈的定义栈的定义栈的定义l l栈的基本操作栈的基本操作栈的基本操作栈的基本操作01:30:49l l 栈的定义栈的定义栈的定义栈的定义栈是限定仅在一端进行操作的线性表栈是限定仅在一端进行操作的线性表l栈顶(top):允许进行插入和删除元素操作的一端l栈底(bottom):固定不变的另一端
119、l空栈:不含元素的栈l满栈:存储空间被用完的栈先进后出先进后出01:30:493.1 栈的定义及基本运算栈的定义及基本运算l l栈的定义栈的定义栈的定义栈的定义l l栈的基本操作栈的基本操作栈的基本操作栈的基本操作01:30:49l l 栈的基本操作栈的基本操作栈的基本操作栈的基本操作l栈初始化栈初始化Init_Stack(s):生成一个空栈sl判栈空判栈空Empty_Stack(s):若栈s为空则返回1,否则返回0l入栈入栈Push_Stack(s,x):在栈s的顶部插入一个新元素x,使x成为新的栈顶元素,栈变化l出栈出栈Pop_Stack(s,x):在栈s非空的情况下,操作结果是将栈s的顶
120、部元素从栈中删除,并由x返回栈顶元素值,即栈中少了一个元素,栈变化l读栈顶元素读栈顶元素Top_Stack(s,x):在栈s非空的情况下,操作结果是将栈s的顶部元素读到x中,栈不变化01:30:49本章主要内容本章主要内容: :l栈的定义及基本运算栈的定义及基本运算l栈的存储结构和运算实现栈的存储结构和运算实现l队列的定义及基本运算队列的定义及基本运算l队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:493.2栈的存储结构和运算实现栈的存储结构和运算实现l l顺序栈顺序栈顺序栈顺序栈l l 两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间
121、两个顺序栈共享连续空间l l 链栈链栈链栈链栈01:30:50l l 顺序栈顺序栈顺序栈顺序栈顺序栈:栈的顺序存储结构顺序栈:栈的顺序存储结构利用一组地址连续的存储单元来依次存放由栈底到栈顶的所有元素,附加一个top指针来指示栈顶元素在顺序栈中的位置typedefstructdatatypedataMAXSIZE;/栈中元素存储空间inttop;/栈顶指针SeqStack;顺序栈的类型定义顺序栈的类型定义01:30:50l l 顺序栈顺序栈顺序栈顺序栈顺序栈操作示意图顺序栈操作示意图01:30:50l l 顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:初始化栈顺序栈基本操作:初始化栈voidInit
122、_SeqStack(SeqStack*s)*s=(SeqStack*)malloc(sizeof(SeqStack);/在主调函数中申请栈空间(*s)-top=-1;/置栈空标志01:30:50l l 顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:判断栈是否为空顺序栈基本操作:判断栈是否为空intEmpty_SeqStack(SeqStack*s)if(s-top=-1)/栈为空时返回1值return1;elsereturn0; /栈不空时返回0值01:30:50 顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:入栈顺序栈基本操作:入栈voidPush_SeqStack(SeqStack*s,datatyp
123、ex)if(s-top=MAXSIZE-1)printf(Stackisfull!n);/栈已满elses-top+;/先使栈顶指针top增1s-datas-top=x;/再将元素x压入栈*s中01:30:50l l 顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:出栈顺序栈基本操作:出栈voidPop_SeqStack(SeqStack*s,datatype*x)/将栈*s中的栈顶元素出栈并通过参数x返回给主调函数if(s-top=-1)printf(Stackisempty!n);/栈为空else*x=s-datas-top;/栈顶元素出栈s-top-;/栈顶指针top减101:30:51l l
124、顺序栈顺序栈顺序栈顺序栈顺序栈基本操作:取栈顶元素顺序栈基本操作:取栈顶元素voidTop_SeqStack(SeqStack*s,datatype*x)if(s-top=-1)printf(Stackisempty!n);/栈为空else*x=s-datas-top;/取栈顶元素值赋给*x01:30:513.2栈的存储结构和运算实现栈的存储结构和运算实现l l顺序栈顺序栈顺序栈顺序栈l l 两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间l l 链栈链栈链栈链栈01:30:51l l两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间两个
125、顺序栈共享连续空间利用栈底位置相对不变这一特点,两个顺序栈利用栈底位置相对不变这一特点,两个顺序栈可以共享一个一维数据空间来互补余缺。可以共享一个一维数据空间来互补余缺。实现方法是将两个栈的栈底分设在一维数据空实现方法是将两个栈的栈底分设在一维数据空间的两端,让其各自的栈顶由两端向中间延伸间的两端,让其各自的栈顶由两端向中间延伸01:30:51l l两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间多个栈共享一维数据空间的问题就比较复杂,多个栈共享一维数据空间的问题就比较复杂,因为一个存储空间只有两端是固定的,需要:因为一个存储空间只有两端是固定的,需要:
126、设置设置栈顶指针栈顶指针和和栈底指针栈底指针。这种情况下,当某个栈发生上溢时,如果整个这种情况下,当某个栈发生上溢时,如果整个一维数据空间未被占满,则必须移动某些(或一维数据空间未被占满,则必须移动某些(或某个)栈来腾出空间解决所发生的上溢某个)栈来腾出空间解决所发生的上溢01:30:523.2栈的存储结构和运算实现栈的存储结构和运算实现l l顺序栈顺序栈顺序栈顺序栈l l 两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间两个顺序栈共享连续空间 链栈链栈链栈链栈01:30:52l l链栈链栈链栈链栈链栈是指以链式存储结构存储的栈链栈是指以链式存储结构存储的栈链栈是动态分配元素
127、存储空间的,所以操作时无需考虑顺序栈容易出现的链栈是动态分配元素存储空间的,所以操作时无需考虑顺序栈容易出现的上溢问题,这样,多个栈的共享问题也就迎刃而解了上溢问题,这样,多个栈的共享问题也就迎刃而解了typedefstructnodedatatypedata;structnode*next;StackNode;链栈的定义:链栈的定义:01:30:52l l链栈链栈链栈链栈链栈的基本操作:初始化链栈链栈的基本操作:初始化链栈voidInit_LinkStack(StackNode*s)*s=NULL;/置栈顶指针*s为空01:30:52l l链栈链栈链栈链栈链栈的基本操作:判断链栈是否为空链栈
128、的基本操作:判断链栈是否为空intEmpty_LinkStack(StackNode*s)if(s=NULL)return1;/栈为空时返回1值elsereturn0;/栈不空时返回0值01:30:52l l链栈链栈链栈链栈链栈的基本操作:入栈链栈的基本操作:入栈voidPush_LinkStack(StackNode*top,datatypex)StackNode*p;p=(StackNode*)malloc(sizeof(StackNode);/申请一个结点空间p-data=x;/读入结点数据p-next=*top;/该结点作为栈顶元素链入链栈*top=p;/栈顶指针指向这个新栈顶元素01
129、:30:53l l链栈链栈链栈链栈链栈的基本操作:出栈链栈的基本操作:出栈voidPop_LinkStack(StackNode*top,datatype*x)StackNode*p;if(*top=NULL)/栈顶指针为空时printf(Stackisempty!n);else /栈顶指针为空时*x=(*top)-data;/栈顶元素的数据赋给*xp=*top;/指针p指向栈顶元素*top=(*top)-next;/栈顶指针指向栈顶元素出栈后的新栈顶free(p);/回收已出栈的原栈顶元素空间01:30:53本章主要内容本章主要内容: :l栈的定义及基本运算栈的定义及基本运算l栈的存储结构和
130、运算实现栈的存储结构和运算实现l队列的定义及基本运算队列的定义及基本运算l队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:533.3队列的定义及基本运算队列的定义及基本运算l l队列的定义队列的定义队列的定义队列的定义l l 队列的基本操作队列的基本操作队列的基本操作队列的基本操作01:30:53l l 队列的定义队列的定义队列的定义队列的定义栈是只能在一端插入,在另一端删除的线性表栈是只能在一端插入,在另一端删除的线性表l队头(front):只能删除的一端l队尾(rear):只能插入的一端l空队:不含元素的队列l满队:存储空间被用完的队列先先进进先先出出
131、01:30:533.3队列的定义及基本运算队列的定义及基本运算l l队列的定义队列的定义队列的定义队列的定义l l 队列的基本操作队列的基本操作队列的基本操作队列的基本操作01:30:54l l 队列的基本操作队列的基本操作队列的基本操作队列的基本操作l队列初始化Init_Queue(&q):生成一个空队列ql判队空操作Empty_Queue(q):当队q存在时,若q为空队则返回1值,否则返回0值l入队操作In_Queue(q,x):当队q存在时,将元素x插到队尾,队列变化l出队操作Out_Queue(q,x):当队q非空时,删除队头元素并由x返回队头元素的值,队列变化l读队头元素Front_
132、Queue(q,x):当队q非空时,读出队头元素并由x返回队头元素的值,队列不变化01:30:54本章主要内容本章主要内容: :l栈的定义及基本运算栈的定义及基本运算l栈的存储结构和运算实现栈的存储结构和运算实现l队列的定义及基本运算队列的定义及基本运算l队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:543.4 队列的存储结构和运算实现队列的存储结构和运算实现l l顺序队形顺序队形顺序队形顺序队形l l 循环队列循环队列循环队列循环队列 链队列链队列链队列链队列01:30:54l l 顺序队列顺序队列顺序队列顺序队列顺序队列:队列的顺序存储结构顺序队列:
133、队列的顺序存储结构利用一组地址连续的存储单元来存放队列中的元素;设置队头指针和队尾指针分别指示当前的队头元素和队尾元素顺序队列的类型定义顺序队列的类型定义typedefstructdatatypedataMAXSIZE;/队中元素存储空间intrear,front;/队尾和队头指针SeQueue;01:30:54l l 顺序队列顺序队列顺序队列顺序队列顺序队列的操作顺序队列的操作l为顺序队列申请空间为顺序队列申请空间SeQueue*q;q=(SeQueue*)malloc(sizeof(SeQueue);队列的数据区:q-data0q-dataMAXSIZE-1队头指针q-front:指向队头
134、元素的前一个位置队尾指针q-rear:指向队尾元素(1)队空:q-frontq-rear。(2)队满:q-rearMAXSIZE。(3)队中元素个数:(q-rear)-(q-front)。01:30:55l l 顺序队列顺序队列顺序队列顺序队列顺序队列的操作顺序队列的操作l入队q-rear+;q-dataq-rear=x; /元素x入队l出队q-front+;x=q-datasq-front;/队头元素出队并送x01:30:55l l 顺序队列顺序队列顺序队列顺序队列顺序队列的操作示意图顺序队列的操作示意图01:30:553.4 队列的存储结构和运算实现队列的存储结构和运算实现l l顺序队形顺
135、序队形顺序队形顺序队形l l 循环队列循环队列循环队列循环队列l l 链队列链队列链队列链队列01:30:56l l 循环队列循环队列循环队列循环队列循环队列:循环队列: 将顺序队列假想为一个首尾相接的圆将顺序队列假想为一个首尾相接的圆环环解决了假溢出的问题。损失了一个数据元素的存储空间,用来区分队满和队空的条件:l队满条件(q-rear+1)%MAXSIZEq-frontl队空条件则维持不变 q-rearq-front。l队列的元素个数为(q-rearq-front+MAXSIZE)%MAXSIZE01:30:56l l 循环队列循环队列循环队列循环队列循环队列的操作:初始化循环队列的操作:
136、初始化voidInit_SeQueue(SeQueue*q)*q=(SeQueue*)malloc(sizeof(SeQueue);/申请队空间(*q)-front=0;/队头指针值和队尾指针值相等则队为空(*q)-rear=0;01:30:56l l 循环队列循环队列循环队列循环队列循环队列的操作:入队循环队列的操作:入队voidIn_SeQueue(SeQueue*q,datatypex)if(q-rear+1)%MAXSIZE=q-front)printf(Queueisfull!n);/队满,入队失败elseq-rear=(q-rear+1)%MAXSIZE;/队尾指针加1q-data
137、q-rear=x;/将元素x入队01:30:56l l 循环队列循环队列循环队列循环队列循环队列的操作:出队循环队列的操作:出队voidOut_SeQueue(SeQueue*q,datatype*x)if(q-front=q-rear)printf(Queueisempty);/队空,出队失败elseq-front=(q-front+1)%MAXSIZE;/队头指针加1*x=q-dataq-front;/队头元素出队并由x返回队头元素值01:30:56l l 循环队列循环队列循环队列循环队列循环队列的操作:判断队列是否为空循环队列的操作:判断队列是否为空intEmpty_SeQueue(Se
138、Queue*q)if(q-front=q-rear)return1;/队空elsereturn0;/队不空01:30:563.4 队列的存储结构和运算实现队列的存储结构和运算实现l l顺序队形顺序队形顺序队形顺序队形l l 循环队列循环队列循环队列循环队列l l 链队列链队列链队列链队列01:30:56l l 链队列链队列链队列链队列链队列:队列的链式存储结构链队列:队列的链式存储结构typedefstructnodedatatypedata;structnode*next;QNode;/链队列结点的类型typedefstructQNode*front,*rear;/将头、尾指针纳入到一个结构
139、体的链队列LQueue;/链队列类型01:30:57l l 链队列链队列链队列链队列链队列示意图链队列示意图01:30:58l l 链队列链队列链队列链队列链队列操作:创建一个带头结点的空队列链队列操作:创建一个带头结点的空队列voidInit_LQueue(LQueue*q)/*q是为了保证返回到主调函数时仍能够访问该队列QNode*p;*q=(LQueue*)malloc(sizeof(LQueue);/申请带头、尾指针的结点p=(QNode*)malloc(sizeof(QNode);/申请链队列的头结点p-next=NULL;/头结点的next指针置为空(*q)-front=p; /队
140、头指针指向头结点(*q)-rear=p;/队尾指针指向头结点01:30:58l l 链队列链队列链队列链队列链队列操作:入队链队列操作:入队voidIn_LQueue(LQueue*q,datatypex)QNode*p;p=(QNode*)malloc(sizeof(QNode);/申请新链队列结点p-data=x;p-next=NULL;/新结点作为队尾结点时其next域为空q-rear-next=p;/将新结点*p链到原队尾结点之后q-rear=p;/使队尾指针指向新的队尾结点*p01:30:58l l 链队列链队列链队列链队列链队列操作:判断队列是否为空链队列操作:判断队列是否为空in
141、tEmpty_LQueue(LQueue*q)if(q-front=q-rear)return1;/队为空elsereturn0;/队不空01:30:58l l 链队列链队列链队列链队列链队列操作:出队链队列操作:出队voidOut_LQueue(LQueue*q,datatype*x)QNode*p;if(Empty_LQueue(q)printf(Queueisempty!n);/队空,出队失败elsep=q-front-next;/指针p指向链队列第一个数据结点(即队头结点)q-front-next=p-next;/头结点的next指针指向链队列第二个数据结点*x=p-data;/将删除
142、的队头结点数据经由*x返回free(p);if(q-front-next=NULL)/出队后队为空,则置为空队列q-rear=q-front;01:30:58本章主要内容回顾本章主要内容回顾: :l栈的定义及基本运算栈的定义及基本运算l栈的存储结构和运算实现栈的存储结构和运算实现l队列的定义及基本运算队列的定义及基本运算l队列的存储结构和运算实现队列的存储结构和运算实现第第3章章栈和队列栈和队列01:30:58第第4 4章章树与二叉树树与二叉树01:31:01 第四章第四章 树与二叉树树与二叉树 树形结构是一类重要的非线性结构,其逻辑关系呈现出一对多的关系。树形结构中元素(结点)之间具有明确的
143、层次关系,元素(结点)之间有分支,非常类似于自然界中的树。树结构在客观世界中是大量存在的,例如行政机构或家谱等都可用树来形象地表示。树在计算机领域中也有广泛的应用,例如在编译程序中,用树来表示源程序的语法结构,在数据库系统中用树来组织信息。01:31:01本章内容提要本章内容提要: :l树的基本概念树的基本概念l二叉树二叉树l二叉树的遍历二叉树的遍历l二叉排序树二叉排序树l哈夫曼树哈夫曼树l树和森林树和森林第四章第四章 树与二叉树树与二叉树01:31:024.1 4.1 树的基本概念树的基本概念 树的概念与定义树的概念与定义树的概念与定义树的概念与定义l l树的基本术语树的基本术语树的基本术语
144、树的基本术语树的概念与定义树的概念与定义01:31:02树的概念:树的概念:现实生活中存在许多用树形结构现实生活中存在许多用树形结构描述的实际问题。例如,某家族的关描述的实际问题。例如,某家族的关系如下:张抗生有三个孩子,即张卫系如下:张抗生有三个孩子,即张卫红、张卫兵和张卫华;而张卫兵有两红、张卫兵和张卫华;而张卫兵有两个孩子张明和张丽;张卫华有一个孩个孩子张明和张丽;张卫华有一个孩子张群。这个家族关系可以很自然的子张群。这个家族关系可以很自然的用图右图所示的树形图来描述,它很用图右图所示的树形图来描述,它很像一棵倒置的树。从右图可以看出,像一棵倒置的树。从右图可以看出,以张抗生为根的树是一
145、个大家庭,并以张抗生为根的树是一个大家庭,并可以分为张卫红、张卫兵、张卫华为可以分为张卫红、张卫兵、张卫华为根的三个小家庭,且每个小家庭又形根的三个小家庭,且每个小家庭又形成了一个树形结构。成了一个树形结构。01:31:02l l 树的定义树的定义树的定义树的定义树的概念:树的概念:树是n(n0)个结点的有限集合T,当n=0(即T为空)时称为空树;当n0时非空。树T满足以下两个条件:(1)有且仅有一个称为根的结点。)有且仅有一个称为根的结点。(2)其余结点可分为)其余结点可分为m(m0)个互不相交的子集)个互不相交的子集T1、T2、Tm,其中每个子集,其中每个子集Ti本身又是一棵树,并称为根的
146、子树。本身又是一棵树,并称为根的子树。01:31:024.1 4.1 树的基本概念树的基本概念l l树的概念与定义树的概念与定义树的概念与定义树的概念与定义l l树的基本术语树的基本术语树的基本术语树的基本术语01:31:02l l 树的基本术语树的基本术语树的基本术语树的基本术语(1)树的结点包含一个数据元素及若干指向其子树的分支结点拥有子树的个数树内个各结点度的最大值。度为0的结点,又称终端结点度不为0的结点,又称非终端结点结点的子树的根称为该结点的孩子若结点j是结点i的孩子,则结点i就是结点j的双亲同一双亲的孩子之间互称兄弟从根到该结点所经分支上的所有结点均为该结点的祖先以某结点为根的子
147、树中任意结点称为该根的子孙(2)结点的度(3)树的度(4)叶子(5)分支结点(6)孩子(7)双亲(8)兄弟(9)祖先(10)子孙01:31:02l l树的基本术语树的基本术语树的基本术语树的基本术语(11)结点层次从根开始,根为第一层,根的孩子为第二层;若某结点在L层,则其子树的根则在第L+1层树中结点的最大层次若树中每个结点的各个子树从左到右的次序不能互换,则称该树为有序树,否则为无序树森林是m(m0)棵互不相交的树构成的集合。删除一棵树的根,就得到由m棵子树构成的森林;反之,给m棵树的森林加上一个根结点,并且这m棵树都是该结点的子树,那么就由森林变为一棵树(12)树的深度(13)有序树或无
148、序树(14)森林01:31:034.2 4.2 二叉树二叉树l l二叉树的定义二叉树的定义二叉树的定义二叉树的定义l l二叉树的性质二叉树的性质二叉树的性质二叉树的性质l l二叉树的存储结构二叉树的存储结构二叉树的存储结构二叉树的存储结构二叉树的定义二叉树的定义二叉树的定义二叉树的定义:二叉树是n(n0)个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两棵互不相交l l二叉树的定义二叉树的定义二叉树的定义二叉树的定义(1)二叉树不存在度大于2的结点。(2)二叉树每个结点至多有两棵子树且有左、右之分,次序不能颠倒。二叉树任何一个结点的子树都要区分为左、右子树,即使这个结点只有一棵子
149、树时也要明确指出它是左子树还是右子树;而树则无此要求,即树中某个结点只有一棵子树时并不区分左右。(1)不存在度为1的结点,即所有分支结点都有左子树和右子树。(2)所有叶子结点都在同一层上。叶子结点只能出现在最下层和次最下层,且最下层的叶子结点都集中在树的左部。如果完全二叉树中某个结点的右孩子存在,则其左孩子必定存在。此外,在完全二叉树中如果存在度为1的结点,则该结点的孩子一定是结点编号中的最后一个叶子结点。注意:一棵满二叉树必定是一棵完全二叉树,而一棵完全二叉树却未必是一棵满二叉树,(可能存在叶子结点不在同一层上或者有度为一的结点)二叉树的特点:二叉树的特点:二叉树的特点:二叉树的特点:二叉树
150、与树的主要区别:二叉树与树的主要区别:二叉树与树的主要区别:二叉树与树的主要区别:满二叉树的性质满二叉树的性质满二叉树的性质满二叉树的性质 :完全二叉树的特点完全二叉树的特点完全二叉树的特点完全二叉树的特点 :01:31:034.2 4.2 二叉树二叉树l l二叉树的定义二叉树的定义二叉树的定义二叉树的定义l l二叉树的性质二叉树的性质二叉树的性质二叉树的性质l l二叉树的存储结构二叉树的存储结构二叉树的存储结构二叉树的存储结构性质性质性质性质1 1:非空二叉树的第i层上最多有2i-1个结点(i1)。性质性质性质性质2 2:深度为k的二叉树至多有2k-1个结点(k1)。性质性质性质性质3 3:
151、在任意非空二叉树中,如果叶子结点(度为0)数为n0,度为2的结点数为n2,则有n0n2+1性质性质性质性质4 4:具有n个结点的完全二叉树的深度为性质性质性质性质5 5:对一个具有n个结点的完全二叉树按层次自上而下,且每层从左到右的顺序对所有结点从1开始到n进行编号,则对任一序号为i的结点有:(1)若i1,则i的双亲结点序号是;若i=1,则i为根结点序号。(2)若2in,则i的左孩子序号是2i,否则i无左孩子。(3)若2i+1n,则i的右孩子序号是2i+1;否则i无右孩子。l l二叉树的性质二叉树的性质二叉树的性质二叉树的性质01:31:034.2 4.2 二叉树二叉树l l二叉树的定义二叉树
152、的定义二叉树的定义二叉树的定义 二叉树的性质二叉树的性质二叉树的性质二叉树的性质l l二叉树的存储结构二叉树的存储结构二叉树的存储结构二叉树的存储结构1.顺序存储结构二叉树的顺序存储是用一组地址连续的存储单元来存放二叉树中的结点数据。一般是按照二叉树结点自上而下、从左到右的顺序进行存储。l l二叉树的存储结构二叉树的存储结构二叉树的存储结构二叉树的存储结构实现二叉树存储,不但要存储二叉树中各结点的数据信息,而且还要能够反映出二叉树结点之间的逻辑关系,如孩子、双亲关系等lchilddatarchild2.链式存储结构二叉树的链式存储结构不但要存储结点的数据信息,而且要使用指针来反映结点之间的逻辑
153、关系。最常用的二叉树链式存储结构是二叉链表,其结点的存储结构如下:01:31:034.34.3二叉树的遍历二叉树的遍历l l二叉树的遍历方法二叉树的遍历方法二叉树的遍历方法二叉树的遍历方法l l遍历二叉树的递归算法及遍历示例遍历二叉树的递归算法及遍历示例遍历二叉树的递归算法及遍历示例遍历二叉树的递归算法及遍历示例l l二叉树遍历的应用二叉树遍历的应用二叉树遍历的应用二叉树遍历的应用l l二叉树的遍历方法二叉树的遍历方法二叉树的遍历方法二叉树的遍历方法先序遍历若二叉树非空:(1)访问根结点。(2)按先序遍历左子树。(3)按先序遍历右子树。若二叉树非空:(1)按中序遍历左子树。(2)访问根结点。(
154、3)按中序遍历右子树若二叉树非空:(1)按后序遍历左子树。(2)按后序遍历右子树。(3)访问根结点中序遍历后序遍历01:31:044.34.3二叉树的遍历二叉树的遍历l l二叉树的遍历方法二叉树的遍历方法二叉树的遍历方法二叉树的遍历方法l l遍历二叉树的递归算法及遍历示例遍历二叉树的递归算法及遍历示例遍历二叉树的递归算法及遍历示例遍历二叉树的递归算法及遍历示例 二叉树遍历的应用二叉树遍历的应用二叉树遍历的应用二叉树遍历的应用l l二叉树的遍历示例二叉树的遍历示例二叉树的遍历示例二叉树的遍历示例1)先序遍历二叉树的递归算法voidPreorder(BSTree*p)/先序遍历二叉树if(p!=N
155、ULL)printf(%3c,p-data);/访问根结点Preorder(p-lchild);/先序遍历左子树Preorder(p-rchild);/先序遍历右子树l l二叉树的遍历示例二叉树的遍历示例二叉树的遍历示例二叉树的遍历示例2)中序遍历二叉树的递归算法voidInorder(BSTree*p)/中序遍历二叉树if(p!=NULL)Inorder(p-lchild); /中序遍历左子树printf(%3c,p-data);/访问根结点Inorder(p-rchild); /中序遍历右子树l l二叉树的遍历示例二叉树的遍历示例二叉树的遍历示例二叉树的遍历示例3)后序遍历二叉树的遍历算法
156、voidPostorder(BSTree*p)/后序遍历二叉树if(p!=NULL)Postorder(p-lchild); /后序遍历左子树Postorder(p-rchild); /后序遍历右子树printf(%3c,p-data); /访问根结点01:31:044.34.3二叉树的遍历二叉树的遍历l l二叉树的遍历方法二叉树的遍历方法二叉树的遍历方法二叉树的遍历方法l l遍历二叉树的递归算法及遍历示例遍历二叉树的递归算法及遍历示例遍历二叉树的递归算法及遍历示例遍历二叉树的递归算法及遍历示例l l二叉树遍历的应用二叉树遍历的应用二叉树遍历的应用二叉树遍历的应用l l二叉树遍历的应用二叉树遍
157、历的应用二叉树遍历的应用二叉树遍历的应用1.查找数据元素2.统计二叉树中叶子结点的个数3.求二叉树深度4.建立二叉树的二叉链表并输出其中序遍历序列01:31:054.44.4二叉排序树二叉排序树l l二叉排序树的定义二叉排序树的定义二叉排序树的定义二叉排序树的定义l l二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作l l二叉排序树的定义二叉排序树的定义二叉排序树的定义二叉排序树的定义二叉排序树(binarysorttree)又称BST树或二叉查找树。它或者是一棵空树,或者是具有如下性质的二叉树。(1)若它的左子树非空,则左子树上所有结点
158、(记录)的值均小于根结点的值。(2)若它的右子树非空,则右子树上所有结点的值均大于或等于根结点的值。(3)左、右子树本身又分别是一棵二叉排序树。01:31:054.44.4二叉排序树二叉排序树l l二叉排序树的定义二叉排序树的定义二叉排序树的定义二叉排序树的定义l l二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作l二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作如果要向二叉排序树插入一个关键字为k的结点,则先在二叉排序树中进行查找。若查找成功则待插接点已经存在,故不用插入;若查找不
159、成功则新建一个关键字值为k的结点,然后再插入之。注意:在二叉排序树中,所有新插入的结点一定是作为叶子结点插入的。l二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作在二叉排序树中插入一个结点的算法如下:voidBSTCreat(BSTree*t,KeyTypek)/非空二叉排序树中插入一个结点BSTree*p,*q;q=t;while(q!=NULL) /二叉排序树非空时if(k=q-key)gotoL1;/查找成功,不插入新结点elseif(kkey)/k小于结点*q的关键字值,则到t的左子树查找p=q;q=q-lchild;else/k
160、大于结点*q的关键字值,则到t的右子树查找p=q;q=p-rchild;l二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作二叉排序树的构造和插入操作q=(BSTree*)malloc(sizeof(BSTree);/查找不成功时创建一个新结点q-key=k;q-lchild=NULL;/因作为叶子结点插入,故左、右指针均为空q-rchild=NULL;if(p-keyk)p-lchild=q;/作为原叶子结点*p的左孩子插入elsep-rchild=q;/作为原叶子结点*p的右孩子插入L1:;01:31:064.54.5哈夫曼树哈夫曼树l l哈夫曼树基本概念及构造
161、方法哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法l l哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现l l哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树。哈夫曼树的应用十分广泛,如用于通信及数据传输中可构造传输效率很高的二进制编码(哈夫曼编码),这种编码还可以应用于磁盘文件的压缩存储;在编写程序中也可以构造平均执行时间最短的最佳判断过程等l l哈夫曼树基本概念及构造方法哈夫曼
162、树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法下面首先介绍有关术语:路径长度从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数二叉树具有n个带权值的叶子结点,则从根结点到每一个叶子结点的路径长度与该叶子结点权值的乘积之和二叉树带权路径长度l l哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼算法如下:(1)根据给定的n个权值w1,w2,wn构成n棵二叉树的集合F=T1,T2,Tn;其中,每棵二叉树Ti(1in)只有一个带权值wi的根结点,其左、右子树均为空。(2)在F中选取两棵根结
163、点权值最小的二叉树作为左、右子树来构造一棵新二叉树,且置新二叉树根结点权值为其左、右子树根结点的权值之和。(3)在F中删除这两棵树,同时将新生成的二叉树加入到F中。(4)重复(2)、(3),直到F中只剩下一棵二叉树为止,则这棵二叉树即为哈夫曼树。l l哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树具有如下几个特点:(1)对给定的权值,所构造的二叉树具有最小WPL。(2)权值大的结点离根近,权值小的结点离根远。(3)所生成的二叉树不唯一。(4)没有度为1的结点。 哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念
164、及构造方法哈夫曼树基本概念及构造方法哈夫曼算法如下:(1)根据给定的n个权值w1,w2,wn构成n棵二叉树的集合F=T1,T2,Tn;其中,每棵二叉树Ti(1in)只有一个带权值wi的根结点,其左、右子树均为空。(2)在F中选取两棵根结点权值最小的二叉树作为左、右子树来构造一棵新二叉树,且置新二叉树根结点权值为其左、右子树根结点的权值之和。(3)在F中删除这两棵树,同时将新生成的二叉树加入到F中。(4)重复(2)、(3),直到F中只剩下一棵二叉树为止,则这棵二叉树即为哈夫曼树。01:31:064.54.5哈夫曼树哈夫曼树l l哈夫曼树基本概念及构造方法哈夫曼树基本概念及构造方法哈夫曼树基本概念
165、及构造方法哈夫曼树基本概念及构造方法l l哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现l l哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法如下:为了方便哈夫曼树的构造,我们采用静态链表(即数组)作为哈夫曼树的存储结构。设置一个结构数组Huff保存哈夫曼树中各结点的信息。结点的结构形式如下:weightlchildrchildparent其中,weight域保存结点的权值,lchild和rchild域分别保存该结点的左、右孩子结点在数组Huff中的序号(序号由0开始),从而建立各结点之间的关系。此外,为了判断一个结点是否已纳入到生成的哈夫曼树中,可
166、通过parent域值来判定。l l哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现构造哈夫曼树时,首先将由n个权值构成的n棵仅有一个结点的二叉树(这n个结点即为最终生成的哈夫曼树中的n个叶子结点)存放到数组Huff的前n个数组元素中,然后根据哈夫曼算法的基本思想,不断将两棵较小的子树合并为一棵较大的子树,并且每次构成的新子树根结点都依次存放到数组Huff前n个数组元素的后面。l l哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现哈夫曼树构造算法实现如下:typedefstructintweight,parent,lchild,rchild;HNode;voidH
167、uffTree(HNodeHuff,intn)/Huff为形参数组,n为叶子结点个数inti,j,m1,m2,x1,x2;for(i=0;i2*n-1;i+)/对数组Huff初始化Huffi.weight=0;Huffi.parent=-1;Huffi.lchild=-1;Huffi.rchild=-1;printf(Input1nvalueofleaf:n);for(i=0;in;i+)/输入n个叶子结点的权值scanf(%d,&Huffi.weight);l l哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现for(i=0;in-1;i+)/构造哈夫曼树并生成该树的n-1个
168、分支结点m1=m2=32767;x1=x2=0;for(j=0;jn+i;j+)/选取最小和次小两个权值结点并将其序号送x1和x2if(Huffj.parent=-1&Huffj.weightm1)m2=m1;x2=x1;m1=Huffj.weight;x1=j;elseif(Huffj.parent=-1&Huffj.weightm2)m2=Huffj.weight;x2=j;l l哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现哈夫曼算法的实现/将找出的两棵子树合并为一棵新的子树Huffx1.parent=n+i; /两棵子树根结点的双亲结点序号为n+iHuffx2.parent=n+i;
169、Huffn+i.weight=Huffx1.weight+Huffx2.weight;/新子树根结点的权值为两棵子树根结点权值之和Huffn+i.lchild=x1;Huffn+i.rchild=x2;printf(Huffweightlchildrchildparentn);for(i=0;i2*n-1;i+)/输出哈夫曼树即数组Huff的信息printf(%3d%5d%10d%10d%10dn,i,Huffi.weight,Huffi.lchild,Huffi.rchild,Huffi.parent);01:31:084.54.5树和森林树和森林l l树的定义与存储结构树的定义与存储结构树
170、的定义与存储结构树的定义与存储结构l l树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换l l树和森林的遍历树和森林的遍历树和森林的遍历树和森林的遍历l l树的定义与存储结构树的定义与存储结构树的定义与存储结构树的定义与存储结构树是n(n0)个结点组成的有限集合T。当n=0时,称这棵树为空树。在一棵非空树T中:(1)有一个特殊的结点称为树的根结点,根结点没有前驱结点。(2)若n1,则除根结点之外的其余结点被分成m(m0)个互不相交的集合T1、T2、Tn,其中每一个集合Ti(1im)本身又是一棵树;树T1、T2、Tm称为这个根结点的子树。树
171、具有如下两个特点:(1)树的根结点没有前驱结点,除根结点之外的所有结点有且仅有一个前驱结点。(2)树中所有结点可以有零个或多个后继结点。l l树的定义与存储结构树的定义与存储结构树的定义与存储结构树的定义与存储结构树的常用存储结构主要有孩子兄弟表示法。孩子兄弟表示法又称树的二叉链表表示法,这种存储结构类似于二叉树的链式存储结构,所不同的是每个结点的左指针指向其第一个孩子结点,而右指针则指向该结点的兄弟结点,并且根结点因无兄弟而右指针为空。树的孩子兄弟表示法为实现树、森林与二叉树之间的转换提供了物质基础。01:31:084.54.5树和森林树和森林l l树的定义与存储结构树的定义与存储结构树的定
172、义与存储结构树的定义与存储结构l l树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换l l树和森林的遍历树和森林的遍历树和森林的遍历树和森林的遍历l l树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换1.树转换成二叉树由于树和二叉树都可以采用二叉链表作为存储结构,因此可以找出它们之间的对应关系,从而实现树到二叉树的转换,即给定一棵树,则可以找到唯一的一棵二叉树与之对应,这种转换方法如下:(1)在树中所有兄弟结点之间加一条连线。(2)树中的每一个结点只保留它与第一个孩子结点的分支,删去
173、该结点与其他孩子结点的分支。(3)以树根结点为轴心,将整棵树按顺时针转动一定角度,使树成为二叉树的层次形态。l l树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换2.森林转换为二叉树由于树根没有兄弟,所以将树转换为二叉树后,二叉树的根一定没有右子树。根据这一特点,将森林转换为一棵二叉树的方法如下:(1)首先将森林中的每一棵树都转换成二叉树。(2)将第一棵二叉树(没有右子树)的根作为森林转化为二叉树之后的二叉树的根,第一棵二叉树的左子树作为森林转化为二叉树后的根的左子树;从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的
174、右孩子;当所有二叉树都完全连接到一棵二叉树后,此时所得到的二叉树就是森林转换的二叉树。l l树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换3.二叉树转换为树和森林具体方法是:若二叉树非空,则二叉树根及其左子树即为第一棵树的二叉树形式;二叉树根的右子树又可以看作是剩余的二叉树所构成的森林,再按上述方法分离出一棵树来;这样重复到一棵没有右子树的二叉树为止,就得到了整个森林。为了进一步得到树,可用树的二叉链表表示(即孩子兄弟表示法)的逆方法,即结点与结点的右子树根、右子树的右子树根都是同一双亲结点的孩子。01:31:094.54.5树和森林树
175、和森林l l树的定义与存储结构树的定义与存储结构树的定义与存储结构树的定义与存储结构l l树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换树、森林与二叉树之间的转换l l树和森林的遍历树和森林的遍历树和森林的遍历树和森林的遍历l l树和森林的遍历树和森林的遍历树和森林的遍历树和森林的遍历1.树的遍历(1)树的先根遍历:先访问树的根结点,然后按从左到右的顺序依次先根遍历根结点的每一棵子树。(2)树的后根遍历:先按从左到右顺序依次后根遍历根结点的每一棵子树,然后再访问根结点。l l树和森林的遍历树和森林的遍历树和森林的遍历树和森林的遍历注意:(1)先根遍历一棵树等价于
176、先序遍历该树转换的二叉树,后根遍历一棵树等价于中序遍历该树转换的二叉树。因此,树的遍历也可以将树先转换为二叉树后再进行遍历。(2)树的遍历方法中无中根遍历。这是因为,如果在树的遍历方法中有中根遍历,则对树根的访问就必须在某些子树之间进行,即先访问一些子树,然后再访问根结点,最后再访问其余的子树。但是,由于每个结点的子树可能有多个,在哪些子树之后访问根结点将无法确定,这正是树的遍历中没有中根遍历的原因。l l树和森林的遍历树和森林的遍历树和森林的遍历树和森林的遍历2.森林的遍历按照森林和树的相互递归定义,可以得到森林的两种遍历方法:(1)先序遍历森林:若森林非空,访问森林中第一棵树的根结点,再先
177、序遍历第一棵树根结点的子树森林,最后用先序遍历去掉第一棵树后剩余的树所构成的森林。(2)中序遍历森林:若森林非空,中序遍历森林中第一棵树根结点的子树森林,再访问第一棵树的根结点,最后用中序遍历去掉第一棵树后剩余的树所构成的森林。l l树和森林的遍历树和森林的遍历树和森林的遍历树和森林的遍历注意:(1)先序遍历森林等价于先序遍历该森林所转换的二叉树,中序遍历森林等价于中序遍历该森林所转换的二叉树。(2)森林的遍历方法中无后序遍历。以森林转换的二叉树为例,根结点和左子树实际上是森林中第一棵树,而右子树则是除了第一棵树之外其余的树所构成的森林。按照后序遍历的方法,遍历过程为左子树、右子树、根结点的这
178、种遍历方法将把第一棵树分割为不相连的两部分,对右子树构成的其余树也是如此。因此,在森林的遍历过程中无后序遍历。01:31:10第第5 5章章图图01:31:13 第第5章章图图相对于树结构:相对于树结构:图结构是一种更复杂的非线性结构图结构是一种更复杂的非线性结构两个结点之间的邻接关系可以是任意的两个结点之间的邻接关系可以是任意的图结构可用来描述更加复杂的对象图结构可用来描述更加复杂的对象01:31:13本章主要内容本章主要内容: :图的基本概念图的基本概念图的存储结构图的存储结构图的遍历图的遍历第第5章章图图01:31:135.1 图的基本概念图的基本概念l l图的定义图的定义图的定义图的定
179、义l l图的基本术语图的基本术语图的基本术语图的基本术语01:31:14l l 图的定义图的定义图的定义图的定义图图(Graph)是由非空的顶点集合是由非空的顶点集合V与描与描述顶点之间关系述顶点之间关系边(或者弧)的集合边(或者弧)的集合E组成,其形式化定义为:组成,其形式化定义为:G=(V,E)l图图G中的每一条边都是没有方向的中的每一条边都是没有方向的l边是图中顶点的无序偶对:边是图中顶点的无序偶对:(vi,vj)l(vi,vj)表示顶点表示顶点vi和顶点和顶点vj相连的边相连的边l(vi,vj)与与(vj,vi)表示同一条边表示同一条边lvi和和vj互为邻接点互为邻接点无无向向图图01
180、:31:14l l 图的定义图的定义图的定义图的定义无向图的表示无向图的表示G1=(V1,E1)其中:其中:V1=v1,v2,v3,v4E1=(v1,v2),(v1,v4),(v2,v4),(v3,v4)01:31:14l l 图的定义图的定义图的定义图的定义l图图G中的每一条边都是有方向的中的每一条边都是有方向的l边是图中顶点的有序偶对:边是图中顶点的有序偶对:vi,vjlvi,vj表示从顶点表示从顶点vi指向顶点指向顶点vj的一条有向边的一条有向边lvi邻接到邻接到vj,或者接,或者接vj邻接于邻接于vilvi,vj依附于依附于vi和和vj有有向向图图01:31:14l l 图的定义图的定
181、义图的定义图的定义有向图的表示有向图的表示G2=(V2,E2)其中:其中:V2=v1,v2,v3,v4,v5E2=,01:31:145.1 图的基本概念图的基本概念l l图的定义图的定义图的定义图的定义l l图的基本术语图的基本术语图的基本术语图的基本术语01:31:14l l 图的基本术语图的基本术语图的基本术语图的基本术语l无向完全图:无向完全图:任意两个顶点之间都有一条边的无向图任意两个顶点之间都有一条边的无向图l有向完全图:有向完全图:任意两个顶点之间都有方向相反的两条边存在的有向图任意两个顶点之间都有方向相反的两条边存在的有向图l顶点的度:顶点的度:顶点的度是指依附于顶点顶点的度是指
182、依附于顶点v的边数,通常记为的边数,通常记为D(v)。l有向图中顶点的入度、出度:有向图中顶点的入度、出度:顶点顶点v的入度是指以的入度是指以v为终点的边的个数,记为为终点的边的个数,记为ID(v);顶点;顶点v的出度是指以的出度是指以v为起点的边的个数,记为为起点的边的个数,记为OD(v)。l有向图顶点的度:有向图顶点的度:定义为该顶点的入度和出度之和,即定义为该顶点的入度和出度之和,即D(v)=ID(v)OD(v)。01:31:14l l 图的基本术语图的基本术语图的基本术语图的基本术语l路径、路径长度:路径、路径长度:若若G为无向图,则从顶点为无向图,则从顶点vp到顶点到顶点vq的路径是
183、指存在一个的路径是指存在一个顶点序列:顶点序列:vp,vi1,vi2,vin,vq,使得,使得(vp,vi1),(vi1,vi2),(vin,vq)分别为图分别为图G中的边;若中的边;若G为有向图,其路径也是有方向的,它由图为有向图,其路径也是有方向的,它由图G中的有向边中的有向边vp,vi1,vi1,vi2,vin,vq组成。路径长度是路径上边或弧的个数组成。路径长度是路径上边或弧的个数l回路、简单路径、简单回路:回路、简单路径、简单回路:若一条路径上的起点和终点相同,则称该路径若一条路径上的起点和终点相同,则称该路径为回路或环。若路径中的顶点不重复出现,则称该路径为简单路径。为回路或环。若
184、路径中的顶点不重复出现,则称该路径为简单路径。l子图:子图:对图对图G=(V,E)和图和图G=(V,E),若存在,若存在V是是V的子集,的子集,E是是E的子集,的子集,且且E中的边都依附于中的边都依附于V中的顶点,则称图中的顶点,则称图G是是G的一个子图的一个子图01:31:15l l 图的基本术语图的基本术语图的基本术语图的基本术语l连通和连通图:连通和连通图:在无向图中,如果从顶点在无向图中,如果从顶点vi到另一顶点到另一顶点vj(ij)有路径,则)有路径,则称顶点称顶点vi和顶点和顶点vj是连通的。如果图中任意两个顶点都是连通的,则称该图是是连通的。如果图中任意两个顶点都是连通的,则称该
185、图是连通图连通图l强连通和强连通图:强连通和强连通图:在有向图中,如果从顶点在有向图中,如果从顶点vi到另一个顶点到另一个顶点vj(ij)有路)有路径,则称顶点径,则称顶点vi到顶点到顶点vj是连通的。若图中任意一对顶点是连通的。若图中任意一对顶点vi和和vj(ij)均有从顶)均有从顶点点vi到顶点到顶点vj的路径,也有从顶点的路径,也有从顶点vj到顶点到顶点vi的路径,则称该有向图是强连通图的路径,则称该有向图是强连通图01:31:15l l 图的基本术语图的基本术语图的基本术语图的基本术语01:31:16l l 图的基本术语图的基本术语图的基本术语图的基本术语01:31:16本章主要内容本
186、章主要内容: :l图的基本概念图的基本概念l图的存储结构图的存储结构l图的遍历图的遍历第第5章章图图01:31:16l l 图的存储结构图的存储结构图的存储结构图的存储结构l从图的定义可知,一个图的信息包括两个部分:图中顶点的信息以从图的定义可知,一个图的信息包括两个部分:图中顶点的信息以及描述顶点之间的关系及描述顶点之间的关系边或弧的信息。无论采取什么方法来建立边或弧的信息。无论采取什么方法来建立图的存储结构,都要完整、准确地反映这两部分的信息。图的存储结构,都要完整、准确地反映这两部分的信息。l为适于用为适于用C C语言描述,从本节起顶点序号由语言描述,从本节起顶点序号由0 0开始,即图的
187、顶点集的开始,即图的顶点集的一般形式为一般形式为V=v0,v1,vn-101:31:165.2 图的存储结构图的存储结构l l邻接矩阵邻接矩阵邻接矩阵邻接矩阵l l邻接表邻接表邻接表邻接表01:31:16l l 邻接矩阵邻接矩阵邻接矩阵邻接矩阵邻接矩阵存储结构:邻接矩阵存储结构:用一维数组存储图中用一维数组存储图中顶点的信息,并用矩阵来表示图中各顶点顶点的信息,并用矩阵来表示图中各顶点之间的邻接关系。之间的邻接关系。假定图假定图G=(V,E)有有n个顶点,即个顶点,即V=v0,v1,vn-1,则表示,则表示G中各顶点相邻关系需用中各顶点相邻关系需用一个一个nn的矩阵,且矩阵元素为:的矩阵,且矩
188、阵元素为:01:31:17l l 邻接矩阵邻接矩阵邻接矩阵邻接矩阵01:31:18l l 邻接矩阵邻接矩阵邻接矩阵邻接矩阵在采用邻接矩阵方式表示图时,除了用一在采用邻接矩阵方式表示图时,除了用一个二维数组存储用于表示顶点相邻关系的个二维数组存储用于表示顶点相邻关系的邻接矩阵之外,还需要用一个一维数组存邻接矩阵之外,还需要用一个一维数组存储顶点信息。一个图在顺序存储结构下的储顶点信息。一个图在顺序存储结构下的类型定义如下:类型定义如下:typedef struct char vertexMAXSIZE; /顶点为字符型且顶点表的长度小于顶点为字符型且顶点表的长度小于MAXSIZE int edg
189、esMAXSIZEMAXSIZE;/边为整型且边为整型且edges为邻接矩阵为邻接矩阵MGraph; /MGraph为采用邻接矩阵存储的图类型为采用邻接矩阵存储的图类型 01:31:18 邻接矩阵邻接矩阵邻接矩阵邻接矩阵建立一个无向图的邻接矩阵存储程序员如下建立一个无向图的邻接矩阵存储程序员如下: :void CreatMGraph(MGraph *g, int e, int n) /建立无向图的邻接矩阵建立无向图的邻接矩阵g-egdes,n为顶点个数,为顶点个数,e为边数为边数 int i, j, k; printf(Input data of vertexs(0n-1): n); for(
190、i=0;ivertexi=i; /读入顶点信息读入顶点信息 for(i=0;in;i+) for(j=0;jedgesij=0; /初始化邻接矩阵初始化邻接矩阵 for(k=1;kedgesij=1; g-edgesji=1; 01:31:185.2 图的存储结构图的存储结构l l邻接矩阵邻接矩阵邻接矩阵邻接矩阵l l邻接表邻接表邻接表邻接表01:31:18l l 邻接表邻接表邻接表邻接表邻接表储结构:邻接表储结构:是一种顺序存储与链式存储相结合的存储是一种顺序存储与链式存储相结合的存储方法。对于图方法。对于图G中的每个顶点中的每个顶点vi,将所有邻接于,将所有邻接于vi的顶点的顶点vj链成一
191、个链成一个单链表,这个单链表就称为顶点单链表,这个单链表就称为顶点vi的邻接表;然后,将所有顶点的的邻接表;然后,将所有顶点的邻接表表头指针放入到一个一维数组中,就构成了图的邻接表邻接表表头指针放入到一个一维数组中,就构成了图的邻接表01:31:19l l 邻接表邻接表邻接表邻接表01:31:19l l 邻接表邻接表邻接表邻接表邻接表类型定义:邻接表类型定义:typedefstructnode /邻接表结点邻接表结点intadjvex;/邻接点域邻接点域structnode*next;/指向下一个邻接边结点的指针域指向下一个邻接边结点的指针域EdgeNode;/邻接表结点类型邻接表结点类型ty
192、pedefstructvnode /顶点表结点顶点表结点intvertex;/顶点域顶点域EdgeNode*firstedge;/指向邻接表第一个邻接边结点的指针域指向邻接表第一个邻接边结点的指针域VertexNode;/顶点表结点类型顶点表结点类型01:31:19l l 邻接表邻接表邻接表邻接表建立一个无向图的邻接表存储程序:建立一个无向图的邻接表存储程序:void CreatAdjlist(VertexNode g, int e, int n)/建立无向图的邻接表,建立无向图的邻接表,n为顶点数,为顶点数,e为边数,为边数,g存储存储n个顶点表结点个顶点表结点 EdgeNode *p; i
193、nt i, j, k; printf(Input date of vertex(0n-1);n); for(i=0;in;i+) /建立有建立有n个顶点的顶点表个顶点的顶点表 gi.vertex=i; /读入顶点读入顶点i信息信息 gi.firstedge=NULL; /初始化指向顶点初始化指向顶点i的邻接表表头指针的邻接表表头指针 for(k=1;kadjvex=j; /在顶点在顶点vi的邻接表中添加邻接点为的邻接表中添加邻接点为j的结点的结点 p-next=gi.firstedge; /插入是在邻接表表头进行的插入是在邻接表表头进行的 gi.firstedge=p; p=(EdgeNode
194、 *)malloc(sizeof(EdgeNode); p-adjvex=i; /在顶点在顶点vj的邻接表中添加邻接点为的邻接表中添加邻接点为i的结点的结点 p-next=gj.firstedge; /插入是在邻接表表头进行的插入是在邻接表表头进行的 gj.firstedge=p; 01:31:20l l 邻接表邻接表邻接表邻接表01:31:21本章主要内容本章主要内容: :l图的基本概念图的基本概念l图的存储结构图的存储结构l图的遍历图的遍历第第5章章图图01:31:21l l 图的遍历图的遍历图的遍历图的遍历图的遍历是指从图中的任一顶点出发,按照事先确定的某种搜索方法依次图的遍历是指从图中
195、的任一顶点出发,按照事先确定的某种搜索方法依次对图中所有顶点进行访问且仅访问一次的过程。其复杂性主要表现在以下对图中所有顶点进行访问且仅访问一次的过程。其复杂性主要表现在以下四个方面:四个方面:(1 1)任何一个顶点都可以作为第一个被访问的结点)任何一个顶点都可以作为第一个被访问的结点(2 2)在非连通图中,从一个顶点出发只能访问它所在的连通分量上的顶点,)在非连通图中,从一个顶点出发只能访问它所在的连通分量上的顶点,需考虑如何选取下一个未被访问的顶点来继续访问图中其余的连通分量需考虑如何选取下一个未被访问的顶点来继续访问图中其余的连通分量(3 3)如果有回路存在,则一个顶点被访问后有可能沿回
196、路又回到该顶点)如果有回路存在,则一个顶点被访问后有可能沿回路又回到该顶点(4 4)一个顶点可以和其他多个顶点相邻,当该顶点访问过后则存在如何从)一个顶点可以和其他多个顶点相邻,当该顶点访问过后则存在如何从众多相邻顶点中选取下一个要访问的顶点问题众多相邻顶点中选取下一个要访问的顶点问题01:31:215.3 图的遍历图的遍历l l深度优先遍历深度优先遍历深度优先遍历深度优先遍历l l广度优先遍历广度优先遍历广度优先遍历广度优先遍历l l图的应用图的应用图的应用图的应用01:31:21l l 深度优先遍历深度优先遍历深度优先遍历深度优先遍历深度优先的深度优先的基本思想基本思想是:假设初始状态是图
197、是:假设初始状态是图中所有顶点都未曾访问过,则深度优先搜索中所有顶点都未曾访问过,则深度优先搜索可以从图中某个顶点可以从图中某个顶点v出发即先访问出发即先访问v,然后,然后依次从依次从v的未曾访问过的邻接点出发,继续深的未曾访问过的邻接点出发,继续深度优先搜索图,直至图中所有和度优先搜索图,直至图中所有和v有路径相通有路径相通的顶点都被访问过。若此时图中尚有顶点未的顶点都被访问过。若此时图中尚有顶点未被访问过,则另选一个未曾访问过的顶点作被访问过,则另选一个未曾访问过的顶点作为起始点,重复上述深度优先搜索的过程,为起始点,重复上述深度优先搜索的过程,直到图中的所有顶点都被访问过为止。直到图中的
198、所有顶点都被访问过为止。01:31:21l l 深度优先遍历深度优先遍历深度优先遍历深度优先遍历深度优先类似于树的先根遍历,是树的先根遍历的一种推广,深度优先类似于树的先根遍历,是树的先根遍历的一种推广,搜索顶点的次序是沿着一条路径尽量向纵深发展搜索顶点的次序是沿着一条路径尽量向纵深发展v0v1v3v6v4v2v501:31:22l l 深度优先遍历深度优先遍历深度优先遍历深度优先遍历深度优先搜索遍历图的过程是一个深度优先搜索遍历图的过程是一个递归过程递归过程,可以用递归算法来实现。在算法中为了避免可以用递归算法来实现。在算法中为了避免在访问过某顶点后又沿着某条回路回到该顶在访问过某顶点后又沿
199、着某条回路回到该顶点这种重复访问的情况出现,就必须在图的点这种重复访问的情况出现,就必须在图的遍历过程中对每一个访问过的顶点进行标识。遍历过程中对每一个访问过的顶点进行标识。在遍历算法中对在遍历算法中对n个顶点的图设置了一个长度个顶点的图设置了一个长度为为n的访问标志数组的访问标志数组visitedn,每个数组元,每个数组元素被初始化为素被初始化为0,一旦某个顶点,一旦某个顶点i被访问则相应被访问则相应的的visitedi就置为就置为1来作为访问过的标志。来作为访问过的标志。01:31:22l l 深度优先遍历深度优先遍历深度优先遍历深度优先遍历深度优先遍历的算法程序如下:深度优先遍历的算法程
200、序如下:int visitedMAXSIZE; /MAXSIZE为大于或等于无向图顶点个数的常量为大于或等于无向图顶点个数的常量void DFS(VertexNode g, int i) EdgeNode *p; printf(%4d, gi.vertex); /输出顶点输出顶点i信息,即访问顶点信息,即访问顶点i visitedi=1; /置顶点置顶点i为访问过的标志为访问过的标志 p=gi.firstedge; /根据顶点根据顶点i的指针的指针firstedge查找其邻接表的第一个邻接边结点查找其邻接表的第一个邻接边结点 while(p!=NULL) /当邻接边结点不为空时当邻接边结点不为
201、空时 if(!visitedp-adjvex) /如果邻接的这个边结点未被访问过如果邻接的这个边结点未被访问过 DFS(g, p-adjvex); /对这个边结点进行深度优先搜索对这个边结点进行深度优先搜索 p=p-next; /查找顶点查找顶点i的下一个邻接边结点的下一个邻接边结点 void DFSTraverse(VertexNode g, int n) /深度优先搜索遍历用邻接表存储的图,其中深度优先搜索遍历用邻接表存储的图,其中g为顶点表,为顶点表,n为顶点个数为顶点个数 int i; for(i=0;in;i+) visitedi=0; /访问标志置访问标志置0 for(i=0;ia
202、djvex)/如果邻接的这个边结点未被访问过如果邻接的这个边结点未被访问过printf(%4d,gp-adjvex.vertex);/输出这个邻接边结点的顶点信息输出这个邻接边结点的顶点信息visitedp-adjvex=1;/置该邻接边结点为访问过标志置该邻接边结点为访问过标志In_LQueue(Q,p-adjvex);/将该邻接边结点送入队将该邻接边结点送入队Qp=p-next;/在顶点在顶点j的邻接表中查找的邻接表中查找j的下一个邻接边结点的下一个邻接边结点01:31:235.3 图的遍历图的遍历l l深度优先遍历深度优先遍历深度优先遍历深度优先遍历l l广度优先遍历广度优先遍历广度优先
203、遍历广度优先遍历l l图的应用图的应用图的应用图的应用01:31:23l l 图的应用图的连通性图的应用图的连通性图的应用图的连通性图的应用图的连通性判断一个图的连通性是图的应用问题,可以判断一个图的连通性是图的应用问题,可以利用图的遍历算法来求解这一问题。在对无利用图的遍历算法来求解这一问题。在对无向图进行遍历时,对连通图仅需从图中任一向图进行遍历时,对连通图仅需从图中任一顶点出发进行深度优先搜索或广度优先搜索,顶点出发进行深度优先搜索或广度优先搜索,就可访问到图中的所有顶点;对于非连通图,就可访问到图中的所有顶点;对于非连通图,则需要由不连通的多个顶点开始进行搜索,则需要由不连通的多个顶点
204、开始进行搜索,且每一次从一个新的顶点出发进行搜索过程且每一次从一个新的顶点出发进行搜索过程中所得到的顶点访问序列,就是包含该出发中所得到的顶点访问序列,就是包含该出发顶点的这个连通分量中的顶点集。顶点的这个连通分量中的顶点集。01:31:23l l 图的应用图的连通性图的应用图的连通性图的应用图的连通性图的应用图的连通性连通分量的计算:连通分量的计算:intvisitedMAXSIZE;/MAXSIZE为大于或等于无向图顶点个数的常量为大于或等于无向图顶点个数的常量intcount=0;/计数变量计数变量count初值为初值为0;voidDFS(VertexNodeg,inti)EdgeNod
205、e*p;printf(“%4d”,gi.vertex);/输出顶点输出顶点i信息,即访问顶点信息,即访问顶点ivisitedi=1;/置顶点置顶点i为访问过标志为访问过标志p=gi.firstedge;/根据顶点根据顶点i的指针的指针firstedge查找其邻接表的第一个邻接边结点查找其邻接表的第一个邻接边结点while(p!=NULL)/当邻接边结点不为空时当邻接边结点不为空时if(!visitedp-adjvex)/如果邻接的这个边结点未被访问过如果邻接的这个边结点未被访问过DFS(g,p-adjvex);/对这个边结点进行深度优先搜索对这个边结点进行深度优先搜索p=p-next;/查找顶
206、点查找顶点i的下一个邻接边结点的下一个邻接边结点voidConnectEdge(VertexNodeg,intn)/深度优先搜索遍历用邻接表存储图,其中深度优先搜索遍历用邻接表存储图,其中g为顶点表,为顶点表,n为顶点个数为顶点个数inti;for(i=0;in;i+)visitedi=0;/访问标志置访问标志置0for(i=0;in;i+)/对对n个顶点的图查找未访问过的顶点并由该顶点开始遍历个顶点的图查找未访问过的顶点并由该顶点开始遍历if(!visitedi)/当当visitedi等于等于0时即顶点时即顶点i未访问过未访问过DFS(g,i);/从未访问过的顶点从未访问过的顶点i开始遍历开
207、始遍历count+;/访问过一个连通分量则访问过一个连通分量则count加加101:31:24本章主要内容回顾本章主要内容回顾: :l图的基本概念图的基本概念l图的存储结构图的存储结构l图的遍历图的遍历第第5章章图图01:31:24第章第章查找查找01:31:27 第六章第六章 查查找找查找是使用最广泛的操作之一,为了得查找是使用最广泛的操作之一,为了得到某些信息需经常进行查找。例如,学生在到某些信息需经常进行查找。例如,学生在学习中用英文字典查找单词,公路交通部门学习中用英文字典查找单词,公路交通部门每天花费大量时间查找各种指定牌号的车辆,每天花费大量时间查找各种指定牌号的车辆,游客查找某个
208、城市的景点、交通、街道和饮游客查找某个城市的景点、交通、街道和饮食情况,等等。特别是在互联网上查找大量食情况,等等。特别是在互联网上查找大量的所需信息,已经成为我们日常生活的一部的所需信息,已经成为我们日常生活的一部分。本章介绍查找的基本概念,以及实现顺分。本章介绍查找的基本概念,以及实现顺序查找、折半查找、分块查找、二叉排序树序查找、折半查找、分块查找、二叉排序树上的查找和哈希查找的算法。上的查找和哈希查找的算法。01:31:27本章内容提要本章内容提要: :l查找的基本概念查找的基本概念l静态查找表静态查找表l动态查找表动态查找表 第六章第六章 查查找找01:31:276.1 6.1 查找
209、的基本概念查找的基本概念查找的定义是:给定一个值查找的定义是:给定一个值k,在含有,在含有n个记录的表中找出关键字等于个记录的表中找出关键字等于k的记录。若的记录。若找到则查找成功,返回该记录的信息或该记找到则查找成功,返回该记录的信息或该记录在表中的位置;反之,查找失败,返回相录在表中的位置;反之,查找失败,返回相关的提示信息关的提示信息。01:31:27用于查找的表和文件统称为查找表,用于查找的表和文件统称为查找表,它是以集合为其逻辑结构、以查找为目的它是以集合为其逻辑结构、以查找为目的的数据结构。由于集合中的记录之间没有的数据结构。由于集合中的记录之间没有任何任何“关系关系”,所以查找表
210、的实现也不受,所以查找表的实现也不受“关系关系”约束,而是根据实际应用中对查约束,而是根据实际应用中对查找的具体要求来组织查找表,以便高效率找的具体要求来组织查找表,以便高效率的实现查找。的实现查找。01:31:27通常把查找过程中对关键字的比较次数作为衡量一个查找算法效率优劣的标准,也称为平均查找长度,通常用ASL表示。对一个含有n个记录的表,平均查找长度ASL定义为其中,n是记录的个数,pi是查找第i个记录的概率。若不特别声明,均认为对每个记录的查找概率是相等的,即(1in)。ci是查找第i个记录所需进行的比较次数。01:31:286.2静态查找表静态查找表l l 顺序查找顺序查找顺序查找
211、顺序查找l l 有序表的查找有序表的查找有序表的查找有序表的查找01:31:28l l 顺序查找顺序查找顺序查找顺序查找查找与数据的存储结构有关。我们以顺序表作为存储结构来实现顺序查找。定义顺序表类型如下:typedefstructKeyTypekey;/KeyType为关键字key的数据类型InfoTypeotherdata;/其他数据SeqList;在此,KeyType为虚拟的数据类型,在实际实现中可为int、char等类型;InfoType也是其他数据的虚拟类型,而otherdata则代表虚拟的其他数据,在实际实现中可根据需要设置为一个或多个真实的类型和真实的数据。01:31:28l l
212、 顺序查找顺序查找顺序查找顺序查找顺序查找又称线性查找,是最简单、最基本的查找方法。顺序查找的方法为:从表的一端开始,向另一端逐个按给定值k与表中记录的关键字key值进行比较。若找到与k值相同的记录关键字key值,则查找成功,并给出记录在表中的位置;若整个表扫描完仍未找到与k值相同的记录关键字key值,则查找失败,给出失败的信息。顺序查找的算法如下:intSeqSearch(SeqListR,intn,intk)/顺序查找inti=n;R0.key=k;/R0.key为查找不成功的监视哨while(Ri.key!=k)/由表尾向表头方向查找i-;returni;/查找成功返回找到的位置值否则返
213、回0值01:31:28l l 顺序查找顺序查找顺序查找顺序查找根据上述算法,对n个记录的顺序表采用由后向前比较方式。若给定值k与表中第i个元素的关键字(即Ri.key)值相等,即定位于第i个记录时,由图6.1可知,共对n-i+1个记录的关键字进行了比较,即ci=n-i+1,则顺序查找成功时的平均查找长度为图6.1由后向前比较到第i个记录时比较次数示意01:31:28l l 顺序查找顺序查找顺序查找顺序查找由于上述算法中的基本工作就是关键字比较,因此查找长度的量级就是查找算法的时间复杂度,即为O(n)。注意:如果采用的是由前向后进行查找,则注意:如果采用的是由前向后进行查找,则ci=i,故查找成
214、功时的平,故查找成功时的平均查找长度仍为均查找长度仍为,只不过要在,只不过要在while循环中增加判断条件循环中增加判断条件“i=n”。 顺序查找的缺点是当n很大时,平均查找长度较大、效率低;优点是对表中记录的存储没有过多的要求。01:31:286.2静态查找表静态查找表l l 顺序查找顺序查找顺序查找顺序查找l l 有序表的查找有序表的查找有序表的查找有序表的查找01:31:29l l 有序表的查找有序表的查找有序表的查找有序表的查找1.折半查找折半查找折半查找也称二分查找,它是一种效率较高的查找方法。折半查找要求查找表必须是顺序存储结构且表中记录按关键字有序排列(即为有序表)。折半查找的方
215、法是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功。否则,由这个中间记录位置把有序表划分为两个子表(不包括该中间记录),若给定值小于中间记录的关键字,则在中间记录左半区的子表去继续查找;若给定值大于中间记录的关键字,则在中间记录右半区的子表去继续查找。不断重复上述查找过程,直到查找成功,或者所查找的子表区域无记录而查找失败。01:31:29l l 有序表的查找有序表的查找有序表的查找有序表的查找折半查找算法如下:intBinSearch(SeqListR,intn,intk)intlow=0,high=n-1,mid;while(lowk) high=mid-
216、1;/继续在RlowRmid-1中查找else low=mid+1;/继续在Rmid+1Rhigh中查找return-1;/查找失败算法中,顺序表中的n个记录按关键字升序的方式存放于一维数组R0Rn-1中。01:31:29l l 有序表的查找有序表的查找有序表的查找有序表的查找我们以树高为k的满二叉树(即n=2k-1)来讨论折半查找的平均查找长度,在等概率(即)的条件下,折半查找成功的平均查找长度为01:31:29l l 有序表的查找有序表的查找有序表的查找有序表的查找由和,得当n很大时,ASLlog2(n+1)-1。因此,折半查找的时间效率为O(log2n)。由于log2(n+1)=k,故A
217、SLk-1,即折半查找成功的平均查找长度约为折半查找判定树的深度减1。可见,折半查找比顺序查找的平均查找效率高,但折半查找只适用于顺序存储结构。01:31:29l l 有序表的查找有序表的查找有序表的查找有序表的查找2.分块查找分块查找分块查找又称为索引顺序查找,它是将顺序查找与折半查找相结合的一种查找方法,在一定程度上解决了顺序查找速度慢以及折半查找要求数据元素有序排列的问题。在分块查找中,将表分为若干块且每一块中关键字不要求有序,但块与块之间的关键字是有序的,即后一块中所有记录的关键字均大于前一块中的最大关键字。此外,还为这些块建立了一个索引表且索引表项按关键字有序(为递增有序表),它存放
218、各块记录的起始存放位置以及该块所有记录中的最大关键字值。01:31:29l l 有序表的查找有序表的查找有序表的查找有序表的查找分块查找存储结构示意01:31:31l l 有序表的查找有序表的查找有序表的查找有序表的查找分块查找过程分两步进行:分块查找过程分两步进行:第一步,在索引表中确定待查记录在哪一块,因为索引表有序,故可采用折半查找或顺序查找;第二步,在已确定的块中进行顺序查找。由于分块查找实际上是两次查找过程,因此整个分块的平均查找长度应该是两次查找的平均查找长度(索引查找与块内查找)之和,也即分块查找的平均查找长度为查找索引表的平均查找长度Lb与块内查找的平均查找长度Ls之和:01:
219、31:31l l 有序表的查找有序表的查找有序表的查找有序表的查找前面已经介绍了三种静态查找表:从表的结构上看从表的结构上看,顺序查找对表有序、无序均适用,折半查找仅适用于有序表,而分块查找则要求表分块后“块间有序,块内可以无序”。从表的存储结构来看从表的存储结构来看,顺序查找和分块查找对于表的顺序和链式存储结构均适用,而折半查找只适用于顺序存储结构。就平均查找长度而言,折半查找最小,分块查找次之,而顺序查找最大。01:31:316.3动态查找表动态查找表l l 二叉排序树查找二叉排序树查找二叉排序树查找二叉排序树查找l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找01
220、:31:31 二叉排序树查找二叉排序树查找二叉排序树查找二叉排序树查找概念概念二叉排序树可以看作是一个有序表,即在二叉排序树中左子树上所有结点的关键字均小于根结点的关键字,而右子树所有结点的关键字均大于或等于根结点的关键字,因此二叉排序树上的查找与折半查找类似。01:31:31l l 二叉排序树查找二叉排序树查找二叉排序树查找二叉排序树查找查找过程查找过程二叉排序树的查找过程是:(1)若二叉排序树非空,则将给定值k与根结点关键字值比较,若相等,则查找成功;(2)若不等,则当k值小于根结点关键字时到根的左子树去继续查找,否则到根的右子树去继续查找。二叉排序树的这种查找过程显然是一个递归过程。01
221、:31:31l l 二叉排序树查找二叉排序树查找二叉排序树查找二叉排序树查找二叉排序树查找算法二叉排序树查找算法BSTree*BSTSearch(BSTree*t,KeyTypek)/二叉排序树查找/在指针t所指的二叉排序树中查找关键字值为k的结点while(t!=NULL)if(k=t-key)returnt;/k等于根结点*t的关键字则查找成功,返回指针t值elseif(kkey)t=t-lchild;/k小于根结点*t的关键字值则到t的左子树查找elset=t-rchild;/k大于根结点*t的关键字值则到t的右子树查找returnNULL;/查找失败返回空指针值01:31:32l l
222、二叉排序树查找二叉排序树查找二叉排序树查找二叉排序树查找在二叉排序树上进行查找,若查找成功,则恰好走了一条从根结点到该结点的路径,即和给定值比较的关键字个数等于该结点所在的层数(或路径长度加1);若查找不成功,则是从根结点出发走了一条从根结点到某叶结点的左、右指针为止的路径,因为只有当指针为空时才知道查找失败。因此,查找成功时,二叉排序树与给定值比较的关键字个数不超过二叉排序树的深度。01:31:32l l 二叉排序树查找二叉排序树查找二叉排序树查找二叉排序树查找【例6.2】一棵二叉排序树如图6.5所示,求查找成功的ASL和查找失败的ASL。【解】查找成功时是从根结点出发走了一条从根结点到待查
223、结点的路径;若查找不成功,则是从根结点出发走了一条从根结点到某叶结点的路径,当到达叶结点时,还要继续沿叶结点的左指针或右指针再探查一次。因此,对图6.5所示的二叉排序树查找成功的ASL为树中各结点的层数之和除以树的结点个数n见图6.6(a);而查找失败时的ASL为图6.6(b)中空白结点(每个空白结点代表一个空指针)的层数之和除以空白结点的个数m。01:31:32l l 二叉排序树查找二叉排序树查找二叉排序树查找二叉排序树查找图6.5二叉排序树示意图6.6查找成功和查找失败的二叉排序树示意01:31:326.3动态查找表动态查找表l l 二叉排序树查找二叉排序树查找二叉排序树查找二叉排序树查找
224、l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找01:31:32l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找基本思想基本思想哈希表查找方法的基本思想是:在记录的关键字(记为key)和记录的存储位置(记为address)之间找出关系函数f,使得每个关键字能够被映射到一个存储位置上,即address=f(key)。当存储一个记录时,按照记录的关键字key通过函数f计算出它的存储位置address,并将该记录存入这个位置。这样,当查找这个记录时,就可根据给定值key以及函数f,通过f(key)计算求得该记录的存储位置,即可直接由该存储位置访问这个记
225、录了。01:31:32l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找上述方法中,函数f被称为哈希函数或散列函数,通常记为Hash(key),由哈希函数及关键字值计算出来的哈希函数值(即存储地址)称为哈希地址,通过构造哈希函数的过程得到一张关键字与哈希地址之间的关系表则称为哈希表或散列表。因此,哈希表可以用一维数组实现,数组元素用于存储包含关键字的记录;数组元素的下标就是该记录的哈希地址,当需要查找某关键字时,只要它在哈希表中就可以通过哈希函数确定它在表中(数组中)的存储位置。01:31:33 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找【例如】有一
226、个由整数组成的关键字集合序列为27,11,3,56,15,65,33,要求将该关键字序列存储到下标为06的一维数组中,则选取Hash(key)=key%7即可构造出如表6.1所示的哈希表。01:31:33l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找1.哈希函数的构造方法哈希函数的构造方法1)直接定址法Hash(key)=akey+b(a,b为常数)即取关键字key的某个线性函数值作为哈希地址。这类函数计算简单且一一对应,不会产生冲突。但由于各关键字在其集合中的分布是离散的,所以计算出来的哈希地址也是离散的,这常常造成存储空间的浪费。只能通过调整a、b值使得浪费尽可能
227、减小。实际问题中已很少采用这类哈希函数。01:31:33l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找【例如】关键字集合序列为50,100,200,350,400,500,选取哈希函数为Hash(key)=key/50(a=50,b=0),则哈希表存储如表6.2所示。01:31:34l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找1.哈希函数的构造方法哈希函数的构造方法2)除留余数法Hash(key)=key%p(p为整数)即取关键字key除以p后的余数作为哈希地址,该方法用求余运算符“%”实现。使用除留余数法的关键是选取合适的p,它决定了所生
228、成哈希表的优劣。若哈希表表长为m,则要求pm且接近m或等于m。一般选取的p为质数,以便尽可能减少冲突的发生。01:31:34l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找【例如】关键字集合序列为8,13,28,11,23,选取的质数p=7,哈希函数为Hash(key)=key%7,则哈希表存储如表6.3所示。01:31:34l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找1.哈希函数的构造方法哈希函数的构造方法3)数字分析法如果所有关键字都是以d为基(即进制)的数,各关键字的位数又较多,且事先知道所有关键字在各位的分布情况,则可通过对这些关键字
229、的分析,选取其中几个数字分布较为均匀的位来构造哈希函数。该方法使用的前提是必须事先知道关键字的集合。01:31:34l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找【例如】已知以10为基的各关键字如表6.4所示,并假定哈希表的表长为1000,则可选取3位数字作为哈希地址。分析表6.4的各关键字可知,关键字的第、及位上的数字分布是不均匀的,故此只考虑、位上的数字,这样就得出最后一列的哈希地址,这些哈希地址分布比较均匀因而造成冲突的概率也就低。01:31:35l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找01:31:35l l 哈希表构造与查找哈希
230、表构造与查找哈希表构造与查找哈希表构造与查找1.哈希函数的构造方法哈希函数的构造方法4)平方取中法如果事先无法知道所有关键字在各权值位上的分布情况,就不能利用数字分析法来求哈希函数。这时可以采用平方取中法来构造哈希函数。采用该方法构造哈希函数的原则是:先计算关键字值的平方,然后有目的地选取平方结果中的中间若干位来作为哈希地址。01:31:36l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找【例如】关键字集合序列为128,328,228,528,由于各关键字的后两位均是28,故数字在各位上的分布是不均匀的,所以采用平方取中法,平方后的结果及所求的哈希地址如表6.5所示,该
231、哈希地址是对关键字平方后由右往左数的第5、4、3位,因为这3位是均匀分布的。01:31:36l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找1.哈希函数的构造方法哈希函数的构造方法5)折叠法当关键字的位数过长时,采用平方取中法就会花费过多的计算时间。在这种情况下可采用折叠法,即根据哈希表地址空间的大小,将关键字分割成相等的几个部分(最后一部分位数可能短些),然后将这几部分进行叠加并舍弃最高进位,且叠加的结果就作为该关键字的哈希地址。01:31:36l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找【例如】一个关键字为1357246890,设哈希表长
232、度为10000,则可将关键字由低向高位分割成3部分,每一部分占4位(最高部分占2位),然后分别进行移位叠加和折叠叠加,其计算过程和结果如图6.7所示。图6.7用折叠法求哈希函数01:31:37l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找2.哈希表处理冲突的方法哈希表处理冲突的方法在一般情况下,哈希函数是一个从较大的关键字值空间到较小的哈希表存储空间的压缩映像函数,这就不可避免地会发生冲突。因此,如何处理冲突是哈希方法的另一个关键问题。我们仅对采用一维数组存储的散列表进行讨论。01:31:37l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找2.
233、哈希表处理冲突的方法哈希表处理冲突的方法基本思想基本思想对表长为m的散列表,在需要时为关键字key生成一个散列地址序列d0,d1,dm-1;其中,d0=Hash(key)是key的散列地址,但所有的di(0im)是key的后继散列地址。当向散列表中插入关键字为key的记录时,若存储位置d0已被具有其他关键字的记录占用,则按d1,d2,dm-1的序列依次探测,并将找到的第一个空闲地址作为关键字key的记录存放位置;若key的所有后继散列地址都被占用,则表明该散列表已满(溢出)。01:31:37l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找2.哈希表处理冲突的方法哈希表处
234、理冲突的方法常见的构造方法常见的构造方法1)开放定址法Hi=(Hash(key)+di)%m(1im)其中,Hash(key)为哈希函数,m为散列表的长度;di为增量序列,它可以有三种取法:di=1,2,m-1,称为线性探测法;di=12,-12,22,-22,q2,-q2,且qm/2,称为二次探测法;di为伪随机序列,称为随机探测法。01:31:37l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找2.哈希表处理冲突的方法哈希表处理冲突的方法【例6.3】已知哈希函数为Hash(key)=key%11,散列表情况如表6.6所示。现需将42插入该表,请给出在线性探测方式下插
235、入42的过程说明。01:31:38l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找2.哈希表处理冲突的方法哈希表处理冲突的方法【解】当插入42时,因Hash(42)=42%11=9,而地址9已被20占用,故向后探测,即Hash(42)=(Hash(42)+1)%11=(9+1)%11=10而地址10已被32占用,所以继续向后探测,即Hash(42)=(Hash(42)+2)%11=(9+2)%11=0而地址0又被22占用,因此继续向后探测,直到地址6为空时才将42放入地址6中。注意:注意:在探测过程中,关键字42和20是同义词,因此它们必然发生冲突;但42与32不是同义
236、词,本来它们之间是不会发生冲突的,但由于关键字42初始的散列地址被20占用,故42只能探测后继的存储地址,这样42就与32发生了冲突。这种非同义词为争夺同一存储位置而发生冲突的现象就是我们所说的“堆积”。01:31:38l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找2.哈希表处理冲突的方法哈希表处理冲突的方法线性探测法思路清晰且算法简单,但也存在着以下缺点。线性探测法思路清晰且算法简单,但也存在着以下缺点。(1)溢出处理需另编程序,一般可另设一个溢出表专门用来存放在散列表中存放不下的记录。(2)按线性探测法建立起来的散列表是不能进行删除操作的,若进行删除操作,则必须对
237、该存放位置进行特殊标记;否则,如果简单地在散列表上直接删除一个记录,就会因该位置为空而造成线性探测序列的中断,从而无法再查找与被删除记录具有相同哈希函数值的后继记录。如对表6.6来说,当删去表中的关键字20后,我们就无法查找刚放入表中的关键字42了。(3)线性探测法很容易产生堆积现象。当哈希函数不能把关键字很均匀地散列到散列表中时尤其容易产生堆积现象。产生堆积现象后增加了探测次数,降低了查找效率。如例6.3中插入42的过程即是如此。01:31:38l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找2.哈希表处理冲突的方法哈希表处理冲突的方法2)再散列(哈希)法再散列法的思
238、想很简单,即在发生冲突时用不同的哈希函数再求得新的散列地址,直到不发生冲突为止,即散列地址序列d0,d1,di的计算如下:di=Hashi(key)(i=1,2,)其中,Hashi(key)表示不同的哈希函数。01:31:38l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找2.哈希表处理冲突的方法哈希表处理冲突的方法【例6.4】已知Hash1(key)=key%13,Hash2(key)=key%11,散列表情况如表6.7所示。现需将关键字42插入该表,请给出在再散列法方式下插入42的过程说明。01:31:39l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希
239、表构造与查找2.哈希表处理冲突的方法哈希表处理冲突的方法【解】当插入42时,因Hash1(42)=42%13=3,而地址3已被85占用,故用Hash2继续探测;Hash2(42)=42%11=9,而地址9为空,故将42放入地址9。01:31:39l l 哈希表构造与查找哈希表构造与查找哈希表构造与查找哈希表构造与查找3.哈希表的查找哈希表的查找哈希表的查找过程与构造哈希表的过程基本一致,即给定关键字key值并根据构造哈希表时设定的哈希函数求得其存储地址。若哈希表中此存储地址中没有记录,则查找失败;否则将该地址中的关键字与key比较,若相等则查找成功,反之,则根据构造哈希表时设定的解决冲突方法寻
240、找下一个哈希地址,直到查找成功或查找到的哈希地址中无记录(即查找失败)为止。01:31:39第章第章排序排序01:31:42 第七章第七章 排排序序排序的主要目的是方便查找,它是计算机程序设计中的一种重要操作。本章主要介绍插入排序、交换排序、选择排序和归并排序。01:31:42本章内容提要本章内容提要: :l基本概念基本概念l插入排序插入排序l交换排序交换排序l选择排序选择排序l归并排序归并排序 第七章第七章 排排序序01:31:437.1 7.1 基本概念基本概念排序排序是按照记录集合中每个记录的关键字之间所存在的递增或递减关系,将该集合中的记录次序重新排列。如果待排序的记录序列中Ri和Rj
241、的关键字相同且在排序之前Ri的位置领先于Rj,并且在排序之后Ri的位置仍然领先于Rj,则为稳定排序;反之为不稳定排序(通常是找出实例来验证这种不稳定关系)。01:31:43简单评判一种排序方法的好坏是困难的,这是因简单评判一种排序方法的好坏是困难的,这是因为在不同情况下排序算法的好坏是不一样的。评价排为在不同情况下排序算法的好坏是不一样的。评价排序方法好坏的标准主要有两条:一是算法执行所需的序方法好坏的标准主要有两条:一是算法执行所需的时间;二是算法执行中所需的辅助空间。由于排序是时间;二是算法执行中所需的辅助空间。由于排序是经常使用的一种运算,故算法执行所需的时间是衡量经常使用的一种运算,故
242、算法执行所需的时间是衡量排序方法好坏的重要标志。排序方法好坏的重要标志。01:31:437.2 7.2 插入排序插入排序所谓插入排序所谓插入排序,就是把一个记录按其关键字的大小插入一个有序的记录序列中,插入后该序列仍然有序。基本思想:基本思想:将记录集合分为有序和无序两个序列。从无序序列中任取一个记录,然后根据该记录的关键字大小在有序序列中查找一个合适的位置,使得该记录放入这个位置后,这个有序序列仍然保持有序。每插入一个记录就称为一趟插入排序,经过多趟插入排序,使得无序序列中的记录全部插入有序序列中,则排序完成。01:31:43直接插入排序直接插入排序是一种最简单的排序方法,其做法是:在插入第
243、i个记录Ri时,R1,R2,Ri-1已经排好序,这时将待插入记录Ri的关键字Ri.key由后向前依次与关键字Ri-1.key、Ri-2.key、R1.key进行比较,从而找到Ri应该插入的位置j,并且由后向前依次将Ri-1,Ri-2,Rj+1,Rj顺序后移一个位置(这样移动可保证每个被移动的记录信息不被破坏),然后将Ri放入到刚刚让出其位置的原Rj处,这种插入使得前i个位置上的所有记录R1,R2,Ri继续保持有序。01:31:437.3交换排序交换排序l l 冒泡排序冒泡排序冒泡排序冒泡排序l l 快速排序快速排序快速排序快速排序01:31:43l l 冒泡排序冒泡排序冒泡排序冒泡排序冒泡排序
244、冒泡排序是交换排序的一种,交换排序是通过交换记录在表中的位置来实现排序的。交换排序的思想是:两两比较待排记录的关键字,一旦发现两个记录的次序与排序要求相逆则交换这两个记录的位置,直到表中没有逆序的记录存在为止。01:31:43l l 冒泡排序冒泡排序冒泡排序冒泡排序冒泡排序排序过程冒泡排序排序过程:第一趟从第1个记录R1开始到第n个记录Rn为止,对n-1对相邻的两个记录进行两两比较,若与排序要求相逆则交换两者的位置,这样,经过一趟的比较、交换后,具有最大关键值的记录就被交换到Rn位置。第二趟从第1个记录R1开始到n-1个记录Rn-1为止重复上述的比较与交换,这样,具有次大关键字的记录就被交换到
245、Rn-1位置。如此重复,在经过n-1趟这样的比较和交换后,R1Rn这n个记录已按关键字有序。这个排序过程就像一个个往上(往右)冒泡的气泡,最轻的气泡先冒上来(到达Rn位置),较重的气泡后冒上来。因此,形象地称之为冒泡排序。01:31:43l l 冒泡排序冒泡排序冒泡排序冒泡排序图7.2冒泡排序过程示意01:31:44l l 冒泡排序冒泡排序冒泡排序冒泡排序 从空间效率上看,冒泡排序仅用了一个辅助单元,从时间效率上看,最好的情况是待排序序列已经全部有序。这样冒泡排序在第一趟排序过程中就没有交换发生,所以一趟之后即排序结束,也即,只在第一趟中进行了n-1次比较。最坏情况是待排序记录按逆序排序,共需
246、进行n-1趟排序,且第i趟需进行n-i次比较。因此因此,冒泡排序的时间复杂度为O(n2)。交换记录的次数与比较记录的次数相同,最坏的情况也是发生在待排序记录按逆序排列时。01:31:447.3交换排序交换排序l l 冒泡排序冒泡排序冒泡排序冒泡排序l l 快速排序快速排序快速排序快速排序01:31:44l l 快速排序快速排序快速排序快速排序快速排序快速排序是基于交换思想对冒泡排序的一种改进的交换排序方法,又称分区交换排序。基本思想基本思想:在待排序记录序列中,任取其中一个记录(通常是第一个记录)并以该记录的关键字作为基准,经过一趟交换之后,所有关键字比它小的记录都交换到它的左边,而所有关键字
247、比它大的记录都交换到它的右边(注意,只是交换并不排序),此时,该基准记录在有序序列中的最终位置就已确定。然后,再分别对划分到基准记录左右两部分区间的记录序列重复上述过程,直到每一部分最终划分为一个记录时为止,即最终确定了所有记录各自在有序序列中应该放置的位置,这也意味着排序的完成。01:31:44l l 快速排序快速排序快速排序快速排序快速排序的递归过程可用一棵二叉树来描述,图7.4即为图7.3中待排序序列在快速排序递归调用中不断划分为左右子树的示意。图7.3一趟快速排序示意图7.4用二叉树描述图7.3快速排序01:31:44l l 快速排序快速排序快速排序快速排序从空间效率看从空间效率看,快
248、速排序是递归的,每层递归调用时的指针和参数都要用栈来存放。由于递归调用的层数与上述二叉树示意的深度一致,故存储开销在理想的情况下为O(log2n)。在最坏情况下,即二叉树是一个单支树时空间复杂度为O(n)。从时间效率看从时间效率看,对于n个记录的待排序序列,一次划分需要约n次关键字的比较,时间效率为O(n)。若设T(n)为对n个记录进行快速排序所需的时间,则理想情况下每次划分正好将n个记录分为等长的子序列,并且每次划分所需的比较次数为n-1,则T(n)n+2T(n/2)n+2(n/2+2T(n/4)=2n+4T(n/4)2n+4(n/4+T(n/8)=3n+8T(n/8)nlog2n+nT(1
249、)=O(nlog2n)01:31:447.4 7.4 选择排序选择排序基本思想基本思想:每一趟从待排序记录中选出关键字最小的记录,并顺序放在已排好序记录序列的最后,直至全部记录排序完成为止。由于选择排序算法每一趟总是从无序记录中挑选关键字最小的记录,所以适合从大量记录中选择一部分记录的场合,如从10000个记录中选出关键字最小(或最大)的前10个记录,就适宜采用选择排序。01:31:44直接选择排序(又称简单选择排序)是选择排序中的一种。直接选择排序(又称简单选择排序)是选择排序中的一种。实现方法实现方法:第一趟从n个无序记录中找出关键字最小的记录与第1个记录交换(此时第1个记录为有序);第二
250、趟从第2个记录开始的n-1个无序记录中再选出关键字最小的记录与第2个记录交换(此时第1和第2个记录为有序);如此下去,第i趟则从第i个记录开始的n-i+1个无序记录中选出关键字最小的记录与第i个记录交换(此时前i个记录已有序),这样n-1趟后前n-1个记录已有序,无序记录只剩一个即第n个记录,因关键字小的前n-1个记录已进入有序序列,第n个记录必为关键字最大的记录,所以无需交换,即n个记录已全部有序。01:31:45直接选择排序算法直接选择排序算法voidSelectSort(RecordTypeR,intn)/对R1Rn这n个记录进行选择排序inti,j,k;for(i=1;in;i+)/进
251、行n-1趟选择k=i;/假设关键字最小的记录为第i个记录for(j=i+1;j=n;j+)/从第i个记录开始的n-i+1个无序记录中选出关键字最小的记录if(Rj.keyRk.key)k=j;/保存最小关键字记录的存放位置if(i!=k)/将找到关键字最小的记录与第i个记录交换R0=Rk;Rk=Ri;Ri=R0;。01:31:45直接选择排序算法直接选择排序算法voidSelectSort(RecordTypeR,intn)/对R1Rn这n个记录进行选择排序inti,j,k;for(i=1;in;i+)/进行n-1趟选择k=i;/假设关键字最小的记录为第i个记录for(j=i+1;j=n;j+
252、)/从第i个记录开始的n-i+1个无序记录中选出关键字最小的记录if(Rj.keyRk.key)k=j;/保存最小关键字记录的存放位置if(i!=k)/将找到关键字最小的记录与第i个记录交换R0=Rk;Rk=Ri;Ri=R0;。01:31:45由图7.5可知,直接选择排序是一种不稳定的排序方法。图7.5直接选择排序过程示意01:31:457.5 7.5 归并排序归并排序基本思想基本思想:只有一个记录的表总是有序的,故初始时将n个待排序记录看成是n个有序表(每个有序表的长度为1,即仅有一个记录),然后开始第1趟两路归并,即将第1个表同第2个表归并,第3个表同第4个表归并若最后仅剩一个表,则不参加
253、归并,这样得到的个长度为2(最后一个表的长度可能为1)的有序表。然后进行第2趟归并,即将第1趟得到的有序表继续进行两两归并,从而得到个长度为4(最后一个表的长度可能小于4)的有序表,以此类推,直到第趟归并就得到了长度为n的有序表。01:31:45二路归并递归算法二路归并递归算法voidMerge(RecordTypeR,RecordTypeR1,ints,intm,intt)/一趟二路归并/将有序表RsRm及Rm+1Rt合并为一个有序表R1sR1tinti,j,k;i=s;j=m+1;k=s;while(i=m&j=t)/将两个有序表的记录按关键字大小收集到表R1中使表R1也为有序表if(Ri
254、.key=Rj.key)R1k+=Ri+;elseR1k+=Rj+;while(i=m)/将第一个有序表未收集完的记录收集到有序表R1R1k+=Ri+;while(j=t)/将第二个有序表未收集完的记录收集到有序表R1R1k+=Rj+;01:31:45voidMSort(RecordTypeR,RecordTypeR1,ints,intt)/递归方式的归并排序/将无序表RsRt归并为一个有序表R1sR1tintm;RecordTypeR2MAXSIZE;if(s=t)R1s=Rs;elsem=(s+t)/2;/找到无序表RsRt的中间位置MSort(R,R2,s,m);/递归地将无序表的前半个
255、表RsRm归并为有序表R2sR2mMSort(R,R2,m+1,t);/递归地将无序表后半个表Rm+1Rt归并为有序表R2m+1R2tMerge(R2,R1,s,m,t);/*进行一趟将有序表R2sR2m和R2m+1R2t归并到有序表R1sR1t的操作*/01:31:45二路归并递归算法实现过程二路归并递归算法实现过程像一棵二叉树一样,首先将无序表R1Rn通过函数MSort中的两条MSort语句对半分为第二层的两个部分;由于是递归调用,在没有执行将两个有序子表归并为一个有序子表的函数调用语句Merge之前,又递归调用MSort函数再次将第二层的每一部分继续对半拆分。算法递归调用中将表一分为二的
256、示意见图7.6。图7.6二路归并排序递归调用中对半拆分示意01:31:46在二路归并排序的递归过程中在二路归并排序的递归过程中,当一分为二到一个记录(可看成叶结点)时,一分为二过程结束,而合二为一的排序过程开始,故合二为一的过程是由叶结点开始逐层返回并进行两两归并,一直持续到根结点为止,即最终归并为一个有n个记录的有序表。这个合二为一的过程恰好是前面一分为二的逆过程。图7.7给出了二路归并排序递归过程中合二为一的示意,方括号“”表示其间的记录是一个有序表。图7.7二路归并示意01:31:46第第8 8章章软件工程技术软件工程技术01:31:49 第第8章章软件工程技术软件工程技术软件工程是应用
257、计算机科学理论和技术以及工程管理的原则和方法,按预软件工程是应用计算机科学理论和技术以及工程管理的原则和方法,按预算和进度实现满足用户要求的软件产品的定义、开发、发布和维护的工程,算和进度实现满足用户要求的软件产品的定义、开发、发布和维护的工程,或以之为研究对象的学科。或以之为研究对象的学科。软件工程是一门新兴学科,主要研究软件的技术方法、工具和管理等方面软件工程是一门新兴学科,主要研究软件的技术方法、工具和管理等方面内容。为满足软件开发需求,不断有新的软件技术方法和工具问世。内容。为满足软件开发需求,不断有新的软件技术方法和工具问世。01:31:49本章主要内容本章主要内容: :软件工程基本
258、知识软件工程基本知识软件开发模型软件开发模型软件生命周期软件生命周期软件工程技术发展趋势软件工程技术发展趋势第第8章章软件工程技术软件工程技术01:31:498.1 软件工程基本知识软件工程基本知识l l软件软件软件软件l l软件危机软件危机软件危机软件危机l l软件工程软件工程软件工程软件工程01:31:49l l 软件软件软件软件软件是计算机系统中与硬件相互依存的另一软件是计算机系统中与硬件相互依存的另一部分,提供了人与计算机交互的接口界面。部分,提供了人与计算机交互的接口界面。l程序程序:按事先设计的功能和性能要求执行的指令序列l数据数据:使程序能够正确运行的数据结构l文档文档:描述与程
259、序开发、维护和使用有关图文的资料软件软件 = = 程序程序 + + 数据数据 + + 文档文档01:31:508.1 软件工程基本知识软件工程基本知识l l软件软件软件软件l l软件危机软件危机软件危机软件危机l l软件工程软件工程软件工程软件工程01:31:50l l 软件危机软件危机软件危机软件危机软件危机是指软件开发和维护过程中遇到的软件危机是指软件开发和维护过程中遇到的一系列严重问题一系列严重问题:l满足日益增长的应用需求l维护数量不断膨胀的已有软件软件危机的表现:软件危机的表现:(1)软件开发成本和进度难以估计(2)用户对软件系统的功能要求难以满足(3)软件产品的质量无法保证(4)软
260、件缺少适当的文档资料,难以维护(5)软件开发速度跟不上社会需求的增长01:31:50l l 软件危机软件危机软件危机软件危机软件危机产生的原因:软件危机产生的原因:l软件本身的特点:软件是逻辑部件,在运行和使用期间,维护复杂。软件规模庞大,开发过程不仅需要技术支持,更需要有效地管理。l软件开发和维护的方法不正确:早期个体化的开发,忽视需求分析,轻视维护,忽略文档,导致软件开发成本高,修改代价大。为了解决软件危机,软件工程从技术和管理两个方面研究如何更好地开发和维护计算机软件。01:31:508.1 软件工程基本知识软件工程基本知识l l软件软件软件软件l l软件危机软件危机软件危机软件危机l
261、l软件工程软件工程软件工程软件工程01:31:50l l 软件工程软件工程软件工程软件工程为了解决软件危机,软件工程从技术和管理两个方面研究如何更好地开发和维护计算机软件。软件工程:软件工程:是一门指导计算机软件开发和维护的工程学科,采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好方法结合起来。软件工程的目标:软件工程的目标:按预期的进度和经费完成软件生产计划;提高软件的生产率和可靠性。三要素三要素:方法、工具和过程:方法、工具和过程01:31:50l l 软件工程软件工程软件工程软件工程软件工程遵循的基本原则:软件工程遵循的基本原则:用
262、分阶段的生存周期计划进行严格管理坚持进行阶段评审实行严格的产品控制采用结构分析与结构设计技术清楚地审查结果软件开发小组的人员应该少而精不断改进软件工程实践01:31:51本章主要内容本章主要内容: :l软件工程基本知识软件工程基本知识l软件开发模型软件开发模型l软件生命周期软件生命周期l软件工程技术发展趋势软件工程技术发展趋势第第8章章软件工程技术软件工程技术01:31:518.2 软件开发模型软件开发模型l l瀑布模型瀑布模型瀑布模型瀑布模型l l增量模型增量模型增量模型增量模型l l螺旋模型螺旋模型螺旋模型螺旋模型l l快速原型模型快速原型模型快速原型模型快速原型模型l l喷泉模型喷泉模型
263、喷泉模型喷泉模型l l软件生存周期及模型软件生存周期及模型软件生存周期及模型软件生存周期及模型01:31:51 软件生存周期及模型软件生存周期及模型软件生存周期及模型软件生存周期及模型软件生存周期:软件生存周期:软件从定义、开发、使用、维护,直至最终被废弃的漫长时期软件开发模型:软件开发模型:整个软件生存周期中系统开发、运行、维护所实施的全部工作和任务的结构框架01:31:518.2 软件开发模型软件开发模型l l瀑布模型瀑布模型瀑布模型瀑布模型l l增量模型增量模型增量模型增量模型l l螺旋模型螺旋模型螺旋模型螺旋模型l l快速原型模型快速原型模型快速原型模型快速原型模型l l喷泉模型喷泉模
264、型喷泉模型喷泉模型l l软件生存周期及模型软件生存周期及模型软件生存周期及模型软件生存周期及模型01:31:51l l 瀑布模型瀑布模型瀑布模型瀑布模型瀑布模型(瀑布模型(waterfall modelwaterfall model):):又称生存周期模型,是软件工程的基础模型自顶向下从抽象到具体:自顶向下从抽象到具体:(1)阶段间具有顺序性和依赖性(2)推迟实现原则(3)质量保证机制缺点:缺点:缺乏灵活性01:31:528.2 软件开发模型软件开发模型l l瀑布模型瀑布模型瀑布模型瀑布模型l l增量模型增量模型增量模型增量模型l l螺旋模型螺旋模型螺旋模型螺旋模型l l快速原型模型快速原型模
265、型快速原型模型快速原型模型l l喷泉模型喷泉模型喷泉模型喷泉模型l l软件生存周期及模型软件生存周期及模型软件生存周期及模型软件生存周期及模型01:31:52l l 快速原型模型快速原型模型快速原型模型快速原型模型基本思想:基本思想:根据用户实际试用原型系统后提出的修改意见快速修改原型样品,经过反复试用和改进,最终建立起符合用户需求的新系统特点:特点:l软件开发者和用户共同定义软件的功能,减少了设计中的错误和开发风险,提高了系统的正确性和用户满意度l缩短了软件开发周期,降低了成本不足:不足:只是一个临时系统,没有考虑到整体的质量以及日后的可维护性等问题01:31:538.2 软件开发模型软件开
266、发模型l l瀑布模型瀑布模型瀑布模型瀑布模型l l增量模型增量模型增量模型增量模型l l螺旋模型螺旋模型螺旋模型螺旋模型l l快速原型模型快速原型模型快速原型模型快速原型模型l l喷泉模型喷泉模型喷泉模型喷泉模型l l软件生存周期及模型软件生存周期及模型软件生存周期及模型软件生存周期及模型01:31:53 增量模型增量模型增量模型增量模型又称为演化模型:又称为演化模型:在增量模型中,软件被作为一系列的增量构件来设计、实现、集成和测试,每一个构件是由多种相互作用的模块所形成的,并提供特定功能的代码片段构成优点:优点:l软件开发可以较好地适应变化,客户可以不断地看到所开发的软件,从而降低开发风险不
267、足:不足:l软件要具备开放式的体系结构l容易使软件过程控制失去整体性01:31:548.2 软件开发模型软件开发模型l l瀑布模型瀑布模型瀑布模型瀑布模型l l增量模型增量模型增量模型增量模型l l螺旋模型螺旋模型螺旋模型螺旋模型l l快速原型模型快速原型模型快速原型模型快速原型模型l l喷泉模型喷泉模型喷泉模型喷泉模型l l软件生存周期及模型软件生存周期及模型软件生存周期及模型软件生存周期及模型01:31:54l l 螺旋模型螺旋模型螺旋模型螺旋模型螺旋模型:螺旋模型:是一种风险驱动模型。它将瀑布模型与原型模型结合起来,加入了风险分析,从而弥补了前两种模型的不足,适合于大型软件的开发不足:不
268、足:l很难让用户确信其演化方法是可以控制的l要求具有风险评价的专门技术01:31:558.2 软件开发模型软件开发模型l l瀑布模型瀑布模型瀑布模型瀑布模型l l增量模型增量模型增量模型增量模型l l螺旋模型螺旋模型螺旋模型螺旋模型l l快速原型模型快速原型模型快速原型模型快速原型模型l l喷泉模型喷泉模型喷泉模型喷泉模型l l软件生存周期及模型软件生存周期及模型软件生存周期及模型软件生存周期及模型01:31:55l l 喷泉模型喷泉模型喷泉模型喷泉模型喷泉模型:喷泉模型:是一种以用户需求为动力,以对象为驱动的模型,主要用于采用对象技术的软件开发项目优点:优点:l该模型的各个阶段没有明显的界限
269、,开发人员可以同步进行开发。这样可以提高软件项目开发效率,节省开发时间,适应于面向对象的软件开发过程01:31:55本章主要内容本章主要内容: :l软件工程基本知识软件工程基本知识l软件开发模型软件开发模型l软件生命周期软件生命周期l软件工程技术发展趋势软件工程技术发展趋势第第8章章软件工程技术软件工程技术01:31:55l l 软件生命周期软件生命周期软件生命周期软件生命周期软件生命周期(软件生命周期(software life cyclesoftware life cycle):):由软件定义、软件开发和软件维护三个时期组成,每个时期又进一步划分成若干个阶段,然后逐步完成各个阶段的任务。0
270、1:31:568.3 软件生命周期软件生命周期l l软件设计软件设计软件设计软件设计l l软件测试软件测试软件测试软件测试l l软件维护软件维护软件维护软件维护l l软件编码软件编码软件编码软件编码l l软件定义软件定义软件定义软件定义01:31:56l l 软件定义软件定义软件定义软件定义软件定义阶段软件定义阶段的任务是确定软件开发工程必须完成的总目标,即根据用户具体需求解决系统“做什么”的问题包括三个部分:包括三个部分:l问题定义问题定义要解决的问题是什么?l可行性研究可行性研究问题定义阶段所确定的问题是否可解?价值如何?包括技术可行性、经济可行性和操作可行性l需求分析需求分析目标系统必须
271、做什么?01:31:56l l 软件定义结构化分析方法软件定义结构化分析方法软件定义结构化分析方法软件定义结构化分析方法结构化分析方法结构化分析方法是面向数据流进行需求分析的方法,使用数据流图和数据字典来构成系统的逻辑模型,适合于数据处理类型的软件定义数据流图(数据流图(data flow diagramdata flow diagram,DFDDFD)l从数据传递和加工的角度,以图形化的方式刻画数据流从输入到输出的移动变换过程,其中没有任何具体的物理元素,只是描绘信息在系统中流动和处理的情况l逻辑系统的图形表示,是方便通信的工具l只需考虑系统必须完成的基本逻辑功能,完全不需要考虑具体的物理实
272、现,它是软件设计很好的出发点01:31:56l l 软件定义数据流图软件定义数据流图软件定义数据流图软件定义数据流图数据流图四种基本符号:数据流图四种基本符号:l数据的源点/终点l加工l数据流l数据存储01:31:56l l 软件定义数据字典软件定义数据字典软件定义数据字典软件定义数据字典数据字典(数据字典(data dictionarydata dictionary,DDDD)任务是对数据流图中出现的所有被命名的图形元素作为一个词条加以定义和解释,与数据流图共同构成了系统的逻辑模型。数据字典应该由对四类元素的定义组成:l数据流l数据项l数据存储l处理其中,数据项也称数据元素,是数据的最小组成
273、单位,具有“不可再分”性01:31:568.3 软件生命周期软件生命周期l l软件设计软件设计软件设计软件设计l l软件测试软件测试软件测试软件测试l l软件维护软件维护软件维护软件维护l l软件编码软件编码软件编码软件编码l l软件定义软件定义软件定义软件定义01:31:57l l 软件设计软件设计软件设计软件设计软件设计阶段软件设计阶段的任务是根据需求规格说明书,形成软件的具体设计方案,即明确软件系统“怎样做”的问题包括两个部分:包括两个部分:l总体设计总体设计又称概要设计,其任务是提出候选的最佳方案,确定模块结构,划分功能模块,编写总体设计说明书l系统设计,确定系统的具体实现方案l结构设
274、计,确定软件结构l详细设计详细设计又称过程设计,其根本任务是确定应该怎样具体地实现所要求的系统,是编码的先导。主要目标不仅仅是逻辑上正确地实现每个模块的功能,更重要的是设计出的处理过程应该尽可能的简明易懂01:31:57l l 软件设计:概念软件设计:概念软件设计:概念软件设计:概念l模块化:模块化:把程序划分成若干个模块,每个模块具有一个确定的子功能,将这些模块集成为一个整体后,可以完成指定的功能。模块化的核心思想是“分而治之”l抽象:抽象:抽出事务的本质特性而暂时不考虑它们的物理特性。逐步求精和模块化与抽象密切相关。软件工程过程的每一步都是对软件解法抽象层次的一次精化l信息隐蔽原理:信息隐
275、蔽原理:模块所包含的信息,不允许其他不需要这些信息的模块访问,独立的模块间仅仅交换为完成系统功能而必须交换的信息。其目的是提高模块的独立性,减少修改和维护时的影响面l模块独立性:模块独立性:是模块化、抽象、信息隐蔽和局部化的直接结果。其含义是:模块完成独立的子功能;模块间相关联和互依赖的程度尽量小。低耦合、高内聚01:31:57l l 软件设计:面向数据流的设计软件设计:面向数据流的设计软件设计:面向数据流的设计软件设计:面向数据流的设计 方法方法方法方法面向数据流设计方法面向数据流设计方法的目标是给出设计软件结构的一个系统化途径。它把信息流映射成软件结构,信息流的类型决定映射方法。主要有两类
276、:01:31:57l l 软件设计:详细设计软件设计:详细设计软件设计:详细设计软件设计:详细设计l图形工具:图形工具:程序流程图、盒图(N_S图)、问题分析图(PAD)l表格工具:表格工具:判定树、判定表l语言工具语言工具:过程设计语言(过程设计语言(PDL)特点:)特点:(1)关键字采用固定语法并支持结构化构件、数据说明机制和模块化。(2)处理部分采用自然语言描述。(3)允许说明简单(向量、数组等)和复杂(链表、树等)的数据结构。(4)子程序的定义与调用规则不受具体接口方式的影响。详细设计的主要工具:详细设计的主要工具:01:31:578.3 软件生命周期软件生命周期l l软件设计软件设计
277、软件设计软件设计l l软件测试软件测试软件测试软件测试l l软件维护软件维护软件维护软件维护l l软件编码软件编码软件编码软件编码l l软件定义软件定义软件定义软件定义01:31:57l l 软件编码软件编码软件编码软件编码p程序设计语言:程序设计语言:l高级语言、低级语言l按需要进行选择p程序设计风格:程序设计风格:l节俭化(economy)l模块化(modularity)l简单化(simplicity)l结构化(structure)l文档化(documentation)l格式化(layout)软件编码阶段软件编码阶段的任务是根据设计说明书中每个模块的算法描述,用指定的程序设计语言编写出相应
278、的程序。相对于软件生存周期的其他阶段,编码耗费较少,结束后需要交付的是源程序及其文档01:31:578.3 软件生命周期软件生命周期l l软件设计软件设计软件设计软件设计l l软件测试软件测试软件测试软件测试l l软件维护软件维护软件维护软件维护l l软件编码软件编码软件编码软件编码l l软件定义软件定义软件定义软件定义01:31:58l l 软件测试软件测试软件测试软件测试软件测试的基本原则软件测试的基本原则:p尽早地、不断地进行软件测试p设计测试用例时,要给出测试的预期结果p开发小组和测试小组分开p要设计非法输入的测试用例p在对程序修改之后要进行回归测试p程序中尚未发现的错误的数量往往与在
279、该段程序中已发现的错误的数量成正比软件测试的定义软件测试的定义l测试是为了发现程序中的错误而执行程序的过程l好的测试是极可能发现迄今为止尚未发现的错误的测试l成功的测试是发现了至今为止尚未发现的错误的测试01:31:58l l 软件测试软件测试软件测试软件测试软件测试的步骤软件测试的步骤:p单元测试:单元测试:又称模块测试,用以检验每个模块的正确性p集成测试:集成测试:着重测试模块间的接口,子功能的组合和全程数据结构p确认测试:确认测试:用实际数据进行测试,以验证系统是否能满足用户的实际需要p系统测试:系统测试:一系列的集成测试和确认测试01:31:58l l 软件测试软件测试软件测试软件测试
280、软件测试的方法软件测试的方法:p黑盒测试:黑盒测试:又称功能测试。把程序看成一个黑盒子,完全不考虑程序的内部结构和处理过程,只是对程序的每一个功能进行测试,看是否都达到了预期的要求p白盒测试:白盒测试:又称结构测试。把程序看成一个白盒子,完全了解程序的内部结构和处理过程,检验程序中的每条通路是否都能按预定要求正确工作01:31:58l l 软件测试软件测试软件测试软件测试软件测试用例的设计软件测试用例的设计:p白盒测试法:白盒测试法:逻辑覆盖逻辑覆盖是以程序的内部逻辑结构为基础的测试用例设计技术。它要求测试人员十分清楚程序的逻辑结构,考虑测试用例对程序内部逻辑覆盖的程度语句覆盖、判定覆盖、条件
281、覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖p黑盒测试法:黑盒测试法:括等价划分边界值分析错误推测法等01:31:588.3 软件生命周期软件生命周期l l软件设计软件设计软件设计软件设计l l软件测试软件测试软件测试软件测试l l软件维护软件维护软件维护软件维护l l软件编码软件编码软件编码软件编码l l软件定义软件定义软件定义软件定义01:31:58l l 软件维护软件维护软件维护软件维护软件维护的主要原因:软件维护的主要原因:p改正程序中的错误和缺陷p改进设计以适应新的软、硬件环境p增加新的应用范围软件维护软件维护u是软件生存周期的最后一个阶段,也是持续时间最长、代价最大的一个阶段u软件
282、维护是在软件已经交付使用之后对其进行的修改过程,其目的是延长软件系统的生存周期01:31:58l l 软件维护软件维护软件维护软件维护软件维护主要分为软件维护主要分为 :p改正性维护:改正性维护:目的是识别和纠正软件错误、改正软件性能上的缺陷、排除实施中的误使用,进行的诊断和改正错误的过程p适应性维护:适应性维护:为了适应外部环境或数据环境的变化而去修改软件的过程。p完善性维护:完善性维护:为了满足在使用过程中,用户对软件提出的新功能要求,需要修改或再开发软件,以扩充软件性能、改进加工效率、提高软件的可维护性。p预防性维护:预防性维护:为了进一步改进软件系统的可维护性和可靠性而进行的预先维护工
283、作。01:31:59本章主要内容本章主要内容: :l软件工程基本知识软件工程基本知识l软件开发模型软件开发模型l软件生命周期软件生命周期l软件工程技术发展趋势软件工程技术发展趋势第第8章章软件工程技术软件工程技术01:31:59l l 软件工程技术发展趋势软件工程技术发展趋势软件工程技术发展趋势软件工程技术发展趋势尽管传统的生存周期方法学曾经给软件产尽管传统的生存周期方法学曾经给软件产业带来了巨大进步,部分缓解了软件危机,但业带来了巨大进步,部分缓解了软件危机,但是,由于结构分析和结构设计技术的采用,使是,由于结构分析和结构设计技术的采用,使软件的稳定性、可修改性和可重用性比较差。软件的稳定性
284、、可修改性和可重用性比较差。为了克服传统方法的缺点,人们在实践中逐步为了克服传统方法的缺点,人们在实践中逐步创造出软件工程的新途径。创造出软件工程的新途径。主要有以下三种:主要有以下三种:01:31:59l l 软件工程技术发展趋势软件工程技术发展趋势软件工程技术发展趋势软件工程技术发展趋势p面向对象的软件工程方法面向对象的软件工程方法面向对象=对象+类+继承+通信p基于构件的软件工程方法基于构件的软件工程方法基于构件的软件工程的过程模型强调了域工程和基于构件的开发的并行性。域工程的工作要求建立一组可被软件工程师重用的软件构件。这组构件把域工程和基于构件的软件工程连接起来pCASE技术技术计算
285、机辅助软件工程技术可以简单地定义为软件开发的自动化,通常简称为CASE(computeraidedsoftwareengineering)技术01:31:59本章主要内容回顾本章主要内容回顾: :l软件工程基本知识软件工程基本知识l软件开发模型软件开发模型l软件生命周期软件生命周期l软件工程技术发展趋势软件工程技术发展趋势第第8章章软件工程技术软件工程技术01:31:59第第9 9章章数据库技术数据库技术01:32:02 第九章第九章 数据库技术数据库技术数据库技术是计算机数据处理与信息管理系统的核心和基础。随着计算机技术和网络技术的快速发展,数据库技术已得到各领域的广泛应用,如办公信息系统(
286、OIS)、计算机辅助设计与制造(CAD/CAM)、计算机集成制造(CIMS)、地理信息系统(GIS)和全球定位系统(GPS)等。本章主要介绍数据库的基本概念、关系数据库的设计方法及关系数据库结构化查询语言SQL的基本操作。01:32:03本章内容提要本章内容提要: :l数据库的基础知识数据库的基础知识l关系模型及关系数据库关系模型及关系数据库l数据库系统结构数据库系统结构l数据库设计数据库设计l关系数据库结构化查询语言关系数据库结构化查询语言SQLl动态动态SQLl数据库技术及数据库技术及SQL发展趋势发展趋势 第九章第九章 数据库技术数据库技术01:32:039.1 9.1 数据库的基础知识
287、数据库的基础知识l l数据库的基本概念数据库的基本概念数据库的基本概念数据库的基本概念l l数据库系统模型数据库系统模型数据库系统模型数据库系统模型01:32:03l l 数据库基本概念数据库基本概念数据库基本概念数据库基本概念数据、数据库、数据库系统、数据库管理员和数据数据、数据库、数据库系统、数据库管理员和数据库管理系统是与数据库密切相关的五个基本概念。库管理系统是与数据库密切相关的五个基本概念。1)数据(数据(data)2)数据库数据库(database,DB)3)数据库系统数据库系统(databasesystem,DBS)4)数据库管理员数据库管理员(databaseadministr
288、ator,DBA)5)数据库管理系统数据库管理系统(databasemanagementsystem,DBMS)数据库系统是使用数据库系统是使用数据库技术统一管数据库技术统一管理、操纵和维护数理、操纵和维护数据资源的整个计算据资源的整个计算机系统。机系统。数据库是以一定的组织方式,数据库是以一定的组织方式,将相关的数据组织在一起,将相关的数据组织在一起,存放在计算机的存储器上,存放在计算机的存储器上,并能为多个用户共享的、与并能为多个用户共享的、与应用程序彼此独立的一组相应用程序彼此独立的一组相关数据的集合,是数据库系关数据的集合,是数据库系统的核心和管理对象。统的核心和管理对象。数据是系统中
289、数据存储的数据是系统中数据存储的基本对象。其种类主要包基本对象。其种类主要包括文字、图像、图形、声括文字、图像、图形、声音、各种档案记录(如学音、各种档案记录(如学生的学籍档案记录、职工生的学籍档案记录、职工工资档案记录)等。工资档案记录)等。数据库管理员是数据库管理员是对数据库进行规对数据库进行规划、设计、协调、划、设计、协调、维护和管理的人维护和管理的人员。员。数据库管理系统数据库管理系统用来管理数据库用来管理数据库的软件,需要通的软件,需要通过它进行数据的过它进行数据的维护和管理。维护和管理。01:32:039.1 9.1 数据库的基本知识数据库的基本知识l l数据库的基本概念数据库的基
290、本概念数据库的基本概念数据库的基本概念l l数据库系统模型数据库系统模型数据库系统模型数据库系统模型01:32:03l l 数据库系统模型数据库系统模型数据库系统模型数据库系统模型数据库系统模型是指数据库中数据的存储结构。根据数据数据库系统模型是指数据库中数据的存储结构。根据数据存储需求的不同,数据库可以使用多种类型的系统模型,其中较存储需求的不同,数据库可以使用多种类型的系统模型,其中较为常见的有层次模型、网状模型和关系模型三种。为常见的有层次模型、网状模型和关系模型三种。数据模型通常由数据结构、数据操作和数据的完整性约束数据模型通常由数据结构、数据操作和数据的完整性约束三部分组成。三部分组
291、成。1 1)数据结构数据结构2 2)数据操作数据操作3 3)数据的完整性约束数据的完整性约束数据结构用于描述数据的静态数据结构用于描述数据的静态结构,是研究存储在数据库中结构,是研究存储在数据库中的对象类型的集合。对象可以的对象类型的集合。对象可以包括数据的组织结构、数据元包括数据的组织结构、数据元素以及元素之间的联系。素以及元素之间的联系。数据操作是对数据结构中的对数据操作是对数据结构中的对象进行的一组操作,属于对数象进行的一组操作,属于对数据动态特征的描述。通常对数据动态特征的描述。通常对数据的操作有插入、删除、添加、据的操作有插入、删除、添加、修改、检索。修改、检索。它是对数据静态和动态
292、特性它是对数据静态和动态特性的限定。规定了相容的数据的限定。规定了相容的数据库状态的集合和所允许的状库状态的集合和所允许的状态改变,对数据对象之间的态改变,对数据对象之间的依赖关系进行限定,使得被依赖关系进行限定,使得被操作对象的修改不会破坏其操作对象的修改不会破坏其他对象的特性。他对象的特性。01:32:049.2关系模型及关系数据库关系模型及关系数据库目前,数据库系统中支持的数据模型主要有层次模型、目前,数据库系统中支持的数据模型主要有层次模型、网状模型和关系模型。关系数据模型(简称关系模型)是三网状模型和关系模型。关系数据模型(简称关系模型)是三种数据模型中非常重要的,也是应用非常为广泛
293、的数据模型。种数据模型中非常重要的,也是应用非常为广泛的数据模型。目前市场上推出的数据库系统几乎全部支持关系数据模型。目前市场上推出的数据库系统几乎全部支持关系数据模型。01:32:049.2关系模型及关系数据库关系模型及关系数据库l l 关系模型关系模型关系模型关系模型l l 关系数据库关系数据库关系数据库关系数据库01:32:04l l 关系模型关系模型关系模型关系模型关系模型由关系数据结构、关系操作和关系完整性约束三关系模型由关系数据结构、关系操作和关系完整性约束三部分组成。部分组成。1 1)关系数据结构关系数据结构2 2)关系操作关系操作3 3)关系完整性约束关系完整性约束关系模型中数
294、据的逻辑结构是关系模型中数据的逻辑结构是一张二维表,每一张二维表称一张二维表,每一张二维表称为一个关系。关系模型与层次为一个关系。关系模型与层次和网状模型相比较,关系模型和网状模型相比较,关系模型具有建立在严格的数据概念基具有建立在严格的数据概念基础上,数据结构单一,将数据础上,数据结构单一,将数据定义和数据操纵统一在一种语定义和数据操纵统一在一种语言中,简单易学等优点。言中,简单易学等优点。关系模型中常用的关系操作包关系模型中常用的关系操作包括选择(括选择(select)、投影)、投影(project)、连接()、连接(join)、)、除(除(divide)、并()、并(union)、)、交
295、(交(intersection)、差)、差(difference)等查询)等查询(query)操作和删除)操作和删除(delete)、增加()、增加(insert)、)、修改(修改(update)操作两大部)操作两大部分。分。关系模型允许定义三种关系模型允许定义三种完整性约束,即实体完完整性约束,即实体完整性、参照完整性和用整性、参照完整性和用户定义的完整性。户定义的完整性。01:32:049.2关系模型及关系数据库关系模型及关系数据库l l 关系模型关系模型关系模型关系模型l l 关系数据库关系数据库关系数据库关系数据库01:32:04l l 关系数据库关系数据库关系数据库关系数据库1)数据
296、结构定义)数据结构定义关系数据库中数据结构的定义包括以下内容:关系、字段、字段的值域、记录、数据项、主关键字、候选关键字2)关系数据库)关系数据库关系数据库是将每个具有相同属性(字段)的数据独立地存放在一个表中。对表中的任何一个属性而言,用户可以新增、删除和修改表中的数据,而不会影响表中的其他数据。在一个关系中,每一数据项不可再分,也是最基本的数据单位,同一列数据项要具有相同的数据类型,各列的顺序可以任意的排列,不允许有相同的字段名,每一行是一个具体事物。01:32:049.3 9.3 数据库系统结构数据库系统结构目前,数据库系统结构有多种不同的层次或不同的角度,一目前,数据库系统结构有多种不
297、同的层次或不同的角度,一般分为两类角度定义:般分为两类角度定义:描述数据库系统内部的系统结构,数据描述数据库系统内部的系统结构,数据库系统通常采用三级模式结构;库系统通常采用三级模式结构;描述数据库系统外部的体系结描述数据库系统外部的体系结构,数据库系统的结构分为集中式结构(单用户结构构,数据库系统的结构分为集中式结构(单用户结构/主从式结构)主从式结构)、分布式结构、分布式结构、C/S(客户机(客户机/服务器)结构和并行结构。本节主服务器)结构和并行结构。本节主要介绍关系数据库系统的模式结构。要介绍关系数据库系统的模式结构。01:32:059.3 9.3 数据库系统结构数据库系统结构 l数据
298、库系统模型数据库系统模型 l数据库系统三级模式结构数据库系统三级模式结构01:32:05l l 数据库系统模式数据库系统模式数据库系统模式数据库系统模式数据库系统模式是指数据库中全数据库系统模式是指数据库中全体数据的逻辑结构和特征的描述。它体数据的逻辑结构和特征的描述。它仅仅涉及对某一类数据的结构和属性仅仅涉及对某一类数据的结构和属性的描述,不涉及该数据的结构和属性的描述,不涉及该数据的结构和属性具体的值。具体的值。其特点是,模式是相对稳定的,其特点是,模式是相对稳定的,模式描述的是数据的结构及其联系。模式描述的是数据的结构及其联系。01:32:059.3 9.3 数据库系统结构数据库系统结构
299、 l数据库系统模型数据库系统模型 l数据库系三级模式结构数据库系三级模式结构01:32:05l l 数据库系统三级模式结构数据库系统三级模式结构数据库系统三级模式结构数据库系统三级模式结构数据库系统是由外模式(子模式)、模式和内模式三级组成数据库系统是由外模式(子模式)、模式和内模式三级组成,如图所示如图所示。01:32:059.4 9.4 数据库设计数据库设计数据库设计的主要任务是在数据库设计的主要任务是在DBMS的支持下,按照实际应的支持下,按照实际应用需求,为用户设计一种结构合理、操作方便、高效可靠的数用需求,为用户设计一种结构合理、操作方便、高效可靠的数据库及应用系统。据库及应用系统。
300、数据库设计作为整个系统的基础,要保证其设计的合理性,数据库设计作为整个系统的基础,要保证其设计的合理性,其中数据表要尽量满足规范化要求,以加快应用系统的开发速其中数据表要尽量满足规范化要求,以加快应用系统的开发速度、提高数据库系统质量。度、提高数据库系统质量。01:32:069.4 9.4 数据库设计数据库设计 l数据规范化数据规范化 数据库设计步骤数据库设计步骤 l数据库概念结构设计数据库概念结构设计 l数据库逻辑结构设计数据库逻辑结构设计 l数据库物理结构设计数据库物理结构设计01:32:06l l 数据规范化数据规范化数据规范化数据规范化数据规范化是指逐步消除数据依赖关系中不合适的部分,
301、并数据规范化是指逐步消除数据依赖关系中不合适的部分,并使依赖于同一个数学模型的数据达到有效的分离,使数据库中重使依赖于同一个数学模型的数据达到有效的分离,使数据库中重复存储的数据量降至最低,从而节约存储空间,提高访问效率。复存储的数据量降至最低,从而节约存储空间,提高访问效率。通常实体间的依赖关系有一对一、一对多、多对一和多对多。通常实体间的依赖关系有一对一、一对多、多对一和多对多。01:32:069.4 9.4 数据库设计数据库设计 l数据规范化数据规范化 l数据库设计步骤数据库设计步骤 l数据库概念结构设计数据库概念结构设计 l数据库逻辑结构设计数据库逻辑结构设计 数据库物理结构设计数据库
302、物理结构设计01:32:06l l 数据库设计步骤数据库设计步骤数据库设计步骤数据库设计步骤1)确定新创建的数据库所要完成的任务,即通过)确定新创建的数据库所要完成的任务,即通过该数据库我们要实该数据库我们要实现什么样的功能。现什么样的功能。2)确定新数据库中所要创建的表以及表中都包含)确定新数据库中所要创建的表以及表中都包含哪些字段。哪些字段。3)确定字段属性,并为表选择主键。)确定字段属性,并为表选择主键。4)建立表间的关联关系。)建立表间的关联关系。5)优化设计。)优化设计。6)注入数据并创建其他数据库对象。)注入数据并创建其他数据库对象。在数据规范化原则的指导下,根据数据库及应用系统实
303、现过程要求,数据库在数据规范化原则的指导下,根据数据库及应用系统实现过程要求,数据库的设计一般遵循以下六个步骤。的设计一般遵循以下六个步骤。01:32:069.4 9.4 数据库设计数据库设计 l数据规范化数据规范化 l数据库设计步骤数据库设计步骤 l数据库概念结构设计数据库概念结构设计 l数据库逻辑结构设计数据库逻辑结构设计 l数据库物理结构设计数据库物理结构设计01:32:07l l 数据库概念结构设计数据库概念结构设计数据库概念结构设计数据库概念结构设计数据库概念结构设计是指通过对用户需求进行综合、归纳数据库概念结构设计是指通过对用户需求进行综合、归纳与抽象,形成一个独立于具体与抽象,形
304、成一个独立于具体DBMS的信息结构模型即概念模的信息结构模型即概念模型。该模型能够真实的、充分的反映现实世界,包括事物和事型。该模型能够真实的、充分的反映现实世界,包括事物和事物之间的联系,是对现实世界的一个真实建模。物之间的联系,是对现实世界的一个真实建模。1 1)自顶向下策略自顶向下策略2 2)自顶向下策略自顶向下策略3 3)逐步扩张策略逐步扩张策略4 4)混合策略混合策略即首先定义各局部应用的概即首先定义各局部应用的概念结构,然后将它们集合其念结构,然后将它们集合其来,得到全局概念结构。来,得到全局概念结构。首先定义最重要的核心概念首先定义最重要的核心概念结构,然后向外扩充,逐步结构,然
305、后向外扩充,逐步生成其他概念结构,直至总生成其他概念结构,直至总体概念结构。体概念结构。即将自底向上和自顶向下方法即将自底向上和自顶向下方法进行结合,用自顶向下策略设进行结合,用自顶向下策略设计一个全局概念结构的框架,计一个全局概念结构的框架,以它为骨架集成由自底向上策以它为骨架集成由自底向上策略中设计的各局部概念结构。略中设计的各局部概念结构。即首先定义全局概念结构即首先定义全局概念结构的框架,然后逐步细化。的框架,然后逐步细化。01:32:079.4 9.4 数据库设计数据库设计 l数据库设计步骤数据库设计步骤 l数据库概念结构设计数据库概念结构设计 l数据库逻辑结构设计数据库逻辑结构设计
306、 l数据库物理结构设计数据库物理结构设计 l数据规范化数据规范化01:32:07l l 数据库逻辑结构设计数据库逻辑结构设计数据库逻辑结构设计数据库逻辑结构设计数数据据库库的的逻逻辑辑结结构构设设计计就就是是把把概概念念结结构构设设计计阶阶段段设设计计好好的的基基本本E-R图图转转换换为为与与选选用用的的DBMS产产品品所所支支持持的的数数据据模模型型相相符合的逻辑结构。符合的逻辑结构。数据库逻辑设计分为三个步骤:数据库逻辑设计分为三个步骤:(1)将概念模型转换为一般的关系、网状、层次模型。)将概念模型转换为一般的关系、网状、层次模型。(2)将转换来的关系、网状、层次模型向特定的)将转换来的关
307、系、网状、层次模型向特定的DBMS支持下的数支持下的数据模型转换。据模型转换。(3)数据模型进行优化。)数据模型进行优化。01:32:079.4 9.4 数据库设计数据库设计 l数据规范化数据规范化 l数据库设计步骤数据库设计步骤 l数据库概念结构设计数据库概念结构设计 l数据库逻辑结构设计数据库逻辑结构设计 l数据库物理结构设计数据库物理结构设计01:32:07l l 数据库物理结构设计数据库物理结构设计数据库物理结构设计数据库物理结构设计数据库在物理设备上的存储结构与存储方法称为数据库数据库在物理设备上的存储结构与存储方法称为数据库的物理结构,它依赖于给定的计算机系统。为一个给定的逻的物理
308、结构,它依赖于给定的计算机系统。为一个给定的逻辑数据模型选取一个最适合应用要求的物理结果的过程,就辑数据模型选取一个最适合应用要求的物理结果的过程,就是数据库的物理设计。是数据库的物理设计。数据库的物理结构设计通常分为两步:数据库的物理结构设计通常分为两步:确定数据库的物理结构,在关系数据库中主要指存取方法和存储结构;对物理结构进行评价,评价的重点是时间和空间效率。01:32:089.5关系数据库结构化查询语言关系数据库结构化查询语言SQL关系数据库结构化查询语言关系数据库结构化查询语言SQL(structuredquerylanguage,SQL)是操作和检索关系型数据库的标准语言,作为一种
309、结构化查询语言,)是操作和检索关系型数据库的标准语言,作为一种结构化查询语言,它的功能丰富而简单,它不仅仅是查询语言,更是一种通用的、功能极强它的功能丰富而简单,它不仅仅是查询语言,更是一种通用的、功能极强的关系数据库语言。的关系数据库语言。01:32:089.5 9.5 关系数据库结构化查询语言关系数据库结构化查询语言SQLSQL SQL的特点的特点 lSQL支持的关系数据模式支持的关系数据模式 l数据定义数据定义 l查询查询 l数据控制数据控制 l数据更新数据更新 l试图试图01:32:08l lSQLSQL的特点的特点的特点的特点SQL语言是现在使用最为广泛和便捷的关系数据库语语言是现在
310、使用最为广泛和便捷的关系数据库语言。言。SQL语言具有如下特点。语言具有如下特点。1)综合统一)综合统一对于数据库系统来说,主要有两种数据模型,即非关系模型对于数据库系统来说,主要有两种数据模型,即非关系模型和关系模型。对于早期数据库来说,大多数支持非关系模型(层和关系模型。对于早期数据库来说,大多数支持非关系模型(层次模型、网状模型、集合模型等)的数据语言。分别使用模式数次模型、网状模型、集合模型等)的数据语言。分别使用模式数据定义语言(据定义语言(DDL)、外模式数据定义语言、与数据存储有关的)、外模式数据定义语言、与数据存储有关的语言(语言(DSDL)和数据操纵语言()和数据操纵语言(D
311、ML)来对模式、外模式、内)来对模式、外模式、内模式和进行数据的存取与处置进行各自的定义。当数据库投入运模式和进行数据的存取与处置进行各自的定义。当数据库投入运行后,如果需要修改模式,必须停止现有数据库的运行、转储数行后,如果需要修改模式,必须停止现有数据库的运行、转储数据、修改模式并编译以后再重装数据库,非常不便。据、修改模式并编译以后再重装数据库,非常不便。而而SQL语言则集数据定义语言(语言则集数据定义语言(DDL)、数据操纵语言)、数据操纵语言(DML)、数据控制语言()、数据控制语言(DCL)的功能于一体,语言风格统一。)的功能于一体,语言风格统一。可以独立的进行数据库的各项操作,降
312、低了操作间的高耦合风险,可以独立的进行数据库的各项操作,降低了操作间的高耦合风险,并在数据库投入使用的过程中,还可以根据需要,在不影响数据并在数据库投入使用的过程中,还可以根据需要,在不影响数据库的正常运行情况下进行随时的修改和调整。库的正常运行情况下进行随时的修改和调整。01:32:08l lSQLSQL的特点的特点的特点的特点用用SQL对数据进行操作时,并不用像在非关系数据模型中那样,对数据进行操作时,并不用像在非关系数据模型中那样,需要指定待操作数据的存取路径,而只需要提出需要指定待操作数据的存取路径,而只需要提出“做什么做什么”,无需指,无需指明明“怎么做怎么做”,因此就没必要了解存取
313、路径,存取路径的选择以及通,因此就没必要了解存取路径,存取路径的选择以及通过过SQL语句对数据进行的操作过程都由系统来自动完成。高度的非过语句对数据进行的操作过程都由系统来自动完成。高度的非过程化大大减轻了用户的负担,同时也增强了数据的独立性。程化大大减轻了用户的负担,同时也增强了数据的独立性。2)高度非过程化高度非过程化01:32:08l lSQLSQL的特点的特点的特点的特点3)面向集合的操作方式面向集合的操作方式对数据的操作对象可以是记录,也可以是集合。对非关系数据模对数据的操作对象可以是记录,也可以是集合。对非关系数据模型来说,它采用的是面向记录的操作方式,操作的对象是一条记录,型来说
314、,它采用的是面向记录的操作方式,操作的对象是一条记录,每一次的操作都需要遍历每一条记录,工作量大且效率低下。而每一次的操作都需要遍历每一条记录,工作量大且效率低下。而SQL则是面向集合的,每一次的操作对象以及操作结果都可以是集合。使则是面向集合的,每一次的操作对象以及操作结果都可以是集合。使系统避免了繁杂的查找匹配工作,而且也提高了效率,方便了用户的系统避免了繁杂的查找匹配工作,而且也提高了效率,方便了用户的操作。操作。01:32:08l lSQLSQL的特点的特点的特点的特点4)以同一种语法结构提供两种使用方法以同一种语法结构提供两种使用方法SQL既是自含式语言,又是嵌入式语言。作为自含式语
315、言,用户既是自含式语言,又是嵌入式语言。作为自含式语言,用户可以在终端键盘上直接键入可以在终端键盘上直接键入SQL命令对数据库进行操作,即支持联机命令对数据库进行操作,即支持联机交互的使用方式。作为嵌入式语言,交互的使用方式。作为嵌入式语言,SQL可以嵌入高级程序语言可以嵌入高级程序语言(C+、C#、C、COBOL、FORTRAN等)中。在这两种不同使用等)中。在这两种不同使用方式下,方式下,SQL语言的语法结构基本上是一致的,它的灵活性与方便性语言的语法结构基本上是一致的,它的灵活性与方便性得到了极大的扩展和提高。得到了极大的扩展和提高。01:32:09l lSQLSQL的特点的特点的特点的
316、特点5)语言简单,易学易用语言简单,易学易用SQL功能丰富,又因其上述特点,使得设计出的语言十分简捷。功能丰富,又因其上述特点,使得设计出的语言十分简捷。实际应用中仅使用实际应用中仅使用SQL核心功能的九个动词,如下表所示。核心功能的九个动词,如下表所示。SQL功能功能动动 词词数据定义CREATE,DROP,ALTER数据查询SELECT数据操纵INSERT,UPDATE,DELETE数据控制GRANT,REVOKESQL语言的动词01:32:099.5 9.5 关系数据库结构化查询语言关系数据库结构化查询语言SQLSQL lSQL的特点的特点 lSQL支持的关系数据模式支持的关系数据模式
317、l数据定义数据定义 l查询查询 l数据控制数据控制 l数据更新数据更新 l试图试图01:32:09l lSQLSQL支持的关系数据模式支持的关系数据模式支持的关系数据模式支持的关系数据模式SQL支持关系数据库三级模式结构,如下图所示。其中,外模式对应支持关系数据库三级模式结构,如下图所示。其中,外模式对应于视图和部分基本表,模式对应于基本表,内模式对应于存储文件。于视图和部分基本表,模式对应于基本表,内模式对应于存储文件。01:32:109.5 9.5 关系数据库结构化查询语言关系数据库结构化查询语言SQLSQL lSQL的特点的特点 lSQL支持的关系数据模式支持的关系数据模式 l数据定义数
318、据定义 l查询查询 l数据控制数据控制 l数据更新数据更新 l试图试图01:32:10l l 数据定义数据定义数据定义数据定义(1)模式的定义与删除)模式的定义与删除语法格式:CREATESCHEMAAUTHORIZATION|;其功能是定义一个命名空间,在这个空间上可以进一步定义该模式包含的数据库对象,如基本表、视图和索引等。注意:能创建模式的用户拥有DBA权限,或者获得DBA授予的CREARESCHEMA权限。例如:CREATESCHEMAExampleAUTHORIZATIONLiCREATETABLETAB1(COL1SMALLINT,COL2INT,COL3CHAR(20),COL4
319、NUMERIC(10,3),COL5DECIMAL(5,2);模式的定义:01:32:10l l 数据定义数据定义数据定义数据定义(1)模式的定义与删除)模式的定义与删除语法格式:DROPSCHEMA;其中,CASCADE(级联),表示在删除模式的同时把该模式中所有的数据库对象全部删除;RESTRICT(限制),表示若模式中已经定义下属的数据库对象(表、视图)时,则拒绝该删除语句的执行。例如:DROPSCHEMALiCASCADE;该语句删除了Li,同时该模式定义的表TABLE1也被删除。模式的删除:01:32:10l l 数据定义数据定义数据定义数据定义(2)基本表的操作)基本表的操作语法格
320、式:CREATETABLE(,);其中,列级完整性约束条件是指涉及相应属性列的完整性约束条件。表级完整性约束条件是指涉及一个或多个属性列的完整性约束条件,常用完整性约束有主码约束(PRIMARYKEY)、唯一性约束(UNIQUE)、非空值约束(NOTNULL)和参照完整性约束。定义基本表:01:32:10l l 数据定义数据定义数据定义数据定义(2)基本表操作)基本表操作例如:建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。CREATETABLEStudent(Sno
321、CHAR(5)NOTNULLUNIQUE,SnameCHAR(20)UNIQUE,Ssex CHAR(1),SageINT,SdeptCHAR(15);定义基本表01:32:11l l 数据定义数据定义数据定义数据定义(2)基本表操作)基本表操作语法格式:ALTERTABLEADD完整性约束DROPMODIFY;其中,表名指要修改的基本表;ADD子句指增加新列和新的完整性约束条件;DROP子句即删除指定的完整性约束条件;MODIFY子句是用于修改列名和数据类型。例如:向Student表增加“入学时间”列,其数据类型为日期型。ALTERTABLEStudentADDScomeDATE;不论基本表
322、中原来是否已有数据,新增加的列一律为空值。删除Scome列:ALTERTABLEStudentDropScome;修改基本表01:32:11l l 数据定义数据定义数据定义数据定义(2)基本表操作)基本表操作语法格式:DROPTABLE;基本表删除之后该表内包含的数据、索引都将被删除,表上的视图往往仍然保留,但无法引用,删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述。删除基本表01:32:11l l 数据定义数据定义数据定义数据定义(3)建立与删除索引)建立与删除索引建立索引是加快查询速度的有效手段。用户可以根据数据库的设计特点以及应用环境的需要,为基本表建立一个或多个索引,提
323、供多种存取路径,加快查找速度。语法格式:CREATEUNIQUECLUSTERINDEXON(,);其中,用指定要建索引的基本表名字;索引可以建立在该表的一列或多列上,各列名之间用逗号分隔;用指定索引值的排列次序,升序为ASC,降序为DESC,缺省值为ASC;UNIQUE表明此索引的每一个索引值只对应唯一的数据记录;CLUSTER表示要建立的索引是聚簇索引。建立索引01:32:11l l 数据定义数据定义数据定义数据定义(3)建立与删除索引)建立与删除索引例如:为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程
324、号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。CREATEUNIQUEINDEXStusnoONStudent(Sno);CREATEUNIQUEINDEXCoucnoONCourse(Cno);CREATEUNIQUEINDEXSCnoONSC(SnoASC,CnoDESC);建立索引01:32:11l l 数据定义数据定义数据定义数据定义(3)建立与删除索引)建立与删除索引建立索引的目的是为了提高查询效率,但有时创建太多的索引反而会增加系统维护的开销。因此,有必要删除一些无关紧要的索引。语法格式:DROPINDEX;例如:删除Student表的Stuage索引。DROPINDE
325、XStuage;注意:删除索引时,系统会从数据字典中删去有关该索引的描述。删除索引01:32:119.5 9.5 关系数据库结构化查询语言关系数据库结构化查询语言SQLSQL lSQL的特点的特点 lSQL支持的关系数据模式支持的关系数据模式 l数据定义数据定义 l查询查询 l数据控制数据控制 l数据更新数据更新 l试图试图01:32:12l l 查询查询查询查询查询一般语法格式:SELECTALL|DISTINCT,FROM,WHEREGROUPBYHAVINGORDERBYASC|DESC;其中,SELECT子句指定要显示的属性列;ALL表示多有属性列全部显示;DISTINCT则表示去掉重
326、复列,当然也可以根据用户需求有选择地显示属性列;FROM子句指定了查询对象(基本表或视图),根据WHERE子句指定的查询条件对表进行查询;GROUPBY子句可以对查询结果按指定列的值进行分组,该属性列值相等的元组为一个组。通常会在每组中使用集函数。如果GROUPBY子句带有HAVING短语,则筛选出只有满足指定条件的组;ORDERBY子句实现对查询结果表按指定列值的升序或降序排序。01:32:12l l 查询查询查询查询(1)单表查询)单表查询1)若查询指定列。该查询返回指定列的信息,这些列的顺序就是其在SELECT子句中的顺序。语法格式:SELECTderived_columnAScolum
327、n_nameFROMtable_list;其中,derived_column表示要查询的源表中的列名称,当指定的列大于一个时,中间用逗号隔开。column_name表示为列指定的别名,可以为列重命名,但不改变原表中的信息。选择表中的若干列01:32:12l l 查询查询查询查询(1)单表查询)单表查询2)若查询全部列。该查询返回表中的所有列,并且这些列按照源表中的顺序进行排列。语法格式:SELECT*FROMtable_list;其中,*号代表源表中的所有列,也可以在查询语句中列出所有的列名。例如:查询全体学生的详细记录。SELECTSno,Sname,Ssex,Sage,SdeptFROMS
328、tudent;或SELECT*FROMStudent;选择表中的若干列01:32:12l l 查询查询查询查询(1)单表查询)单表查询3)查询经过计算的值。SELECT子句的不仅可以是表中的属性列,也可以是表达式,如算术表达式、字符串常量、函数、列别名等。例如:查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECTSname,YearofBirth;,2012-Sage,ISLOWER(Sdept)FROMStudent;输出结果:SnameYearofBirth;2012-SageISLOWER(Sdept)-王名YearofBirth;1989cs王星YearofB
329、irth;1990is李勇YearofBirth;1991ma王振YearofBirth;1992is选择表中的若干列01:32:12l l 查询查询查询查询(1)单表查询)单表查询在对数据库中的信息进行查询时,两个本来并不完全相同的元组,投影到指定的某列上后,会出现重复行的现象。此时为避免出现这些重复行,在SELECT子句中使用DISTINCT关键字。对于元组的查询我们也可以根据自己的需要而进行筛选查询,即查询满足指定条件的元组,这可以通过WHERE子句来实现。WHERE子句常用的查询条件如下表所示。选择表中的若干元组查询条件查询条件谓谓 词词比较=,=,-,!=,!,!,NOT加上述比较运
330、算符确定范围BETWEEN AND,NOT BETEEEN AND确定集合IN,NOT IN字符匹配LIKE,NOT LIKE空值IS NULL,IS NOT MULL多重条件AND,OR01:32:13l l 查询查询查询查询(1)单表查询)单表查询例如:查询年龄在1923岁(包括19岁和23岁)之间的学生的姓名、系名和年龄。SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN19AND23;注意:当查询年龄不在1923岁之间的学生信息时将组后一句查询语句改为WHERESageNOTBETWEEN19AND23选择表中的若干元组01:32:13l
331、 l 查询查询查询查询(1)单表查询)单表查询对查询结果进行排序时可以使用SELECT语句中的ORDERBY子句,它可以实现按一个或多个属性列排序,分为升序(ASC)和降序(DESC),缺省值为升序。当排序列含空值时,ASC中排序列为空值的元组最后显示,DESC中排序列为空值的元组最先显示。对查询结果排序01:32:13l l 查询查询查询查询(1)单表查询)单表查询例如:查询选修了2号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECTSno,GradeFROMSCWHERECno=2ORDERBYGradeDESC;查询结果:SnoGrade-110011110016110132
332、92110033821100508211005375对查询结果排序01:32:13l l 查询查询查询查询(1)单表查询)单表查询集函数的使用,可以进一步方便用户,增强检索功能,SQL提供了许多集合函数,下面介绍五类主要集合函数,如下表所示。使用集函数函数名函数名功功 能能COUNT(DISTINCT|ALL *|)统计一个数或统计一列中值的个数,返回整数SUM(DISTINCT|ALL )计算一列值的总和,此列必须是数值型AVG(DISTINCT|ALL )计算一列值的平均值,此列必须是数值型MAX(DISTINCT|ALL )求一列中的最大值MIN(DISTINCT|ALL )求一列中的最
333、小值01:32:13l l 查询查询查询查询(1)单表查询)单表查询GROUPBY子句将查询结果按照某一列数据值分类。换句话讲,GROUPBY子句用于归纳信息类型和汇总相关数据。语法格式:GROUPBYgroup_by_listGROUPBY子句的作用对象是查询的中间结果表,使用GROUPBY子句后,SELECT子句的列名列表中只能出现分组属性和集函数。对查询结果分组01:32:13l l 查询查询查询查询(1)单表查询)单表查询例如:查询有三门以上课程是90分以上的学生的学号及课程数。SELECTSno,COUNT(*)FROMSCWHEREGrade=90GROUPBYSnoHAVINGC
334、OUNT(*)=3;注意:在例子中,只有满足HAVING短语指定条件的组才输出。HAVING短语与WHERE子句的区别在于作用对象不同,WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。对查询结果分组01:32:13l l 查询查询查询查询(2)连接查询)连接查询连接查询是指同时涉及多个表的查询。连接操作不仅可以在两个不同表之间进行,也可以是一个表与自身进行连接,称为自身连接。用来连接两个表的条件称为连接条件或连接谓词。连接查询的一般语法格式:.(比较运算符:=、=、=、!=)和.BETWEEN.AND.;本节主要介绍常用的三种连接查询:嵌
335、套循环法(NESTED-LOOP)、排序合并法(SORT-MERGE)和索引连接(INDEX-JOIN)。01:32:14l l 查询查询查询查询(2)连接查询)连接查询首先在表首先在表1中找到第一个元组,然后从头开始扫描表中找到第一个元组,然后从头开始扫描表2,逐,逐一查找满足连接件的元组,找到后就将表一查找满足连接件的元组,找到后就将表1中的第一个元组与中的第一个元组与该元组拼接起来,形成结果表中一个元组。然后,表该元组拼接起来,形成结果表中一个元组。然后,表2全部查全部查找完后,再找表找完后,再找表1中第二个元组,然后再从头开始扫描表中第二个元组,然后再从头开始扫描表2,逐,逐一查找满足
336、连接条件的元组,找到后就将表一查找满足连接条件的元组,找到后就将表1中的第二个元组中的第二个元组与该元组拼接起来,形成结果表中一个元组。重复上述操作,与该元组拼接起来,形成结果表中一个元组。重复上述操作,直到表直到表1中的全部元组都处理完毕。中的全部元组都处理完毕。嵌套循环法嵌套循环法01:32:14l l 查询查询查询查询(2)连接查询)连接查询首先按连接属性对表首先按连接属性对表1和表和表2排序;对表排序;对表1的第一个元组常的第一个元组常用于连接。,从头开始扫描表用于连接。,从头开始扫描表2,顺序查找满足连接条件的元,顺序查找满足连接条件的元组,找到后就将表组,找到后就将表1中的第一个元
337、组与该元组拼接起来,形成中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表结果表中一个元组。当遇到表2中第一条大于表中第一条大于表1连接字段值的连接字段值的元组时,对表元组时,对表2的查询不再继续;找到表的查询不再继续;找到表1的第二条元组,然后的第二条元组,然后从刚才的中断点处继续顺序扫描表从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元,查找满足连接条件的元组,找到后就将表组,找到后就将表1中的第一个元组与该元组拼接起来,形成中的第一个元组与该元组拼接起来,形成结果表中一个元组。直接遇到表结果表中一个元组。直接遇到表2中大于表中大于表1连接字段值的元组连接字段值的元组时,
338、对表时,对表2的查询不再继续。重复上述操作,直到表的查询不再继续。重复上述操作,直到表1或表或表2中中的全部元组都处理完毕为止。的全部元组都处理完毕为止。排序合并法排序合并法01:32:14l l 查询查询查询查询(2)连接查询)连接查询首先对表首先对表2按连接字段建立索引,然后对表按连接字段建立索引,然后对表1中的每个元组,中的每个元组,依次根据其连接字段值查询表依次根据其连接字段值查询表2的索引,从中找到满足条件的的索引,从中找到满足条件的元组,找到后就将表元组,找到后就将表1中的第一个元组与该元组拼接起来,形中的第一个元组与该元组拼接起来,形成结果表中的一个元组。其中,连接字段指连接谓词
339、中的列名。成结果表中的一个元组。其中,连接字段指连接谓词中的列名。连接条件中的各连接字段类型必须是可比的,但不必是相同的。连接条件中的各连接字段类型必须是可比的,但不必是相同的。索引连接索引连接01:32:14pp 查询查询查询查询(3)嵌套查询)嵌套查询一个一个SELECT-FROM-WHERE语句称为一个查询块。将一个查语句称为一个查询块。将一个查询块嵌套在另一个查询块的询块嵌套在另一个查询块的WHERE子句或子句或HAVING短语的条短语的条件中的查询称为嵌套查询。件中的查询称为嵌套查询。例如:例如:查询选修查询选修2号课程的全体学生。号课程的全体学生。SELECTSname /外层查询
340、外层查询/父查询父查询FROMStudentWHERESnoIN(SELECTSno/内层查询内层查询/子查询子查询FROMSCWHERECno=2);01:32:14l l 查询查询查询查询(3)嵌套查询)嵌套查询注意:注意:(1)在子查询里面不能使用)在子查询里面不能使用ORDERBY子句。子句。(2)嵌套查询可以分为不相关子查询和相关子查询。不相关)嵌套查询可以分为不相关子查询和相关子查询。不相关子查询是指子查询的查询条件不依赖于父查询,是由里向外逐子查询是指子查询的查询条件不依赖于父查询,是由里向外逐层处理,即每个子查询在上一级查询处理之前求解,子查询的层处理,即每个子查询在上一级查询
341、处理之前求解,子查询的结果用于建立其父查询的查找条件。相关子查询则是指子查询结果用于建立其父查询的查找条件。相关子查询则是指子查询的查询条件依赖于父查询,首先取外层查询中表的第一个元组,的查询条件依赖于父查询,首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若根据它与内层查询相关的属性值处理内层查询,若WHERE子子句返回值为真,则取此元组放入结果表。然后再取外层表的下句返回值为真,则取此元组放入结果表。然后再取外层表的下一个元组。重复这一过程,直至外层表全部检查完为止。一个元组。重复这一过程,直至外层表全部检查完为止。(3)子查询的谓词有很多,例如,带有)子查询的谓
342、词有很多,例如,带有IN谓词的子查询、带谓词的子查询、带有比较运算符的子查询、带有有比较运算符的子查询、带有ANY或或ALL谓词的子查询和带有谓词的子查询和带有EXISTS谓词的子查询。谓词的子查询。01:32:14pp 查询查询查询查询(3)集合查询)集合查询SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。集合操作主要包括并操作(UNION)、交操作(INTERSECT)和差操作(MINUS)。参加UNION操作的各结果表的列数必须相同,对应项的数据类型也必须相同。语法格式:UNION例如:查询信息系的学生及年龄不小于20岁的学生。SELECT*FROM
343、StudentWHERESdept=ISUNIONSELECT*FROMStudentWHERESage=20;01:32:159.5 9.5 关系数据库结构化查询语言关系数据库结构化查询语言SQLSQL lSQL的特点的特点 lSQL支持的关系数据模式支持的关系数据模式 l数据定义数据定义 l查询查询 l数据控制数据控制 l数据更新数据更新 l试图试图01:32:15pp 数据更新数据更新数据更新数据更新(1)插入数据)插入数据语法格式:INSERTINTO(,)VALUES(,);其功能是将新元组插入指定表中。INTO子句指定要插入数据的表名及属性列,属性列的顺序可以与表定义中的顺序不一致
344、,当没有指定属性列时,表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致,当指定部分属性列时插入的元组在其余属性列上取空值。VALUES子句则提供的值必须在值的个数和值的类型上与INTO子句匹配。例如:将一个新学生记录(学号:110810;姓名:吴震;性别:男;所在系:IS;年龄:20岁)插入Student表中。INSERTINTOStudentVALUES(110810,吴震,男,IS,20);插入单个元组插入单个元组01:32:15l l 数据更新数据更新数据更新数据更新(1)插入数据)插入数据语法格式:INSERTINTO(,)子查询;其功能是将子查询结果插入指定表中。INT
345、O与子查询语句分别对应插入单个元组时INTO与VALUES子句对应的规则。例如:对每一个系,求学生的平均年龄,并把结果存入数据库。第一步,建表。CREATETABLEDeptage(SdeptCHAR(15)/*系名*/AvgageSMALLINT);/*学生平均年龄*/第二步,插入数据。INSERTINTODeptage(Sdept,Avgage)SELECTSdept,AVG(Sage)FROMStudentGROUPBYSdept;插入子查询结果插入子查询结果01:32:15l l 数据更新数据更新数据更新数据更新(2)修改数据)修改数据语法格式:UPDATESET=,=WHERE;其功
346、能是修改指定表中满足WHERE子句条件的元组。SET子句指定了修改方式、要修改的列以及修改后的取值;WHERE子句则指定了要修改的元组。缺省表示要修改表中的所有元组。共有三种修改方式:修改某一个元组的值、修改多个元组的值和带子查询的修改语句。DBMS在执行修改语句时会检查修改操作是否破坏表上已定义的完整性规则。例如:将学生95001的年龄改为22岁。UPDATEStudentSETSage=22WHERESno=95001;01:32:15pp 数据更新数据更新数据更新数据更新(3)删除数据)删除数据语法格式:DELEFROMWHERE;其功能是删除指定表中满足WHERE子句条件的元组;WHE
347、RE子句指定要删除的元组。默认表示要修改表中的所有元组。共有三种删除方式:删除某一个元组的值,删除多个元组的值,带子查询的删除语句。例如:删除学号为110810的学生记录。DELETEFROMStudentWHERESno=110810;01:32:169.5 9.5 关系数据库结构化查询语言关系数据库结构化查询语言SQLSQL lSQL的特点的特点 pSQL支持的关系数据模式支持的关系数据模式 p数据定义数据定义 l查询查询 p数据控制数据控制 数据更新数据更新 p试图试图01:32:16 视图视图视图视图视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制。视图是从一个或几个
348、基本表(或视图)导出的表,它并不是一个实际存储在物理介质上的表,而是一个虚表。在数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍然在原来的基表中,这样就不会出现数据冗余。当基表中的数据发生变化时,从视图中查询出的数据也随之改变。视图就像一个窗口一样,可以通过它拿取自己感兴趣的数据,对自己不感兴趣的则可以通过视图进行屏蔽,同时也可以保护表中的敏感数据。视图一经定义后,具有与基本表相同的操作,即也可以被定义、查询和删除,但是对视图的更新操作(增加、删除、修改)则有一定的限制。01:32:16l l 视图视图视图视图(1)定义视图)定义视图语法格式:CREATEVIEW(,)ASWITH
349、CHECKOPTION;其中:(1)子查询可以是任意复杂的SWLECT语句,但通常不允许含有ODERBY子句和DISTINCT短语。WITHCHECKOPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入和删除的行满足视图定义的谓词条件。(2)DBMS执行CREATEVIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。只有当使用该视图进行操作时才会执行SELECT语句。(3)组成视图的属性列名全部省略或全部指定,当省略时由子查询中SELECT目标列中的诸字段组成。(4)常见的视图形式行列子集视图包括WITHCHECKOPTION的视图、
350、基于多个基表的视图、基于视图的视图、带表达式的视图和分组视图。01:32:16l l 视图视图视图视图(1)定义视图)定义视图例如:建立信息系学生的视图。CREATEVIEWIS_StudentASSELECTSno,Sname,SageFROMStudentWHERESdept=IS;注意:从单个基本表导出只是去掉了基本表的某些行和某些列,但保留了码,这类视图称为行列子集视图,如本例中的IS_Student;视图不仅可以建立在单个基表上,而且也可以建立在多个视图上。01:32:16l l 视图视图视图视图(2)删除视图)删除视图语法格式:DROPVIEW;其功能是从数据字典中删除指定的视图定
351、义。由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除。删除基表时,由该基表导出的所有视图定义全部须显式删除。01:32:17l l 视图视图视图视图(3)查询视图)查询视图从用户角度看,查询视图与查询基本表相同。DBMS实现视图查询的方法主要有实体化视图(viewmaterialization)法和视图消解(viewresolution)法。1)实体化视图法实体化视图法执行对视图的查询时首先进行有效性检查,检查所查询的视图是否存在。如果存在,执行视图定义,将视图临时实体化,生成临时表;然后将查询视图转换为查询临时表,查询完毕删除被实体化的视图(临时表)。2)视图消解法视图消
352、解法也是先进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义;然后把视图定义中的子查询与用户的查询结合起来,转换成等价的对基本表的查询;最后执行修正后的查询。01:32:17l l 视图视图视图视图(3)查询视图)查询视图例如:在信息系学生的视图中找出年龄小于20岁的学生。SELECTSno,SageFROMIS_StudentWHERESage20;IS_Student视图的定义:CREATEVIEWIS_StudentASSELECTSno,Sname,SageFROMStudentWHERESdept=IS;01:32:17l l 视图视图视图视图(4)
353、更新视图)更新视图从用户角度看,更新视图与更新基本表相同,也分为视图实体化法和视图消解法两种。其方法与查询视图中所讲的过程一样。指定WITHCHECKOPTION子句后,DBMS在更新视图时会进行检查,防止用户通过视图对不属于视图范围内的基本表数据进行更新。例如:将信息系学生视图IS_Student中学号110810的学生姓名改为“吴辰”。UPDATEIS_StudentSETSname=吴辰WHERESno=110810;转换后的语句:UPDATEStudentSETSname=吴辰WHERESno=110810ANDSdept=IS;注意:一些视图是不可更新的,因为对这些视图的更新不能唯一
354、地有意义地转换成对相应基本表的更新(对两类方法均如此)。01:32:17pp 视图视图视图视图(5)视图的作用)视图的作用视图的作用主要包括:视图中数据不是直接来自基本表时,定义视图能够简化用户的操作;视图使不同用户以不同方式看待同一数据,适应数据库共享的需要;视图对重构数据库也提供了一定程度的逻辑独立性;视图能够对机密数据提供安全保护,对不同用户定义不同视图,使每个用户只能看到他有权看到的数据;通过WITHCHECKOPTION对关键数据定义操作时间的限制。例如:建立2号课程的选课视图,并要求透过该视图进行的更新操作只涉及2号课程,同时对该视图的任何操作只能在工作时间进行。CREATEVIE
355、WIS_SCASSELECTSno,Cno,GradeFROMSCWHERECno=2ANDTO_CHAR(SYSDATE,HH24)BETWEEN9AND17ANDTO_CHAR(SYSDATE,D)BETWEEN2AND6WITHCHECKOPTION;01:32:179.5 9.5 关系数据库结构化查询语言关系数据库结构化查询语言SQLSQL uSQL的特点的特点 lSQL支持的关系数据模式支持的关系数据模式 p数据定义数据定义 l查询查询 l数据控制数据控制 l数据更新数据更新 l试图试图01:32:18l l 数据控制数据控制数据控制数据控制数据控制亦称为数据保护,包括数据的安全性控
356、制、完整性控制、并发数据控制亦称为数据保护,包括数据的安全性控制、完整性控制、并发控制和恢复。控制和恢复。SQL语言提供了数据控制功能,能够在一定程度上保证数据库语言提供了数据控制功能,能够在一定程度上保证数据库中数据的安全性、完整性,和一定的并发控制及恢复能力。中数据的安全性、完整性,和一定的并发控制及恢复能力。(1)数据库的完整性是指数据库中数据的正确性与相容性。)数据库的完整性是指数据库中数据的正确性与相容性。SQL语言定义语言定义完整性约束条件的语句有完整性约束条件的语句有CREATETABLE语句和语句和ALTERTABLE语句。语句。(2)数据库的并发控制是指当多个用户并发地对数据
357、库进行操作时,对他)数据库的并发控制是指当多个用户并发地对数据库进行操作时,对他们加以控制、协调,以保证并发操作正确执行,保持数据库的一致性。们加以控制、协调,以保证并发操作正确执行,保持数据库的一致性。SQL语言并发控制能力有提供事务、事务开始、事务结束、提交等概念。首先由语言并发控制能力有提供事务、事务开始、事务结束、提交等概念。首先由用户或用户或DBA把授权决定告知系统,授权可以通过把授权决定告知系统,授权可以通过SQL的的GRANT和和REMOKE字句来实现,然后字句来实现,然后DBMS把授权结果存入数据字典。当用户提出操作请求时,把授权结果存入数据字典。当用户提出操作请求时,DBMS
358、根据授权定义进行检查,以决定是否执行操作请求。根据授权定义进行检查,以决定是否执行操作请求。(3)数据库的恢复是指当发生各种类型的故障导致数据库处于不一致状态)数据库的恢复是指当发生各种类型的故障导致数据库处于不一致状态时,将数据库恢复到一致状态的功能。时,将数据库恢复到一致状态的功能。SQL语言恢复功能有提供事务回滚语言恢复功能有提供事务回滚(UNDO)、重做()、重做(REDO)等概念。)等概念。(4)数据库的安全性是保护数据库,防止不合法的使用所造成的数据泄露)数据库的安全性是保护数据库,防止不合法的使用所造成的数据泄露和破坏。保证数据安全性的主要措施有存取控制,即控制用户只能存取他有和
359、破坏。保证数据安全性的主要措施有存取控制,即控制用户只能存取他有权存取的数据,规定不同用户对于不同数据对象所允许执行的操作。权存取的数据,规定不同用户对于不同数据对象所允许执行的操作。01:32:18pp 数据控制数据控制数据控制数据控制(1)授权)授权授权是指实现数据库安全性的一种主要手段。授权是指实现数据库安全性的一种主要手段。SQL通过通过GRANT语句来实语句来实现对用户的授权操作。现对用户的授权操作。语法格式:语法格式:GRANT,.ONTO,.WITHGRANTOPTION;其功能是,将对指定操作对象的指定操作权限授予指定的用户,并且不同的其功能是,将对指定操作对象的指定操作权限授
360、予指定的用户,并且不同的操作对象有不同的操作权限,常见的不同对象允许的操作权限如下表所示。操作对象有不同的操作权限,常见的不同对象允许的操作权限如下表所示。对象对象对象类型对象类型操作权限操作权限属性列TABLESELECT, INSERT, UPDATE,DELETE, ALL PRIVIEGES视图TABLESELECT, INSERT, UPDATE,DELETE, ALL PRIVIEGES基本表TABLESELECT, INSERT, UPDATE,DELETE ALTER, INDEX,ALL PRIVIEGES数据库DATABASECREATETAB01:32:18pp 数据控制
361、数据控制数据控制数据控制(2)收回权限)收回权限当需要收回原来对某个用户赋予权限时,使用SQL提供的REVOKE语句就可以从指定用户那里收回对指定对象的指定权限。语法格式:REVOKE,ONFROM,;例如:把用户U4修改学生学号的权限收回。REVOKEUPDATE(Sno)ONTABLEStudentFROMU4;注意:权限的收回具有级联属性,即系统将收回直接或间接从U4处获得的对SC表的INSERT权限时,如果U4将该权限有授予了U6和U7,则也一并收回U6和U7的INSERT权限。01:32:18SQL语句为编程提供了一定的灵活性,用户可以在程序运行过程中根据实际需要输入WHERE子句和
362、HAVING子句中某些变量的值。这些SQL语句的共同特点是,语句中主变量的数据类型和个数在预编译是确定的,只有主变量的值是程序运行过程中动态输入的。因此,这类SQL语句称为静态SQL语句,即嵌入式SQL。如果在预编译时,SQL语句正文、主变量个数、主变量的数据类型和SQL语句中引用过的数据对象(如列、基本表、视图等)这些信息不能确定时,必须使用动态SQL技术,即动态SQL语句。9.6 9.6 动态动态SQLSQL01:32:189.6 9.6 动态动态SQLSQL p静态静态SQL语句语句 l动态动态SQL01:32:19l l 静态静态静态静态SQLSQL语句语句语句语句静态SQL语句提供的
363、编程灵活性在许多情况下仍显得不足,有时候需要编写更为通用的程序。例如,查询学生选课关系SC,任课教师想查询选修某门课程的所有学生的学号及其成绩,辅导员想查看某个学生选修的所有课程的课程号及相应的成绩,学生想查看某门课程的成绩,等等,也就是说,查询条件是不确定的,要查询的属性列也是不确定的,这时就无法用一条静态SQL语句实现了。01:32:19l l 动态动态动态动态SQLSQL(1)语句可变可接收完整的SQL语句,即允许用户在程序运行时临时输入完整的SQL语句。动态动态SQL技术允许在程序运行过程中临时技术允许在程序运行过程中临时“组装组装”SQL语句,主要语句,主要包括语句可变、条件可变和数
364、据库对象及查询条件均可变三种形式。包括语句可变、条件可变和数据库对象及查询条件均可变三种形式。01:32:19l l 动态动态动态动态SQLSQL(2)条件可变对于非查询语句,条件子句有一定的可变性。例如,删除学生选课记录,既可以是因某门课临时取消,需要删除有关该课程的所有选课记录,也可以是因为某个学生退学,需要删除该学生的所有选课记录。对于查询语句,SELECT子句是确定的,即语句的输出是确定的,其他子句(如WHERE子句、HAVING短语)有一定的可变性。例如查询学生人数,可以是查某个系的学生总数,查某个性别的学生人数,查某个年龄段的学生人数,查某个系某个年龄段的学生人数等,这时SELEC
365、T子句的目标列表达式是确定的(COUNT(*)),但WHERE子句的条件是不确定的。01:32:19l l 动态动态动态动态SQLSQL(3)数据库对象及查询条件均可变对于查询语句,SELECT子句中的列名、FROM子句中的表名或视图名、WHERE子句和HAVING短语中的条件等均可由用户临时构造,即语句的输入和输出可能都是不确定的。对于非查询语句,涉及的数据库对象及条件也是可变的。这几种动态形式几乎可覆盖所有的可变要求。为了实现上述三种可变形式,SQL提供了相应的语句,如EXECUTEIMMEDIATE、PREPARE、EXECUTE、DESCRIBE等。使用动态SQL技术更多的是涉及程序设
366、计方面的知识,而不是SQL语言本身,这里就不详细介绍了,有兴趣的读者可以参阅有关书籍。01:32:199.7 9.7 数据库技术及数据库技术及SQLSQL发展趋势发展趋势当今,数据库技术与网络通信技术、面向对象程序设计技术、当今,数据库技术与网络通信技术、面向对象程序设计技术、并行计算技术、云计算技术、人工智能技术等互相渗透,互相结并行计算技术、云计算技术、人工智能技术等互相渗透,互相结合,成为当前数据库技术发展的主要特征,如分布式数据库系统、合,成为当前数据库技术发展的主要特征,如分布式数据库系统、并行数据库系统、知识数据库系统、主动数据库系统、多媒体数并行数据库系统、知识数据库系统、主动数
367、据库系统、多媒体数据库系统、模糊数据库系统、工程数据库系统、统计数据库系统、据库系统、模糊数据库系统、工程数据库系统、统计数据库系统、空间数据库系统、实时数据库系统、内存数据库系统、时态数据空间数据库系统、实时数据库系统、内存数据库系统、时态数据库系统、时空数据库系统和移动数据库系统等。库系统、时空数据库系统和移动数据库系统等。目前,发展比较迅速的是面向对象数据库系统(目前,发展比较迅速的是面向对象数据库系统(objectorienteddatabasesystem,OODBS)。而)。而SQL语言作为功能语言作为功能强大的结构化查询语言,应用于大多数的数据库系统,即使现在强大的结构化查询语言
368、,应用于大多数的数据库系统,即使现在数据库技术发展有越来越多模式化的趋势,但数据库技术发展有越来越多模式化的趋势,但SQL语言依旧是应语言依旧是应用最为广泛的查询语言。用最为广泛的查询语言。01:32:20第第1010章章统一建模语言统一建模语言UML01:32:23 第十章第十章 统一建模语言统一建模语言UML统一建模语言统一建模语言UML是软件开发过程中的面向对象建是软件开发过程中的面向对象建模语言和建模工具,也是面向对象建模所必需的描述手模语言和建模工具,也是面向对象建模所必需的描述手段和处理方法。软件开发者通过段和处理方法。软件开发者通过UML学习,能够有效地学习,能够有效地培养面向对
369、象建模语言应用能力,编制高效可靠的程序,培养面向对象建模语言应用能力,编制高效可靠的程序,为面向对象分析和设计能力奠定基础。为面向对象分析和设计能力奠定基础。本章简要介绍统一建模语言本章简要介绍统一建模语言UML基本知识,并从面基本知识,并从面向对象技术的角度分析了向对象技术的角度分析了UML建模和建模工具,从软件建模和建模工具,从软件生命周期的角度详细讲述了生命周期的角度详细讲述了UML视图建模。并通过一个视图建模。并通过一个应用实例应用实例汽车租赁系统,给出软件系统分析设计中汽车租赁系统,给出软件系统分析设计中使用使用UML建模的全过程,主要包括需求分析、系统设计建模的全过程,主要包括需求
370、分析、系统设计和系统模型等。和系统模型等。01:32:23本章内容提要本章内容提要: :lUML基本知识基本知识l面向对象分析技术与面向对象分析技术与UMLlUML建模工具建模工具lUML视图建模视图建模l应用实例应用实例-汽车租赁系统汽车租赁系统 第十章第十章 统一建模语言统一建模语言UML01:32:2310.1 10.1 UML基本知识基本知识l lUMLUML发展历史发展历史发展历史发展历史l lUMLUML基本概念基本概念基本概念基本概念l lUMLUML特点特点特点特点01:32:24l lUMLUML发展历史发展历史发展历史发展历史UML(unifiedmodelinglangu
371、age)称为统一建)称为统一建模语言或标准建模语言。模语言或标准建模语言。1997年依据年依据OMG标准创建了标准创建了UML,它是支持模型化和软件系统开发的图形化语言,它是支持模型化和软件系统开发的图形化语言,对软件工程生命周期五个阶段(软件系统需求分析、系对软件工程生命周期五个阶段(软件系统需求分析、系统分析与设计、系统实现、系统测试和系统维护)提供统分析与设计、系统实现、系统测试和系统维护)提供了模型化和可视化支持。了模型化和可视化支持。面向对象统一建模语言诞生于面向对象统一建模语言诞生于20世纪世纪70年代中期,年代中期,19891994年其数量从不到十种增加到了五十多种。年其数量从不
372、到十种增加到了五十多种。在众多的建模语言中,语言的创造者努力推崇自己的产在众多的建模语言中,语言的创造者努力推崇自己的产品,并在实践中不断完善。由于使用者(用户)并不了品,并在实践中不断完善。由于使用者(用户)并不了解不同建模语言的优缺点及相互之间的差异,因而很难解不同建模语言的优缺点及相互之间的差异,因而很难选择合适的建模语言,于是爆发了一场选择合适的建模语言,于是爆发了一场“方法大战方法大战”。01:32:24l lUMLUML发展历史发展历史发展历史发展历史目前较流行的方法有目前较流行的方法有Booch,Rumbaugh(OMT),),Jacobson(OOSE),),Coad-Your
373、don等。其中等。其中Booch擅长擅长设计,设计,OMT擅长分析,擅长分析,OOSE则擅长业务建模。则擅长业务建模。Rumbaugh于于1994年离开年离开GE后,加入后,加入Booch所在的所在的Rational公司,并研究公司,并研究一种统一的方法。一年之后,一种统一的方法。一年之后,UnifiedMethod0.8诞生,同年诞生,同年Rational收购了收购了Jacobson所在的所在的ObjectoryAB公司。经过三公司。经过三年的努力,年的努力,UML0.9和和UML0.91于于1996年相继面世。年相继面世。为建立为建立UML标准,标准,UML创始人创始人Booch等邀请计算
374、机软件工等邀请计算机软件工程界的著名人士,以及著名的企业如程界的著名人士,以及著名的企业如IBM、HP、DEC、Microsoft、Oracle等开展等开展UML评估并提出修改意见。评估并提出修改意见。1997年年1月月Rational公司向公司向OMG递交了递交了UML1.0标准文本,同年标准文本,同年11月月OMG宣布接受宣布接受UML,并认定为标准的建模语言。随后,并认定为标准的建模语言。随后OMG相相继发布了继发布了UML1.1、UML1.2、UML1.3、UML1.4等标准,等标准,2001年年OMG发布了发布了UML2.0标准。标准。目前,目前,UML仍处在不断发展和完善阶段。仍处
375、在不断发展和完善阶段。01:32:2410.1 10.1 UML基本知识基本知识l lUMLUML发展历史发展历史发展历史发展历史l lUMLUML基本概念基本概念基本概念基本概念l lUMLUML特点特点特点特点01:32:24l lUMLUML基本概念基本概念基本概念基本概念标准的统一建模语言UML内容,主要包括以下五类。第一类是用例图。它从用户角度描述系统功能,并指出各功能的操作者。第二类是静态图(staticdiagram)。它包括类图、对象图和包图。类图描述系统中类的静态结构,它不仅定义系统中的类,表示类之间的联系如关联、依赖、聚合等,还包括类的内部结构(类的属性和操作)。类图在系统
376、的整个生命周期都是有效的。对象图是类图的实例,它使用与类图完全相同的标识。其不同点在于对象图显示类的多个对象实例,而不是实际的类。一个对象图是类图的一个实例。由于对象存在生命周期,因此对象图只能在系统某一时间段存在。包图由包和包之间的关系组成,它用于描述系统的分层结构。1)UML内容分类内容分类01:32:24l lUMLUML基本概念基本概念基本概念基本概念第三类是行为图(behaviordiagram)。它描述系统的动态模型和组成对象间的交互关系,包括状态图和活动图。状态图描述类的对象所有可能的状态以及事件发生时状态的转移条件。通常,状态图是对类图的补充。在实际运用中并不需要为所有的类画状
377、态图,仅为那些有多个状态其行为受外界环境的影响并且发生改变的类画状态图。活动图描述满足用例要求所要进行的活动以及活动间的约束关系,有利于识别并行活动。第四类是交互图(interactivediagram)。它描述对象间的交互关系,包括时序图和协作图。时序图强调对象之间消息发送的顺序,同时显示对象之间的交互。协作图描述对象间的协作关系。协作图与时序图相似,它们显示对象间的动态合作关系。协作图除显示信息交换外,还显示对象以及它们之间的关系。在应用中,如果强调时间和顺序,则使用时序图;如果强调上下级关系,则选择协作图。1)UML内容分类内容分类01:32:25l lUMLUML基本概念基本概念基本概
378、念基本概念第五类是实现图(implementationdiagram)。它包括组件图和配置图。组件图描述代码组件的物理结构及各组件之间的依赖关系,其中,一个组件可能是一个资源代码组件、一个二进制组件或一个可执行部件。组件图包含逻辑类或实现类的有关信息,有助于分析和理解组件之间的相互影响程度。配置图定义系统中软硬件的物理体系结构。它可以显示实际的计算机和设备(用结点表示)以及它们之间的连接关系,也可显示连接的类型及部件之间的依赖性。在结点内部,放置可执行部件和对象,以显示结点跟可执行软件单元的对应关系。1)UML内容分类内容分类01:32:25l lUMLUML基本概念基本概念基本概念基本概念从
379、应用的角度看,采用面向对象技术设计系统时,UML建模机制通过三步完成。第一步是描述系统需求。第二步根据系统需求建立系统的静态模型及系统设计的结构。第三步是描述系统的行为。其中在第一步与第二步中所建立的模型都是静态的,它包括用例图、类图、对象图、组件图和配置图等五种图形,而第三步中所建立的模型可以执行,或表示执行时的时序状态或交互关系,它包括状态图、活动图、时序图和协作图等四种图形。因此,UML建模语言的主要内容可以归纳为静态建模机制和动态建模机制两大类。2)UML建模机制建模机制01:32:2510.1 10.1 UML基本知识基本知识l lUMLUML发展历史发展历史发展历史发展历史l lU
380、MLUML基本概念基本概念基本概念基本概念l lUMLUML特点特点特点特点01:32:25l lUMLUML特点特点特点特点(1)UML统一了Booch、OMT和OOSE等方法中的基本概念。(2)UML吸取了面向对象技术领域中其他流派的优点,包括非面向对象(OO)方法,还融入了面向对象领域中其他学者的思想,换句话讲,UML思想并不是UML的开发者们发明的,而是开发者们依据最优秀的OO方法和丰富的计算机科学实践经验综合提炼而成的。(3)UML在演变过程中还提出了一些新的概念。例如,在UML标准中新加了模板、职责、扩展机制、线程、过程、分布式、并发、模式、合作、活动图等新概念,并能清晰地区分类型
381、、类和实例、细化、接口和组件等概念。UML的主要特点可以归纳为以下三点。的主要特点可以归纳为以下三点。01:32:2510.2面向对象分析技术与面向对象分析技术与UMLl l 面向对象分析技术面向对象分析技术面向对象分析技术面向对象分析技术l l 采用采用采用采用UMLUML进行面向对象分析进行面向对象分析进行面向对象分析进行面向对象分析01:32:26l l 面向对象分析技术面向对象分析技术面向对象分析技术面向对象分析技术面向对象分析与设计(OOA&D)是继传统的过程化程序设计之后,软件技术的又一重大变革。它最基本的原则就是抽象,即把一类具有相同属性和行为的实体抽象成为一个类(class),
382、再通过把类实例化成对象(object)来映射现实世界中的某一个具体实体。对象通过操作(operation)来对外提供相应的服务,在对象模型中,只需要描述对象所实现的功能和封装操作实现的细节。UML的目标是以面向对象图的方式来描述任何类型的系统,具有很宽的应用领域。UML最常用的是建立软件系统的模型,也可以用于描述非软件领域的系统,如机械系统、企业机构或业务过程,以及处理复杂数据的信息系统、具有实时要求的工业系统或工业过程等。总之,UML是一个通用的标准建模语言,可以对任何具有静态结构和动态行为的系统进行建模。01:32:2610.2面向对象分析技术与面向对象分析技术与UML 面向对象分析技术面
383、向对象分析技术面向对象分析技术面向对象分析技术l l 采用采用采用采用UMLUML进行面向对象分析进行面向对象分析进行面向对象分析进行面向对象分析01:32:26l l 采用采用采用采用UMLUML进行面向对象分析进行面向对象分析进行面向对象分析进行面向对象分析采用UML进行面向对象分析主要包括构建用例模型和构建分析模型两种方法。1)构建用例模型)构建用例模型UML是可视化的建模语言,它采用图形符号表示系统中的对象和关系。在实际开发系统时,首先要描述系统需求,然后根据需求建立系统的用例模型。而系统的用例模型是需求分析阶段的最终产品,它包括一个完整的用例图以及对每一个用例的详细描述,从用例模型中
384、,可以得到系统的一个总体概貌。01:32:26l l 采用采用采用采用UMLUML进行面向对象分析进行面向对象分析进行面向对象分析进行面向对象分析2)构建分析模型)构建分析模型从实际应用的角度出发,采用面向对象技术不仅能分析系统,而且能建立系统的分析模型;但分析模型是建立在用例模型的基础上的,因此,在获得每一次迭代中的每一个用例过程中,还需要完成发现候选对象、描述对象间的交互和描述类任务。01:32:26l l 采用采用采用采用UMLUML进行面向对象分析进行面向对象分析进行面向对象分析进行面向对象分析(1)发现候选对象。识别并发现构成系统的对象是分析过程中重要的任务之一。而在分析过程中,分析
385、模型中常用的三种对象类型如下。实体对象(entityobject)。一般来说,这种对象比较容易发现,它用来描述问题的关键部分的名词。识别方法:列出所有的数据、行为以及听来很重要的名词,然后将数据和行为分配到不同类型的实体对象中。边界对象(boundaryobject)。它用来描述系统将如何同参与者交互。识别方法:观察用例图中参与者与用例之间的关系,通常,在分析模型中,每一对参与者/用例都构成了一个边界对象。控制对象(controlobject)。在用例的边界对象和实体对象交互过程中,控制对象可以充当它们的中介。在边界对象访问实体对象时,控制对象将一系列复杂的请求封装成通用的工作流,这样访问就会
386、变得简单。识别方法:在分析模型中,每一个用例都应该有一种控制对象。01:32:27l l 采用采用采用采用UMLUML进行面向对象分析进行面向对象分析进行面向对象分析进行面向对象分析(2)描述对象间的交互。当识别了实体类、边界类和控制类之后,需要确定这些相关联的对象是如何交互来实现用例的,同时在这个过程中会产生对象的交互图(interactiondiagram),以及对象之间的交互行为图。对象间的交互图是描述每一个对象如何通过合作来完成事件流的。而对象间的合作过程通过以下三步完成。第一步,将已经识别的参与对象加到时序图中,可以按照一个简单的模式来安排对象actor、boundary、contr
387、ol、entity,即每一个用例是由一个参与者触发的,在参与者和用例之间有一个边界对象。同样地,在边界对象和实体对象之间会有一个控制对象作为联系中介。第二步,从参与者开始分析,寻找交互行为。对象通过调用方法来交互,这种交互被称为“消息”。一个对象向另一个对象发出消息,调用方法的实现是在接受方的对象中,而每一个消息都是按照它调用的方法来命名的。第三步,验证消息序列。从最后一个序列开始反着进行,不断地询问每一个对象是否拥有信息。01:32:27l l 采用采用采用采用UMLUML进行面向对象分析进行面向对象分析进行面向对象分析进行面向对象分析(3)描述类。分析模型中还包括一种描述类的图,它是用来描
388、述对象交互时要用到的类的方法及类的关系。01:32:2710.3 UML10.3 UML建模工具建模工具目前,常见的目前,常见的UML建模工具主要包括建模工具主要包括RationalRose、Visio、EnterpriseArchitect和和PowerDesigner四种。四种。01:32:27l lUMLUML建模工具建模工具建模工具建模工具RationalRose是一种基于UML的建模工具。在面向对象应用程序开发领域中,RationalRose是影响其发展的一个重要因素。它自推出以来就受到了业界的瞩目,并一直引领着可视化建模工具的发展。越来越多的软件公司和开发团队开始或者已经采用Rat
389、ionalRose进行大型项目开发的分析、建模与设计等。RationalRose的特点是:由于RationalRose支持使用多种构件和多种语言的复杂系统建模,它非常方便用户的使用;利用双向工程技术可以实现迭代式开发;团队管理特性支持大型、复杂的项目。同时,RationalRose与微软VisualStudio系列工具中GUI的完美结合所带来的方便性,使得它成为绝大多数开发人员首选建模的工具,它不仅是市场上第一个提供对基于UML的数据建模和Web建模支持的工具,而且还为其他一些领域提供支持,如用户定制和产品性能改进等。1)RationalRose工具工具01:32:27l lUMLUML建模工
390、具建模工具建模工具建模工具Visio是UML建模工具中的一种。尽管Visio原本仅是一种画图工具,即能够用来描述各类工程领域的图形,如电路图、房屋结构图等,但是在Visio2000版本中具有了软件分析设计功能,以及代码生成的全部功能。目前,Visio2000是最能够用图形方式来表达各种商业图形用途的工具(在软件开发中,UML支持仅仅是一个缩影)。例如:Visio能够很好地兼容微软的Office产品,使Visio能够把图形直接复制或者内嵌到Word的文档中;Visio支持微软的产品(如VS.NET、VisualBasic,VisualC+,MSSQLServer等)代码自动生成。实际上,Visi
391、o用于图形语义的描述比较方便,但是用于软件开发过程的迭代开发则有点牵强。2)Visio工具工具01:32:28l lUMLUML建模工具建模工具建模工具建模工具EnterpriseArchitect(EA)是一个功能全和基于UML的VisualCASE工具,它主要用于设计、编写、构建并管理以目标为导向的软件系统。它支持用户案例、商务流程模式,以及动态的图表、分类、界面、协作、结构和物理模型。此外,它还支持C+、Java、VisualBasic、Delphi、C#和VB.Net。EnterpriseArchitect采用通用的UMLProfile机制,旨在加载和运行不同的Profiles,并为U
392、MLProfiles指定一个特定格式的XML文件。3)EnterpriseArchitect工具工具01:32:28 UMLUML建模工具建模工具建模工具建模工具PowerDesigner初衷是面向数据库建模的一种数据库建模工具。PowerDesigner7.0版问世后,PowerDesigner已具有支持面向对象的系统开发和UML等功能。PowerDesigner为继续发挥在数据库建模方面的优势,全面支持市场90%左右的数据库建模需求,特别是用户在使用UML分析生成代码中,PowerDesigner可以更好地支持Sybase的产品,以及其他面向对象语言如C+、Java、VisualBasic
393、和C#等。除上述优势外,PowerDesigner不仅全面支持UML系列版本的用例图、时序图和类图、活动图表和组件图等,而且改进了面向对象分析与设计(OOAD)方法,增强了与系统开发过程的集成。4)PowerDesigner工具工具01:32:2810.4 UML10.4 UML视图建模视图建模为适应系统开发过程的中不同阶段描述需求,为适应系统开发过程的中不同阶段描述需求,UML视图主要作视图主要作用于系统开发的需求分析阶段和系统测试阶段。用于系统开发的需求分析阶段和系统测试阶段。下面以在线新闻系统建模为例,将给出下面以在线新闻系统建模为例,将给出UML面向对象建模过程,面向对象建模过程,及该
394、系统在设计时,应用及该系统在设计时,应用RationalRose建模工具来辅助对系统进行建模工具来辅助对系统进行面向对象的分析和设计过程。面向对象的分析和设计过程。01:32:2810.4 UML10.4 UML视图建模视图建模 l软件系统需求分析视图软件系统需求分析视图 l软件系统的分析与设计视图软件系统的分析与设计视图 l软件系统的实现与配置视图软件系统的实现与配置视图01:32:28l l 软件系统需求分析视图软件系统需求分析视图软件系统需求分析视图软件系统需求分析视图从需求到业务用例图创建主要通过两步完成。第一步,了解用户需求,并将其转换为业务用例图。如在线新闻系统需求大致描述为:系统
395、主要用来发布新闻,管理员只需要一个,登录后可以在后台发布新闻;任何人可以浏览新闻,浏览者可以注册成为系统会员,注册后可对新闻进行评论;管理员在后台可以对新闻、评论、注册会员进行管理,如修改、删除等。软件系统需求分析视图创建主要包括业务用例图、活动图、系统用例图和用例规约四部分。1)从需求到业务用例图创建从需求到业务用例图创建01:32:29l l 软件系统需求分析视图软件系统需求分析视图软件系统需求分析视图软件系统需求分析视图第二步,依据在线新闻系统需求描述,得到该系统的业务用例图如下图所示。1)从需求到业务用例图创建从需求到业务用例图创建01:32:30l l 软件系统需求分析视图软件系统需
396、求分析视图软件系统需求分析视图软件系统需求分析视图当完成了业务用例图后,要为每一个业务用例绘制一幅活动图。由于活动图描述了这个业务用例中用户可能会进行的操作序列,因此活动图的任务是从业务用例分析出系统用例。例如“新闻管理(ManagementNews)”的活动图,如下图所示。2)从业务用例图到活动图创建从业务用例图到活动图创建01:32:31l l 软件系统需求分析视图软件系统需求分析视图软件系统需求分析视图软件系统需求分析视图需要注意的是,一个“新闻管理”业务用例,分解出N步操作,其中很多“活动”都有可能是一个系统用例。如在下图中,系统中至少要包含登录、注销登录、查看新闻列表、修改新闻和删除
397、新闻备选系统用例。2)从业务用例图到活动图创建从业务用例图到活动图创建01:32:31l l 软件系统需求分析视图软件系统需求分析视图软件系统需求分析视图软件系统需求分析视图当所有的备选系统用例获取后,需要实施备选系统用例合并和筛选。合并是指将相同的用例合并成一个;筛选是指将不符合系统用例条件的备选用例去掉。实践表明,一个系统用例应该是实际使用系统的用户所进行的一个操作。如“查看新闻列表”就不是一个系统用例,因为它仅是某系统用例的一个序列项。因此,根据上述定义可知,最终获取的在线新闻系统用例图如上图所示。3)从活动图到系统用例图创建从活动图到系统用例图创建01:32:32l l 软件系统需求分
398、析视图软件系统需求分析视图软件系统需求分析视图软件系统需求分析视图基于3)获取的系统用例图,针对每一个系统用例实施用例规约。关于用例规约,目前仍没有一个通用的格式,一般可按照习惯的格式进行编写。其遵循的基本原则是,用例规约要“清晰易懂”。如“登录(login)”用例的一个规约如下表所示。4)从系统用例图到用例规约创建从系统用例图到用例规约创建用用 例例 名名 称称登登 录录 系系 统统用例简述用户登录系统用例图主要流程1)用户输入用户名和密码;2)选择用户类型;3)单击登录按钮替代流程)用户名或密码提示错误,回到主流程1,用户重新输入;3b)输入的用户名与类型不一致,回到主流程1,用户重新输入
399、;)当用户单击取消按钮,取消登录01:32:3210.4 UML10.4 UML视图建模视图建模 l软件系统需求分析视图软件系统需求分析视图 l软件系统的分析与设计视图软件系统的分析与设计视图 l软件系统的实现与配置视图软件系统的实现与配置视图01:32:33l l 软件系统的分析与设计视图软件系统的分析与设计视图软件系统的分析与设计视图软件系统的分析与设计视图在完成了在线新闻系统的软件需求分析后,应着手设计业务领域类图。如在线新闻系统业务领域类图,如下图所示。软件系统的分析与设计视图主要包括业务领域类图、实现类图、时序图和协作图的设计。1)业务领域类图设计业务领域类图设计01:32:33l
400、l 软件系统的分析与设计视图软件系统的分析与设计视图软件系统的分析与设计视图软件系统的分析与设计视图实现类图描述的是真正系统的静态结构,并与最后的生产代码完全一致;它与开发平台相关,即必须准确给出系统中的实体类、控制类、界面类、接口等元素以及其中的关系。在实际应用中,实现类图设计不仅复杂,而且与平台技术相关。如欲构建的系统是基于.NET平台,并使用MVC作为表示层,整体使用三层架构,则用户模块体系的实现类图如下所示。2)实现类图实现类图01:32:34l l 软件系统的分析与设计视图软件系统的分析与设计视图软件系统的分析与设计视图软件系统的分析与设计视图为方便用户更好地了解系统间类交互的关系,
401、及有效指导程序员编码,在静态结构基础上,还需要获得动态结构。如用户登录时序图和用户登录协作图,如下图所示。3)时序图和协作图设计时序图和协作图设计用户登录时序图用户登录协作图01:32:3510.4 UML10.4 UML视图建模视图建模 l软件系统需求分析视图软件系统需求分析视图 l软件系统的分析与设计视图软件系统的分析与设计视图 l软件系统的实现与配置视图软件系统的实现与配置视图01:32:35l l 软件系统的实现与配置视图软件系统的实现与配置视图软件系统的实现与配置视图软件系统的实现与配置视图软件系统的实现与配置包括实现视图和配置视图两种。软件系统的实现与配置包括实现视图和配置视图两种
402、。(1)实现视图是指为系统的组件建立模型,主要包括构造应用的软件单元)实现视图是指为系统的组件建立模型,主要包括构造应用的软件单元及各组件之间的依赖关系。这些依赖关系可以用来估计对系统组件的修改给系及各组件之间的依赖关系。这些依赖关系可以用来估计对系统组件的修改给系统可能带来的影响,其影响通常用组件图来表现。统可能带来的影响,其影响通常用组件图来表现。(2)配置视图是指描述位于结点实例上的运行构件实例的安排。其中,)配置视图是指描述位于结点实例上的运行构件实例的安排。其中,结点是一组运行资源,如计算机、设备或存储器,视图允许评估分配结点和资结点是一组运行资源,如计算机、设备或存储器,视图允许评
403、估分配结点和资源分配,通过配置图来表达位于结点实例上的运行构件实例的安排。源分配,通过配置图来表达位于结点实例上的运行构件实例的安排。01:32:35l l 软件系统的实现与配置视图软件系统的实现与配置视图软件系统的实现与配置视图软件系统的实现与配置视图为更好掌握组件图与配置图设计方法,下面以在线新闻为更好掌握组件图与配置图设计方法,下面以在线新闻系统的组件图与配置图设计为例,给出具体的设计方法。系统的组件图与配置图设计为例,给出具体的设计方法。在线新闻系统Web应用程序的页面包括维护页面(MaintenancePage)、新闻发布页面(NewsReleasePage)、评论发表页面(Comm
404、entReleasePage)和登录注册页面(LoginPage)。其对应的组件图如下图所示。1)系统的组件图系统的组件图01:32:37l l 软件系统的实现与配置视图软件系统的实现与配置视图软件系统的实现与配置视图软件系统的实现与配置视图配置图主要是用来说明如何配置系统的软件和硬件。如在线新闻系统由五个结点构成,应用服务器负责整个系统的总体协调工作;数据库负责数据管理;Web应用程序用于发布新闻、发表评论;业务操作模块用于新闻的修改与删除、评论的删除、游客的删除等;信息维护模块用于系统管理员维护整个系统的数据信息等。系统的配置图如下图所示。2)系统的配置图系统的配置图01:32:3710.
405、5 10.5 应用实例应用实例-汽车租赁系统汽车租赁系统本节以汽车租赁系统的分析设计为本节以汽车租赁系统的分析设计为例,介绍如何使用例,介绍如何使用UML建模的过程,整建模的过程,整个过程按照软件的实际流程进行,包括个过程按照软件的实际流程进行,包括需求分析、系统设计和系统模型等。需求分析、系统设计和系统模型等。01:32:3710.5 10.5 应用实例应用实例-汽车租赁系统汽车租赁系统 汽车租赁系统的需求分析汽车租赁系统的需求分析 l系统的系统的UML基本模型基本模型 l汽车租赁系统中的类设计汽车租赁系统中的类设计 l汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计01:3
406、2:38l l 汽车租赁系统的需求分析汽车租赁系统的需求分析汽车租赁系统的需求分析汽车租赁系统的需求分析汽车租赁系统的需求分析只是一个简单的样本,在实际汽车租赁系统的需求分析只是一个简单的样本,在实际应用中,应根据客户的不同需求,在此基础上进行扩展。应用中,应根据客户的不同需求,在此基础上进行扩展。第一步,设计汽车租赁系统的功能需求,主要包括以下第一步,设计汽车租赁系统的功能需求,主要包括以下五个方面。五个方面。(1)客户通过不同的方式(包括电话、前台、网上)预订车辆。(2)能够保存客户的预订申请单。(3)能够保存客户的历史记录。(4)工作人员可以处理客户申请。(5)技术人员可以保存对车辆检修
407、的结果。01:32:38l l 汽车租赁系统的需求分析汽车租赁系统的需求分析汽车租赁系统的需求分析汽车租赁系统的需求分析第二步,设计满足上述需求的汽车租赁系统功能模块,第二步,设计满足上述需求的汽车租赁系统功能模块,主要包括以下四个方面。主要包括以下四个方面。(1)基本数据维护模块。该模块的主要功能有添加车辆信息、修改车辆信息、添加员工信息、修改员工数据。(2)基本业务模块。该模块的主要功能有用户填写预定申请、工作人员处理预定请求、技术人员填写服务记录、工作人员处理还车。(3)数据库管理模块。该模块的主要功能有客户信息管理、车辆信息管理、租赁信息管理、职员信息管理。(4)信息查询模块。该模块的
408、主要功能是查询数据库中的相关信息,包括查询客户信息、查询职员信息、查询车辆信息、查询客户记录。01:32:3810.5 10.5 应用实例应用实例-汽车租赁系统汽车租赁系统 l汽车租赁系统的需求分析汽车租赁系统的需求分析 l系统的系统的UML基本模型基本模型 l汽车租赁系统中的类设计汽车租赁系统中的类设计 l汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计01:32:38l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型在汽车租赁系统每个模块具体功能设计完成后,就需建立系统的在汽车租赁系统每个模块具体功能设计完成后,就需建立系统的UML模型。本节给出基
409、于面向对象的方法分析汽车租赁系统,以及使模型。本节给出基于面向对象的方法分析汽车租赁系统,以及使用用UML模型将汽车租赁系统表示为直观的图形形式的方法步骤。模型将汽车租赁系统表示为直观的图形形式的方法步骤。01:32:38l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型建立汽车租赁系统的UML模型基本方法是,选择RationalRose的菜单项;打开如右图所示的“CreateNewModel”对话框;选择J2EE模式;单击“OK”按钮。当RationalRose会自动加载J2EE本身的一些构架模型后,开始建模,并将模型取名为“汽车租赁系统”。第一步,建立汽车租赁系统
410、的第一步,建立汽车租赁系统的UML模型。模型。01:32:39l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型创建汽车租赁系统的用例图之前,首先需要确定参与者。汽车租赁系统中的所有动作都是围绕着客户和公司职员进行的。因此,汽车租赁系统中的参与者主要有两类:客户和公司职员。1)客户参与的用例图设计客户参与的用例图如右图所示。第二步,汽车租赁系统的用例图设计。第二步,汽车租赁系统的用例图设计。01:32:40l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型2)公司职员参与的用例图设计公司职员参与的用例图如下图所示。第二步,汽车租赁系统的用例图
411、设计。第二步,汽车租赁系统的用例图设计。01:32:40l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型1)管理人员开展工作的时序图设计管理人员既可以查看汽车的租赁记录,又可以查看普通工作人员的工作记录和任务完成情况。管理人员开展工作的时序图如下图所示。第三步,汽车租赁系统的时序图设计。第三步,汽车租赁系统的时序图设计。01:32:41l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型2)客户预订车辆的时序图设计客户要租赁车辆,首先必须填写申请表。公司职员负责处理申请表,他们根据客户租赁的记录以及客户申请的车辆的状态决定是否接受客户请求。如
412、果两个条件都满足,那么将接受请求并为客户预留该车;否则,就拒绝请求,处理过的申请表的状态都设为已处理。如果接受客户的租赁请求,首先为该客户添加一条记录,然后通知客户前来取车。客户预订车辆的时序图如下图所示。第三步,汽车租赁系统的时序图设计。第三步,汽车租赁系统的时序图设计。01:32:41l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型3)客户取车的时序图设计客户在约定的时间到前台取车,公司职员首先验证取车通知,验证通过后,要求客户付款,然后填写一份工作记录,同时修改车辆状态。客户取车的时序如下图所示。第三步,汽车租赁系统的时序图设计。第三步,汽车租赁系统的时序图设
413、计。01:32:42l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型4)客户还车的时序图设计客户在规定的时间将车返还各租赁商后,技术人员将对车辆进行检修以确定是否损坏,并且填写一份服务记录,公司职员将根据记录确定客户应付的款项。与客户交易完成以后,需要修改车辆状态、客户记录以及工作记录等。客户还车的时序图如下图所示。第三步,汽车租赁系统的时序图设计。第三步,汽车租赁系统的时序图设计。01:32:42l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型1)客户预订车辆的协作图设计客户预订车辆的协作图如下图所示。第四步,汽车租赁系统的协作图设计。
414、第四步,汽车租赁系统的协作图设计。01:32:43l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型2)客户取车的协作图设计客户取车的协作图如下图所示。第四步,汽车租赁系统的协作图设计。第四步,汽车租赁系统的协作图设计。01:32:44l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型3)客户还车的协作图设计客户还车的协作图如下图所示。第四步,汽车租赁系统的协作图设计。第四步,汽车租赁系统的协作图设计。01:32:44l l 系统的系统的系统的系统的UMLUML基本模型基本模型基本模型基本模型通过分析汽车租赁系统发现,汽车租赁系统仅有的对象,
415、如客户预订申请表类、客户租赁记录类、工作记录类、维修记录类和车辆类的状态都很少。因此,不需要创建状态图,如下图所示。第五步,汽车租赁系统的状态图设计。第五步,汽车租赁系统的状态图设计。01:32:4510.5 10.5 应用实例应用实例-汽车租赁系统汽车租赁系统 l汽车租赁系统的需求分析汽车租赁系统的需求分析 l系统的系统的UML基本模型基本模型 l汽车租赁系统中的类设计汽车租赁系统中的类设计 l汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计01:32:45l l 汽车租赁系统中的类设计汽车租赁系统中的类设计汽车租赁系统中的类设计汽车租赁系统中的类设计类图的设计是汽车租赁系统
416、设计最核心类图的设计是汽车租赁系统设计最核心的部分,明确基本类以及基本类之间的相互的部分,明确基本类以及基本类之间的相互关系有助于开发者进行系统设计。本节将详关系有助于开发者进行系统设计。本节将详细介绍汽车租赁系统的类图设计。细介绍汽车租赁系统的类图设计。01:32:45l l 汽车租赁系统中的类设计汽车租赁系统中的类设计汽车租赁系统中的类设计汽车租赁系统中的类设计1)客户和公司职员类图设计系统中客户和公司职员类图如下图所示。第一步,汽车租赁系统中主要的类图设计。第一步,汽车租赁系统中主要的类图设计。01:32:46l l 汽车租赁系统中的类设计汽车租赁系统中的类设计汽车租赁系统中的类设计汽车
417、租赁系统中的类设计2)汽车租赁系统中其他类图的设计汽车租赁系统中其他的类图如下图所示。第一步,汽车租赁系统中主要的类图设计。第一步,汽车租赁系统中主要的类图设计。01:32:47l l 汽车租赁系统中的类设计汽车租赁系统中的类设计汽车租赁系统中的类设计汽车租赁系统中的类设计类不是单独一个模块,各类间存在一定的联系。汽车租赁系统各个类之间的关系(联系)如下图所示。第二步,汽车租赁系统类间的关系第二步,汽车租赁系统类间的关系/联系图的设计。联系图的设计。01:32:4710.5 10.5 应用实例应用实例-汽车租赁系统汽车租赁系统 l汽车租赁系统的需求分析汽车租赁系统的需求分析 l系统的系统的UM
418、L基本模型基本模型 l汽车租赁系统中的类设计汽车租赁系统中的类设计 l汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计01:32:48l l 汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图/组件图在软件设计中至关重要。下面介绍汽车租赁系统的组件图和配置图设计。1)汽车租赁系统组件图设计汽车租赁系统是建立在一个含有过去租赁记录、汽车信息、服务记录以及客户和员工信息的中央数据库上。汽车租赁系统的组件如下图所示,主要包括租赁程序、员工记录、服务记录、工作记录和汽车记录五个组件
419、。01:32:48l l 汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计汽车租赁系统的配置图与实现图设计2)汽车租赁系统的配置图设计汽车租赁系统由五个结点构成,应用服务器负责整个系统的总体协调工作;数据库负责数据管理;前台工作人员负责处理客户请求以及进行租赁交易;管理人员管理界面主要是用来对员工信息进行查询;技术工人界面则用于技术人员查询、修改汽车状态。汽车租赁系统配置图如下图所示。01:32:50第第1111章章ebeb网页设计网页设计01:32:55 第十一章第十一章 WebWeb网页设计网页设计 目前全球大约有数亿的Web网站,如新闻信息
420、网站、娱乐网站、教育站点、电子邮件站点、服务站点、照片共享站点、社区、博客与维基等。随着Internet技术的快速发展,每个Web网站都可以通过超链接(hyper link)与其他Web网站互联,形成一个巨大的信息网络。而Web网站是由许多的Web页面设计构成的,Web页面设计是企业向用户和网民提供信息(包括产品和服务)的一种方式,是企业开展电子商务的基础设施和信息平台,也是通过Internet宣传、反映企业形象和文化的重要窗口。01:32:55本章内容提要本章内容提要: :lWeb概述概述l标记语言标记语言lWeb开发语言开发语言l脚本语言脚本语言l页面设计页面设计lWeb数据库访问技术数据
421、库访问技术l应用实例应用实例l网络安全的评估标准网络安全的评估标准 第十一章第十一章 WebWeb网页设计网页设计01:32:5511.1 Web11.1 Web概述概述l lWebWeb的定义的定义的定义的定义l lWebWeb的工作原理的工作原理的工作原理的工作原理l l常用的常用的常用的常用的InternetInternet网络协议网络协议网络协议网络协议l lIPIP地址、域名和地址、域名和地址、域名和地址、域名和URLURLWeb的定义的定义01:32:55 Web就是一种超文本信息系统,它的核心就是超文本链接,即使得文本不再像一本书一样是固定的线性的,而是可以从一个位置跳到另外的位
422、置,并从中获取更多的信息。通过选择主题,即可了解到该主题的内容,并通过跳转操作就可看到包含这一主题的文档内容,这种多连接特性就称为Web。01:32:56l lWebWeb定义定义定义定义Web1.0相继发展到今天的Web2.0,已具有以下特点:1)Web具有图形化的和易于导航的具有图形化的和易于导航的(navigate)特性。)特性。2)Web具有与平台无关性。具有与平台无关性。3)Web具有分布式的特性具有分布式的特性4)Web具有动态的特性。具有动态的特性。01:32:5611.1 Web11.1 Web概述概述l lWebWeb的定义的定义的定义的定义l lWebWeb的工作原理的工作
423、原理的工作原理的工作原理l l常用的常用的常用的常用的InternetInternet网络协议网络协议网络协议网络协议l lIPIP地址、域名和地址、域名和地址、域名和地址、域名和URLURL01:32:56l lWebWeb的工作原理的工作原理的工作原理的工作原理Web是基于客户机/服务器(browser/server,B/S)的计算模式,即由Web浏览器B(客户机)和Web服务器S构成。两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议的工作原理包括四个步骤:连接;连接;请求;请求;应答;应答;关闭连接。关闭连接。01:32:56l lWebWeb的工作原理的工作原理的工作原理的
424、工作原理客户机/服务器计算模式,如图所示01:32:5711.1 Web11.1 Web概述概述l lWebWeb的定义的定义的定义的定义l lWebWeb的工作原理的工作原理的工作原理的工作原理l l常用的常用的常用的常用的InternetInternet网络协议网络协议网络协议网络协议l lIPIP地址、域名和地址、域名和地址、域名和地址、域名和URLURL01:32:57l l 常用的常用的常用的常用的InternetInternet网络协议网络协议网络协议网络协议1)TCP/IP协议协议2)HTTP协议协议3)远程登录协议远程登录协议Telnet01:32:58l lTCP/IPTCP
425、/IP协议协议协议协议 Internet使用的网络协议是TCP/IP协议,凡是接入Internet的计算机都必须安装和运行TCP/IP协议软件。 从协议分层模型方面来讲,TCP/IP协议并不完全符合OSI的七层参考模型。TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。其每一层都呼叫它的下一层所提供的网络来完成自己的任务。TCP/IP协议可以通过网络接口层连接到任何网络上,而OSI是传统的开放式系统互连参考模型,是一种通信协议的七层抽象的参考模型,其中每一层执行某一特定任务。TCP/IP参考模型参考模型OSI参考模型参考模型应用层应用层表示层会话层主机到主机层(TCP)(又称传输
426、层)传输层网络层(IP)网络层网络接口层(又称链路层)数据链路层物理层两种参考模型的对照表如表所示01:32:58l lHTTPPHTTPP协议协议协议协议HTTP(超文本传输协议)协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。HTTP协议的作用原理包括四个步骤。第一步,连接。Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。第二步,请求。Web浏览器通过socket向Web服务器提交请求.HTTP的请求一般是GET或POST命令(POST用于FORM参数的
427、传递)。第三步,应答。Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。第四步,关闭连接。当应答结束后,Web浏览器与Web服务器必须断开,以保证其他Web浏览器能够与Web服务器建立连接。01:32:58l l远程登录协议远程登录协议远程登录协议远程登录协议TelnetTelnet协议协议协议协议Telnet协议功能协议功能:(1)用户可以通过用Telnet连入某个主机,成为该主机的终端而访问各种所需的信息;(2)运行远程主机上的程序来求解各种复杂的问题;(3)可以利用
428、Telnet连到Internet上的各种服务器,如Archie、Gopher、Wais、WWW以及其他服务器(如某图书馆的资料文献服务器等)。Telnet协议提供了三种基本服务:协议提供了三种基本服务:(1)Telnet定义一个网络虚拟终端为远的系统提供一个标准接口。(2)Telnet包括一个允许客户机和服务器协商选项的机制,而且它还提供一组标准选项。(3)Telnet对称处理连接的两端,即Telnet不强迫客户机从键盘输入,也不强迫客户机在屏幕上显示输出。01:32:5811.1 Web11.1 Web概述概述 WebWeb的定义的定义的定义的定义l lWebWeb的工作原理的工作原理的工作
429、原理的工作原理l l常用的常用的常用的常用的InternetInternet网络协议网络协议网络协议网络协议l lIPIP地址、域名和地址、域名和地址、域名和地址、域名和URLURL01:32:58l lIPIP地址、域名和地址、域名和地址、域名和地址、域名和URLURL1)IP地址为了让连接在整个广域网上的主机能够相互通信,IP协议给每一台主机分配一个唯一的地址,这个地址就叫IP地址,这如同公用电话网中电话号码一样。(1)IPv4地址格式。IPv4地址的长度为32位,它分为网络号和主机号两部分。网络号标识一个网络。主机号用来标识网络中的一个主机,它一般由网络中的治理员来具体分配。“点分十进制
430、表示法”例如:IP地址:11001010011001010110100101000010分成四组:11001010011001010110100101000010用十进制小点隔开表示:202.101.105.6601:32:58l lIPIP地址、域名和地址、域名和地址、域名和地址、域名和URLURL(2)IPv6地址格式。地址格式。 当前,互联网以惊人的指数速度在增长,IPv4不论从地址空间上,还是协议的可用性上都无法满足互联网的新要求。为适应这种新要求,一种新的IP协议孕育而生,即早先的IPng,现在的IPv6。 IPv6 位址是128位,其位址表示形式定义为 x: x: x: x: x:
431、 x: x: x 其中每一个 x 都是十六进位值,共 8 个 16 位元位址片段。 IPv6 位址范围从 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0000 到 ffff: ffff: ffff: ffff: ffff: ffff: ffff: ffff。01:32:59l lIPIP地址、域名和地址、域名和地址、域名和地址、域名和URLURL为了便于理解IPv6,表11.2对IPv4与IPv6中的一些关键项进行了对比。对比项目对比项目IPv4IPv6地址位数总长度为32位总长度为128位地址格式点分十进制冒号分十六进制,带零压缩地址划分按五类Inte
432、rnet地址划分总的IP地址没有对应地址划分,而主要是按传输类型划分网络表示点分十进制格式的子网掩码或以前缀长度格式表示仅以前缀长度格式表示环路地址127.0.0.1:1公共性公共IP地址可聚集全球单点传送地址地址的配置自动配置的地址(169.254.0.0/16)链路本地地址(FE80:/64)多点传送地址224.0.0.0/4FF00:/8有无广播地址包含广播地址未定义广播地址未指明的地址表示.0:(0:0:0:0:0:0:0:0:)IP地址专用IP地址(.0/8、172.16.0.0/12、192.168.0.0/16)站点本地地址(FEC0:/48)域名解析IPv4主机地址(A)资源记
433、录IPv6主机地址(AAAA)资源记录逆向域名解析IN-ADDR.ARPA域IPv6.INT域01:32:592)域名)域名域名类似于互联网上的门牌号码,是用于识别和定位Internet上计算机的层次结构式字符标识,与该计算机的互联网协议(IP)地址相对应。但相对于IP地址而言,更便于使用者理解和记忆。域名属于Internet上的基础服务,基于域名可以提供WWW、E-mail、FTP等应用服务。3)URLURL(uniformresourcelocator,统一资源定位器)就是用来确定某信息位置的方法。格式:/URL举例:http:/http:/telnet:/221.11.21.17ftp:
434、/ftp.w3.org/pub/www/docgopher:/l lIPIP地址、域名和地址、域名和地址、域名和地址、域名和URLURL01:32:5911.2 11.2 标记语言标记语言l超文本标记语言HTMLl可扩展标记语言XML01:32:59超文本标记语言/超文本链接标示语言HTML是由HTML命令组成的描述性的文本文件。HTML命令用以说明文字、图形、动画、声音、表格和链接等。 超文本标记语言超文本标记语言超文本标记语言超文本标记语言HTML标签由三部分组成:1)左尖括号“”01:32:59HTML文档通常由文档头(head)、文档名称(title)、表格(table)、段落(par
435、agraph)和列表(list)等成分构成。l l超文本标记语言超文本标记语言超文本标记语言超文本标记语言每个HTML文档由两个部分组成:1)文档头()文档头(head)2)正文()正文(body)分别用和来作标记。01:33:00可扩展标记语言可扩展标记语言XML是指计算机所能理解的信息符号。通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言(如HTML),也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。l l可扩展标记语言可扩展标记语言可扩展标记语言可扩展标记语言XMLXMLXML与与HTML在设计方面的区别:在设
436、计方面的区别:1)XML是用来存储数据的,关注的是数据本身;2)HTML是用来定义数据的,关注的是数据的显示模式。01:33:00XML应用主要包括文档型和数据型两种类型。常见的XML用途有以下六个方面。l l可扩展标记语言可扩展标记语言可扩展标记语言可扩展标记语言XMLXML(1)自定义)自定义XML+XSLT=HTML,是常见的文档型应用之一。,是常见的文档型应用之一。(2)XML作为微型数据库,是常见的数据型应用之一。作为微型数据库,是常见的数据型应用之一。(3)作为信息传递的载体。)作为信息传递的载体。(4)应用程序的配置信息数据。)应用程序的配置信息数据。(5)其他一些文档的)其他一
437、些文档的XML格式,如格式,如Word、Excel等。等。(6)保存数据间的映射关系,如)保存数据间的映射关系,如Hibernate。01:33:0011.2 11.2 标记语言标记语言Web开发环境开发环境l服务器端开发环境l客户端开发环境l网页设计工具DreamweaverMX01:33:00l l服务器端开发环境服务器端开发环境服务器端开发环境服务器端开发环境服务器是对服务器是对Web浏览器检索信息的请求做出响应,进而浏览器检索信息的请求做出响应,进而将将HTML文档回传到客户机的浏览器屏幕上,或者运行服务文档回传到客户机的浏览器屏幕上,或者运行服务器端程序的计算机。器端程序的计算机。服
438、务器端的编程语言,除现在一般较少采用的服务器端的编程语言,除现在一般较少采用的CGI程序程序外,常用外,常用ASP、ASP.NET、Perl和和PHP,还有微软公司近还有微软公司近期推出的新一代期推出的新一代ASP.NET语言,它直接与语言,它直接与Java博弈,力图博弈,力图成为网络服务器端的标准语言。成为网络服务器端的标准语言。目前,常用的网络操作系统有目前,常用的网络操作系统有WindowsServer、UNIX和和Linux等。等。01:33:0011.3 11.3 Web开发环境开发环境l服务器端开发环境l客户端开发环境l网页设计工具DreamweaverMX01:33:00l l客
439、户端开发环境客户端开发环境客户端开发环境客户端开发环境Web客户端的编程,首先是客户端的编程,首先是HTML标识语言,还需要掌握一种或几种图标识语言,还需要掌握一种或几种图形工具、形工具、Web网页制作工具和网页制作工具和Web网页动画工具。网页动画工具。图形图像设计及处理的工具有:图形图像设计及处理的工具有:Photoshop、CorelDRAW、FireworksMX、Freehand、Illustrator、PhotoExpress等;等;动画制作工具:动画制作工具:MX、Cool3D、3DSMAX、ImageReady、FireworksMX等;等;Web网页制作软件如网页制作软件如D
440、reamweaver、FrontPage等等。01:33:0111.3 11.3 Web开发环境开发环境l服务器端开发环境l客户端开发环境l网页设计工具DreamweaverMX01:33:01l l网页设计工具网页设计工具网页设计工具网页设计工具DreamweaverMXDreamweaverMXDreamweaverMX的特性(1)精确性)精确性(2)易用性)易用性(3)兼容性。)兼容性。01:33:01l l网页设计工具网页设计工具网页设计工具网页设计工具DreamweaverMXDreamweaverMXDreamweaverMX平台操作(1)文档窗口。01:33:02l l网页设计工
441、具网页设计工具网页设计工具网页设计工具DreamweaverMXDreamweaverMX(2)插入面板。“常用常用”包含主页中最常用的一些对象,如图片、表格、超链接等包含主页中最常用的一些对象,如图片、表格、超链接等;“布局布局”包含常用的框架结构包含常用的框架结构;“表单表单”包含表单及所涉及的所有元素包含表单及所涉及的所有元素;“文本文本”包含一些特殊字符,如版权符号、注册商标符号、商标符号等包含一些特殊字符,如版权符号、注册商标符号、商标符号等;“HTML”添加一些添加一些Script脚本等。脚本等。01:33:02l l网页设计工具网页设计工具网页设计工具网页设计工具Dreamwea
442、verMXDreamweaverMX(3)属性面板选择选择“窗口窗口”菜单的菜单的“属性属性”项即可打开属性面板。项即可打开属性面板。属性面板用来显示文档窗口中选定对象的各种属性。属性面板用来显示文档窗口中选定对象的各种属性。01:33:02l l网页设计工具网页设计工具网页设计工具网页设计工具DreamweaverMXDreamweaverMXDreamweaverMX的站点管理建立Web站点的步骤如下:第一步,建本地站点。第一步,建本地站点。第二步,设置服务器信息。第二步,设置服务器信息。第三步,完成本地站点创建。第三步,完成本地站点创建。第四步,下载、上传与更新网页。第四步,下载、上传与
443、更新网页。01:33:0311.4 11.4 脚本语言脚本语言lJavaScript脚本语言lVBScript脚本语言01:33:03 JavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript的特点(1)基于对象)基于对象(2)简单性)简单性(3)安全性)安全性(4)动态性)动态性(5)跨平台)跨平台01:33:03l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript的运行环境和编辑环境运行环境:运行环境:NetscapeNavigator3.0以上或InternetExplorer4.0以上。编辑环境:编辑环境
444、:任何可以编辑HTML文档的文本编辑器(Notepad、Wordpad等)或专门的网页编辑器(FrontPage、Dreamweaver等)。01:33:03l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript语言结构(1)数据类型和运算符。JavaScript有六种数据类型有六种数据类型:float、int、string、boolean、undefined、null。变量命名必须遵循以下规则:变量命名必须遵循以下规则:变量名必须以字母、下划线_或美元符$开始。变量名可以包含字母、数字、下划线或美元符。变量名的长度是任意的。JavaScript区分
445、大小写,因此MyVar、myvar、Myvar、myVar是不一样的。变量名不能是保留字。01:33:03l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言函数定义语句函数定义语句:函数定义语句:function,return。函数必须先定义后使用,因此一般被放在HTML文档头中。函数定义的语法如下:function函数名函数名(参数列表参数列表)函数功能的实现部分函数功能的实现部分return表达式表达式/return语句将表达式的值返回主调程序语句将表达式的值返回主调程序01:33:03l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语
446、言JavaScript的事件驱动在在JavaScript程序中,任何能引起程序中,任何能引起JavaScript代码运行的代码运行的操作,都称为事件(操作,都称为事件(event)。事件是浏览器响应用户交互操作)。事件是浏览器响应用户交互操作的一种机制,的一种机制,JavaScript的事件处理机制可以改变浏览器响应的事件处理机制可以改变浏览器响应用户操作的方式,这样就开发出具有交互性并易于使用的网页用户操作的方式,这样就开发出具有交互性并易于使用的网页。事件大多数是由事件大多数是由Web用户触发的。普通的事件包括页面用户触发的。普通的事件包括页面元素上的单击(如单选按钮、元素上的单击(如单选
447、按钮、submit按钮、链接等)。按钮、链接等)。位于位于HTML源文件中的源文件中的JavaScript程序将经常被它们所程序将经常被它们所触发,因此,必须了解都有哪些事件,如何监测并等待事件,触发,因此,必须了解都有哪些事件,如何监测并等待事件,如何调用事件处理器处理发生的事件。如何调用事件处理器处理发生的事件。01:33:04l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript的对象(1)对象的基本结构对象的基本结构JavaScript中的对象是由属性(properties)和方法(methods)两个基本的元素构成的。属性是对象的内置变量,
448、用于存放该对象的特征参数等信息;属性是对象的内置变量,用于存放该对象的特征参数等信息;方法是对象的内置函数,用于对该对象进行操作。方法是对象的内置函数,用于对该对象进行操作。(2)引用对象的途径引用对象的途径可以通过以下几种途径获得一个对象:引用引用JavaScript内部对象;内部对象;引用由浏览器提供的对象引用由浏览器提供的对象;创建新对象。创建新对象。01:33:04l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript的对象(3)对象专有的操作符和语句对象专有的操作符和语句for.in语句。语句。格式如下:格式如下:for(属性名属性名in对
449、象名对象名)with语句。语句。this关键词。关键词。new运算符运算符。01:33:04l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript内部对象的属性和方法(1)常用内部对象)常用内部对象JavaScript提供了一些内部对象,在此介绍最常用的三种对象,包括string(字符串)、math(数值计算)和Date(日期)。JavaScript中的对象可以分为两种:中的对象可以分为两种:一种是静态对象一种是静态对象,在引用其属性、方法时不需要为它创建实例;另一种是动态对象另一种是动态对象,在引用其对象、方法时必须创建实例。01:33:04l l
450、JavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript内部对象的属性和方法(2)JavaScript中的系统函数。中的系统函数。JavaScript中的系统函数又称内部方法,它提供了与任何对象无关的系统函数,使用这些函数不需创建任何实例,可直接调用。表所示为JavaScript的系统函数。eval(字符串表达式)(字符串表达式)返回字符串表达式中的值返回字符串表达式中的值例如:例如:test=eval(8+9+5/2)unEscape(string)返回字符串ASCII码Escape(character)返回字符的编码parseFloat(floustri
451、ng)返回实数parseInt(numbestring,radix)返回不同进制的数radix是数的进制,numbestring是数字串01:33:04l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript内部对象的属性和方法(3)浏览器内部对象系统。)浏览器内部对象系统。使用浏览器的内部对象系统,可实现与HTML文档进行交互。它的作用是将相关元素组织包装起来,提供给程序设计人员使用,从而减轻编程者的劳动,提高设计Web页面的能力。01:33:05l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript内部对
452、象的属性和方法(4)JavaScript中的数组。中的数组。定义对象的数组。FunctionarrayName(size)This.length=size;for(varX=1;X=size;X+)thisX=0;returnthis;01:33:05l lJavaScriptJavaScript脚本语言脚本语言脚本语言脚本语言JavaScript内部对象的属性和方法(4)JavaScript中的数组。中的数组。创建数组实例。一个数组定义完成以后,还不能马上使用,必须为该数组创建一个数组实例:Myarray=NewarrayName(n);并赋予初值:Myarray1=字串1;Myarray2
453、=字串2;Myarray3=字串3;Myarrayn=字串n;01:33:05l lVBScriptVBScript脚本语言脚本语言脚本语言脚本语言VBScript的全称为的全称为MicrosoftVisualBasicScriptingEdition,是,是MicrosoftVisualBasic语言的一个子集,它并不是一个完整的程序设计语语言的一个子集,它并不是一个完整的程序设计语言,仅包含语言中的一些基本功能。言,仅包含语言中的一些基本功能。VBScript的最大优点是:的最大优点是:(1)用纯文本建立;用纯文本建立;(2)直接包含在直接包含在HTML文档中;文档中;(3)编辑和修改都十
454、分便利。编辑和修改都十分便利。01:33:0511.4 11.4 脚本语言脚本语言lJavaScript脚本语言lVBScript脚本语言01:33:05l lVBScriptVBScript脚本语言脚本语言脚本语言脚本语言用VBScript开发客户端脚本。【例】【例】客户端脚本示例客户端脚本示例客户端脚本举例客户端脚本举例01:33:05l lVBScriptVBScript脚本语言脚本语言脚本语言脚本语言运行的结果运行的结果:01:33:06l lVBScriptVBScript脚本语言脚本语言脚本语言脚本语言VBScript开发服务器端脚本。开发服务器端脚本。【例】【例】服务器端脚本示例
455、。服务器端脚本示例。服务器端脚本举例服务器端脚本举例fontsize=传承文明!开拓进取传承文明!开拓进取!01:33:06l lVBScriptVBScript脚本语言脚本语言脚本语言脚本语言运行的结果运行的结果:01:33:06l lVBScriptVBScript脚本语言脚本语言脚本语言脚本语言VBScript语法基础语法基础(1)VBScript数据类型。数据类型。VBScript只有一种称为Variant的数据类型。(2)VBScript常量。常量。在VBScript中,常量是具有一定含义的名称,用于代替数字或字符串,其值从不改变。 VBScript定义了许多固有常量,如Empty、
456、Null、True、False等。(3)VBScript变量。变量。例如: Dim Degrees Dim Top, Bottom, Left, Right01:33:06l lVBScriptVBScript脚本语言脚本语言脚本语言脚本语言VBScript输入与输出输入与输出VBScript语言以对话框的形式提供各种数据的输入与输出功能。(1)InputBox()函数提供一个供用户输入数据的函数提供一个供用户输入数据的对话框;对话框;(2)MsgBox()函数或函数或MsgBox语句则提供一个输语句则提供一个输出指定数据的对话框。出指定数据的对话框。01:33:06l lVBScriptVB
457、Script脚本语言脚本语言脚本语言脚本语言VBScript过程与函数过程与函数过程(procedure)是指具有特定功能并赋予特定名称的一段相对独立的程序代码。VBScript的过程被分为两类的过程被分为两类:Sub过程过程Function过程过程在VBScript脚本代码中,无论是Sub过程还是Function过程,都需要先定义后调用。两者的主要区别在于函数可以有返回值,而过程没有返回值。01:33:07l lVBScriptVBScript脚本语言脚本语言脚本语言脚本语言VBScript过程与函数过程与函数过程(procedure)是指具有特定功能并赋予特定名称的一段相对独立的程序代码。
458、VBScript的过程被分为两类的过程被分为两类:Sub过程过程Function过程过程在VBScript脚本代码中,无论是Sub过程还是Function过程,都需要先定义后调用。两者的主要区别在于函数可以有返回值,而过程没有返回值。01:33:0711.5 11.5 页面设计页面设计1)静态页面设计)静态页面设计静态网页,就是该网页文件里没有程序代码,只有HTML标记,这种网页文件的后缀为.htm或.html。静态网页工作原理如下图:当你在浏览器里输入一个网址回车后,就向服务器端提出了一个浏览网页的请求;服务器端接到请求后,就会找到你要浏览的静态网页文件;然后发送到你的浏览器上并加以显示。l
459、 l页面设计页面设计页面设计页面设计01:33:082)动态网页设计)动态网页设计动态网页文件不仅含有HTML标记,而且含有程序代码,这种网页的后缀一般根据不同的程序设计语言来定。动态网页能够根据不同的时间、不同的来访者而显示不同的内容,还可以根据用户的即时操作和即时请求,内容发生相应的变化。静态网页工作原理如下图:当在浏览器里输入一个动态网页网址回车后,就向服务器端提出了一个浏览网页的请求,服务器端接到请求后,首先会找到你要浏览的动态网页文件,然后就执行网页文件中的程序代码,将含有程序代码的动态网页转化为标准的静态网页,最后将静态网页发送来l l页面设计页面设计页面设计页面设计01:33:0
460、8l l页面设计页面设计页面设计页面设计3)样式表设计)样式表设计CSS(cascadingstylesheet,层叠样式表)是一种格式化网页的标准方式,它扩展了HTML的功能,使网页设计者能够以更有效的方式设置网页格式。CSS基本语法。一个样式(style)的语法由三部分构成:(1)选择器()选择器(selector)(2)属性()属性(property)(3)属性值()属性值(value)格式如下:selector property: value01:33:08l l页面设计页面设计页面设计页面设计 设置CSS属性。在图中,选择“CSS样式定义”对话框的“分类”列表中的“类型”选项,可以对
461、CSS样式的“类型”属性进行设置。CSS属性有类型、背景、区块、方框、边框、列表、定位、扩展。3)样式表设计)样式表设计01:33:0911.4 11.4 Web数据库访问设计数据库访问设计l概述lVeb数据库访问技术01:33:09l l概述概述概述概述 WebWeb数据库是数据库是WebWeb技术和数据库技术相结合的产物,网上办技术和数据库技术相结合的产物,网上办公、电子商务、在线注册与搜索等都需要利用公、电子商务、在线注册与搜索等都需要利用WebWeb数据库来存数据库来存储和管理数据。储和管理数据。Web访问数据库的关键在于它与数据库服务器间的访访问数据库的关键在于它与数据库服务器间的访
462、问问/接口技术选择,通常数据库访问接口技术选择,通常数据库访问/接口技术有接口技术有CGI、JDBC、ODBC、ADO和和ADO.NET。微软的微软的ASP.NET技术提供执行于服务器端的脚本模型,技术提供执行于服务器端的脚本模型,而服务器端的组件而服务器端的组件ADO.NET调用对象以实现数据库的访问,调用对象以实现数据库的访问,从而极大地简化了从而极大地简化了Web的应用开发工作,是一种较新的的应用开发工作,是一种较新的Web数据库访问技术。数据库访问技术。01:33:0911.4 11.4 Web数据库访问设计数据库访问设计l概述lVeb数据库访问技术01:33:09l lWebWeb数
463、据库访问技术数据库访问技术数据库访问技术数据库访问技术1)公共网关接口)公共网关接口CGI公共网关接口公共网关接口CGI(commongatewayinterface)是一段程序,运行在服务器上,提供同客户端是一段程序,运行在服务器上,提供同客户端HTML页面页面的接口,通俗地讲,的接口,通俗地讲,CGI就像是一座桥,把网页和就像是一座桥,把网页和Web服服务器中的执行程序连接起来,它把务器中的执行程序连接起来,它把HTML接收的指令传递接收的指令传递给服务器,再把服务器执行的结果返回给给服务器,再把服务器执行的结果返回给HTML页。用页。用CGI可以实现处理表格、数据库查询和发送电子邮件等多
464、可以实现处理表格、数据库查询和发送电子邮件等多种操作。种操作。01:33:09l lWebWeb数据库访问技术数据库访问技术数据库访问技术数据库访问技术2)ODBC数据源数据源ODBC(opendatabaseconnectivity)是微软公司于1991年定义和开发的一套数据库访问标准,ODBC的接口函数能够使客户端的SQL语言与数据库服务器相互结合,从而对访问数据库的应用程序屏蔽了不同数据库管理系统的访问差异,也使数据库系统的开发不仅仅局限于某个DBMS。ODBC访问数据库的系统模型如图1所示01:33:10l lWebWeb数据库访问技术数据库访问技术数据库访问技术数据库访问技术3)JD
465、BCJDBC(javadatabaseconnectivity)是为)是为Java软软件开发人员提供的访问各种数据库的通用性应用程序的编件开发人员提供的访问各种数据库的通用性应用程序的编程接口(程接口(API)。使用)。使用JDBC可以很容易地把可以很容易地把SQL语句传语句传送到任何关系型数据库中。送到任何关系型数据库中。通过通过JDBC操作数据库的大致过程归纳为:操作数据库的大致过程归纳为:首先装载首先装载JDBC驱动程序,然后通过驱动程序,然后通过DriveManager获获得一个连接,接着创建得一个连接,接着创建Statement对象以执行对象以执行SQL操作。在操作。在执行操作之后,
466、关闭数据库的连接以便释放系统资源。执行操作之后,关闭数据库的连接以便释放系统资源。01:33:10l lWebWeb数据库访问技术数据库访问技术数据库访问技术数据库访问技术4)ActiveX数据对象ADO在高级编程语言中通常使用在高级编程语言中通常使用ActiveX数据对象(数据对象(ADO),它),它是一个主要的是一个主要的OLEDB数据消费者。数据消费者。ADO能够使用相同的编程能够使用相同的编程模型连接到任何模型连接到任何OLEDB数据提供者,并不考虑特定数据提供数据提供者,并不考虑特定数据提供者的具体特性。各种者的具体特性。各种ADO对象之间的关系,如图所示。对象之间的关系,如图所示。
467、01:33:10l lWebWeb数据库访问技术数据库访问技术数据库访问技术数据库访问技术5)ADO.NETADO.NET是以ODBC应用程序技术的使用为标志的数据库访问技术发展以来最新的一项技术,它是在ADO数据访问模型的基础上发展而来的,它由两大部分组成,即数据提供者(DataProvider)和数据集(DataSet)。ADO.NET对MicrosoftSQLServer和XML等数据源以及通过OLEDB和XML公开的数据源提供一致的访问。数据共享使用者应用程序可以使用ADO.NET来连接到这些数据源,并检索、处理和更新所包含的数据。01:33:1011.7应用实例应用实例(1)网上作业
468、提交和批改系统需求分析(2)网上作业提交和批改系统数据库设计(3)网上作业提交和批改系统用户界面设计(4)网上作业提交和批改系统与数据库连接及SQL操作(5)网上作业提交和批改系统软件设计01:33:1011.7Web技术发展趋势技术发展趋势Web技术已具有四个阶段发展历程,其中Web3.0成为人们当前关注的热点。1)Web技术发展的第一阶段技术发展的第一阶段静态文档静态文档第一阶段的Web,主要是用于静态Web页面的浏览。用户使用客户机端的Web浏览器,可以访问Internet上各个Web站点,在每一个站点上都有一个主页(HomePage)作为进入一个Web站点的入口。每一Web页中都可以含
469、有信息及超文本链接,超文本链接可以带用户到另一Web站点或是其他的Web页。从服务器端来看,每一个Web站点由一台主机、Web服务器及许多Web页所组成,以一个主页为首,其他的Web页为支点,形成一个树状的结构。每一个Web页都是以HTML的格式编写的。01:33:1111.7Web技术发展趋势技术发展趋势2)Web技术发展的第二阶段技术发展的第二阶段动态网页动态网页为了克服静态页面的不足,人们将传统单机环境下的编程技术引入Internet并与Web技术相融合,从而形成新的网络编程技术。网络编程技术通过在传统的静态页面中加入各种程序和逻辑控制,在网络的客户端和服务端实现了动态和个性化的交流与互
470、动。人们将这种使用网络编程技术创建的页面称为动态页面。01:33:1111.7Web技术发展趋势技术发展趋势3)Web技术发展的第三阶段技术发展的第三阶段Web2.0时代时代近年来人们会提到“Web2.0”,那么什么是Web2.0呢?其实它并不是一个具体的事物,而是一个阶段,它是促成这个阶段的各种技术和相关的产品服务的一个称呼。如果把第一阶段的静态文档的WWW时代定义为Web1.0,而把第二阶段的动态页面时代定义为Web1.0的升级Web1.5则第三阶段与前两个阶段具有跨越式发展。01:33:1111.7Web技术发展趋势技术发展趋势4)Web技术发展的第四阶段技术发展的第四阶段Web3.0时代时代2005年,BilleGaizi在美国微软公司高管会上提出互联网的新概念模式,并将这种互联网模式命名为Web3.0。网站内的信息可以直接和其他网站相关信息进行交互,通过第三方信息平台同时对多家网站的信息进行整合并使用。用户在互联网上拥有自己的数据,并能在不同网站上使用。完全基于Web,用浏览器即可以实现复杂的系统程序才具有的功能。Web3.0的网络模式将实现不同终端的兼容,从PC互联网到WAP手机、PDA、机顶盒、专用终端,不只应用在互联网这一单一终端上。