数据结构实用教程(C语言版).ppt
《数据结构实用教程(C语言版).ppt》由会员分享,可在线阅读,更多相关《数据结构实用教程(C语言版).ppt(608页珍藏版)》请在三一办公上搜索。
1、,数据结构实用教程(C语言版),第1章 概论,本章主要介绍以下内容:数据结构中涉及的相关概念数据结构研究的主要内容算法的概念、描述方法以及评价标准,本章目录,结束,1.1 什么是数据结构,1.1.1 基本概念及术语1.1.2 数据的逻辑结构1.1.3 数据的存储结构1.1.4 抽象数据类型,返回到本节目录,返回到总目录,1.1.1 基本概念及术语,在系统的学习数据结构知识之前,先了解一些相关概念和术语。1数据(Data)指所有能输入到计算机中并被计算机程序处理的符号的总称。例如,整数、实数、字符、图像、声音等都是数据。2数据元素(Data Element)数据元素(也称为结点)是数据的基本单位
2、,在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可以由若干个数据项组成。数据项是数据处理中不可分割的最小单位。,返回到本节目录,3数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。这些数据元素不是孤立存在的,而是有着某种关系,这种关系称为结构。数据结构一般包括以下三个方面内容:(1)数据元素之间的逻辑关系,也称数据的逻辑结构。(2)数据元素及其关系在计算机存储器内的表示,称为数据的存储结构。(3)数据的运算,即对数据施加的操作。,返回到本节目录,1.1.1 基本概念及术语,数据结构定义:按某种逻辑关系组织起来的一批数据,按一定的映像方式把它存
3、放在计算机存储器中,并在这些数据上定义了一个运算的集合,就叫做数据结构。简言之,数据结构=逻辑结构+存储结构+运算集合。4数据类型(Data Type)数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。如在高级语言中,整型类型的取值范围为:-32768+32767,运算符集合为加、减、乘、除、取模,即+、-、*、/、%。,返回到本节目录,1.1.1 基本概念及术语,5数据类型(Data Type)高级语言中的数据类型分为两大类:(1)原子类型其值是不可分解的。如C语言中的标准类型(整型、实型、字符型)。(2)结构类型其值是由若干成分按某种结构组成的,因此是可以分解的。如C语
4、言中的的构造类型(结构体、共用体、枚举等类型)。,返回到本节目录,1.1.1 基本概念及术语,1.1.2 数据的逻辑结构,1定义数据的逻辑结构是指数据元素之间逻辑关系描述。可以用一个二元组表示,其形式化描述为:Data_Structure=(D,R)其中D是数据元素的有限集合,R是D上关系的有限集合。数据的逻辑结构是从逻辑关系上描述数据,与数据的存储无关,是独立于计算机的。,返回到本节目录,2数据的逻辑结构的分类根据数据元素之间的逻辑关系的不同特性,分为下列四类基本结构,如图1-1所示。(a)集合结构(b)线性结构(c)树型结构(d)图形结构图1-1 数据结构的四种基本逻辑结构,返回到本节目录
5、,1.1.2 数据的逻辑结构,(1)集合结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系,这是一种最简单的数据结构。(2)线性结构结构中的数据元素之间存在着“一对一”的关系。【例1.1】学籍档案管理假设一个学籍档案管理系统应包含如表1-1所示的学生信息。,返回到本节目录,1.1.2 数据的逻辑结构,特点:表中的每一行是一个数据元素(或记录、结点),它由学号、姓名、性别及出生年月等数据项组成。表中数据元素之间是一种先后关系,对于表中任一结点,与它相邻且在它前面的结点(称为直接前驱)最多只有一个;与表中任一结点相邻且在其后的结点(称为直接后继)也最多只有一个。我们将这种关系称为“线
6、性结构”。,返回到本节目录,1.1.2 数据的逻辑结构,(3)树型结构结构中的数据元素之间存在着“一对多”的关系。【例1.2】人机对弈人与计算机进行对弈的部分图如图1-2为所示。图1-2 人机对弈图,返回到本节目录,1.1.2 数据的逻辑结构,特点:图中将每一个棋盘看作一个数据元素,则数据元素之间的关系要比表1-1要复杂许多。图中数据元素之间是一对多关系,即一个数据元素向上和一个数据元素相连(称为双亲结点),向下和多个数据元素相连(称为孩子结点)。我们将这种关系称为“树型结构”。4)图形结构或网状结构结构中的任意数据元素之间都可以有关系,元素之间存在着“多对多”的关系。,返回到本节目录,1.1
7、.2 数据的逻辑结构,(【例1.3】制定教学计划在制定教学计划时,需要考虑各门课程的开设顺序。有些课程需要先导先修课程,有些课程则不需要,而有些课程又是其他课程的先导先修课程。比如,计算机专业课程的开设情况如表1-2所示。,返回到本节目录,1.1.2 数据的逻辑结构,教学计划的关系图如图1-3所示。图1-3 教学计划关系图特点:图中数据元素存在着多对多的任意关系。一个结点可能有多个直接前驱和直接后继。,返回到本节目录,1.1.2 数据的逻辑结构,1.1.3 数据的存储结构,数据在计算机中的存储表示称为数据的存储结构,也称为物理结构。数据的存储结构是逻辑结构在计算机存储器中的实现。本书将介绍常用
8、的两种基本的存储结构:顺序存储结构和链式存储结构。数据的逻辑结构和存储结构的关系是:存储结构是逻辑关系的映像与元素本身映像,是数据结构的实现;逻辑结构是数据结构的抽象。,返回到本节目录,1.顺序存储结构顺序存储结构:借助元素在存储器中的相对位置来表示数据元素间的逻辑关系。【例1.4】对于表1-1提出的学生信息登记表进行存储,假定每个元素占用50个存储单元,数据从1000号单元开始由低地址向高地址存放,对应的顺序存储结构如表1-3所示。,返回到本节目录,1.1.3 数据的存储结构,顺序存储结构的主要特点:可实现对各数据元素的随机访问。这是因为只要知道存储的首地址以及每个数据元素所占的存储单元,就
9、可以计算出各数据元素的存储地址。不利于修改,在对数据元素进行插入、删除运算时可能要移动一系列的数据元素。,返回到本节目录,1.1.3 数据的存储结构,2.链式存储结构链式存储结构:借助指示元素存储地址的指针表示数据元素间的逻辑关系。【例1.5】对于表1-1学生信息登记表进行链式存储时,在每个数据元素后方附加一个指向“下一个结点地址”的指针字段,用于存放后继数据元素的存储地址,每个数据元素的地址是随机的,可以不连续。对应的链式存储结构见表1-4所示。,返回到本节目录,1.1.3 数据的存储结构,链式存储结构的主要特点:利于修改,在对数据元素进行插入、删除运算时,仅需修改数据元素的指针字段值,而不
10、必移动数据元素。由于逻辑上相邻的数据元素在存储位置中不一定相邻,因此,链式存储结构不能对数据元素进行随机访问。,返回到本节目录,1.1.3 数据的存储结构,1.1.4 抽象数据类型,1抽象数据类型的定义抽象数据类型(Abstract Data Type,简称ADT)是指一个数学模型以及定义在该模型上的一组操作。2抽象数据类型的表示抽象数据类型实际上就是对该数据结构的定义。因为它定义了一个数据的逻辑结构以及在此结构上的一组算法。可以用一个三元组表示:ADT=(,)其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。,返回到本节目录,抽象数据类型通常是指由用户定义,用以表示应用问题的数据类
11、型,抽象数据类型由基本的数据类型组成,并包括一组相关的服务(或称操作)。抽象数据类型有些类似于pascal语言中的记录(record)类型和c语言中的构造(struct)类型,但它增加了相关的服务。3ADT的两个重要特征(1)数据抽象用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。(2)数据封装将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。,返回到本节目录,1.1.4 抽象数据类型,1.2 算法和算法分析,1.2.1 算法的概念1.2.2 算法分析1.2.3 相关C语言知识回顾,返回到总目录,1.2.1
12、 算法的概念,1算法的定义瑞士著名的计算机科学家N.Wirth所提出的著名公式“程序=算法+数据结构”,所谓算法,就是为解决特定问题而采取的步骤和方法。2算法的特性一个算法应该具有下列特性:(1)有穷性:一个算法必须(对任何合法的输入值)在执行有限步之后结束。(2)确定性:算法中的每一条指令必须有确切的含义,不会产生二义性。,返回到本节目录,(3)可行性:算法中描述的操作都可以通过执行有限次基本操作来实现。(4)输入:一个算法有零个或多个输入。(5)输出:一个算法必有一个或多个输出。3算法的评价要设计一个好的算法通常需要考虑以下几方面的要求:(1)正确性:要求算法能够正确地执行预先规定的功能,
13、并达到所期望的性能要求。(2)可读性:为了便于理解、测试和修改算法,算法应该具有良好的可读性。,返回到本节目录,1.2.1 算法的概念,(3)健壮性:当输入非法的数据时,算法应能恰当地做出反应或进行相应处理,而不是产生莫名奇妙的输出结果。并且处理出错的方法不应是中断程序的执行,而是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。(4)高效性:对同一个问题,执行时间越短,算法的效率越高。(5)低存储量:完成相同的功能,执行算法所占用的存储空间应尽可能的少。,返回到本节目录,1.2.1 算法的概念,4算法的描述为了表示一个算法,可以用多种不同的方法,常用的有自然语言、传统流程图、结
14、构化流程图、N-S流程图等表示。本书采用C的描述语言实现对各种数据结构及算法的操作描述,算法是以函数形式描述,描述如下:类型标识符 函数名(形式参数表)/*算法说明*/语句序列,返回到本节目录,1.2.1 算法的概念,1.2.2 算法分析,在算法满足正确性的前提下,如何评价不同算法的优劣呢?通常主要考虑算法的时间复杂度和空间复杂度这两方面。一般情况下,鉴于运算空间(内存)较为充足,所以把算法的时间复杂度作为重点分析。1.时间复杂度(Time Complexity)一个算法所需的运算时间通常与所解决问题的规模大小有关。问题规模是一个和输入有关的量,用n 表示问题规模的量,把算法运行所需的时间T表
15、示为n的函数,记为T(n)。不同的T(n)算法,当n增长时,运算时间增长的快慢很不相同。一个算法所需的执行时间就是该算法中所有语句执行次数之和。当n逐渐增大时T(n)的极限情况,一般简称为时间复杂度。,返回到本节目录,当讨论一个程序的运行时间时,注重的不是T(n)的具体值,而是它的增长率。T(n)的增长率与算法中数据的输入规模紧密相关,而数据输入规模往往用算法中的某个变量的函数来表示,通常是f(n)。随着数据输入规模的增大,f(n)的增长率与T(n)的增长率相近,因此T(n)同f(n)在数量级上是一致的。记作:T(n)=O(f(n)其中,大写字母O为Order(数量级)的字头,f(n)为函数形
16、式,如T(n)=O(n2)。,返回到本节目录,1.2.2 算法分析,注意,当T(n)为多项式时,可只取其最高次幂项并省略其系数,其它的次幂项及系数均略去不写。一般地,对于足够大的n,常用的时间复杂性存在以下顺序:O(1)O(log2n)O(n)O(nlog2n)O(n2)O(n3)O(2n)算法时间复杂度的数量级越大,表示该算法的效率越低,反之越高。例如 O(1)为常数数量级,,即算法的时间复杂性与输入规模n无关。,返回到本节目录,1.2.2 算法分析,【例1.6】分析以下算法的时间复杂度。x=0;y=0;for(k=1;k=n;k+)x+;(1)执行n次for(i=1;i=n;i+)for(
17、j=1;j=n;j+)y+;(2)执行n2次 解:T(n)=n+n2T(n)=O(n2)上述算法中的基本运算是语句(2),其执行频率为n2。则T(n)=n2=O(n2),返回到本节目录,1.2.2 算法分析,【例1.7】分析以下算法的时间复杂度。i=1;while(i=n)i=2*i;(1)执行f(n)次解:设语句(1)执行次数是f(n),则2f(n)n得到T(n)=O(log2n),返回到本节目录,1.2.2 算法分析,【例1.8】求两个矩阵相乘的函数的时间复杂度。void mult(int a,int b,int c)/*以二维数组存储矩阵元素,c为a和b的乘积*/for(i=1;i=n;
18、+i)(1)执行n次 for(j=1;j=n;+j)(2)执行n2次 ci,j=0;for(k=1;k=n;+k)(3)执行n3次 ci,j+=ai,k*bk,j;解:嵌套循环为每层循环次数的乘积,因为是该函数为三重循环,所以时间复杂度为O(n3)。,返回到本节目录,1.2.2 算法分析,2.空间复杂度(Space Complexity)一个算法的空间复杂度是指程序运行开始到结束所需要的存储空间。包括算法本身所占用的存储空间、输入/输出数据占用的存储空间以及算法在运行过程中的工作单元和实现算法所需辅助空间。类似于算法的时间复杂度,算法所需存储空间的量度记作:S(n)=O(f(n)表示随着问题规
19、模n的增大,算法运行所需存储量的增长率与f(n)的增长率相同。,返回到本节目录,1.2.2 算法分析,1.2.3 相关C语言知识回顾,1数据类型数据类型是和数据结构密切相关的一个概念,它最早出现在高级程序设计语言中,用以描述操作对象的特性。高级语言中的数据类型可分为两类:一类是原子类型,如C语言中的基本类型(整型、实型、字符型等)指针和空类型等不可再分的值;另一类是结构类型,如数组、结构体等通过若干成分(可以是原子类型或结构类型)构造而成的。,返回到本节目录,1.2.3 相关C语言知识回顾,(1)数组类型数组中的每一个元素都属于同一个数据类型。数组有一维数组和多维数组,数组名标识一个数组,下标
20、指示一个数组元素在该数组中的顺序位置,下标从0n-1(n为数据元素个数)。例如,int a10;定义了包含10个整数的数组a,数组下标范围09。(2)结构体类型结构体是是一种复合的数据类型,该结构体类型内可以有多个成员,每个结构体成员可以有不同的数据类型。基本格式如下:,返回到本节目录,【格式】struct 结构体名/*定义结构体类型*/成员列表;struct 结构体名 变量名表;/*定义结构体变量*/,返回到本节目录,1.2.3 相关C语言知识回顾,(3)结构体类型指针对结构体成员的引用方法当结构体类型的指针指向某一结构体变量时,就可以使用该指针对其指向的结构体变量内的各成员进行引用。引用的
21、方法为:指针名-成员名 等价于:(*指针名).成员名 等价于:结构体变量名.成员名在本书中,在程序内大量使用结构体类型的指针,所以大都采用第一种写法。,返回到本节目录,1.2.3 相关C语言知识回顾,(4)用typedef定义类型除了可以直接使用C提供的标准类型名和自己声明的结构体类型外,还可以用typedef声明新的类型名来代替已有的类型名。其基本定义格式如下:【格式】typedef 原类型名 新类型名;其中,typedef为关键字,表示重定义。原类型名是C语言提供的任意一种数据类型,可以是简单数据类型,也可以是构造数据类型。新类型名为原类型名的一个别名。使用新类型名就像使用原类型名那样定义
22、变量。,返回到本节目录,1.2.3 相关C语言知识回顾,2动态存储分配函数C语言提供了动态分配函数来实现动态存储分配。最常用的动态存储分配函数有以下两个。(1)分配内存空间函数malloc()【格式】(类型名*)malloc(要分配的内存字节数size)【功能】在内存中分配一个长度为size的连续存储空间,返回值是新分配存储空间的首地址,若内存不足,则返回NULL。其中,类型名表示把该存储空间用于何种数据类型。(类型名*)表示把malloc函数返回值强制转换为该类型指针。,返回到本节目录,1.2.3 相关C语言知识回顾,(2)释放内存空间函数free()【格式】free(指向要释放单元的指针名
23、)【功能】释放该指针所指的一块存储空间,该空间系统可另作它用。注意这个指针所指的空间必须是由malloc()函数和calloc()函数分配的才行。free函数无返回值。例如:int*pt;pt=(int*)malloc(sizeof(int);free(pt);程序段表示释放pt指向的存储空间。,返回到本节目录,1.2.3 相关C语言知识回顾,3函数的定义与调用在本书中,绝大多数的算法都是编写成C语言的函数,这些函数需要通过编写相应的主函数才能被执行。(1)函数的定义函数的定义如下:【格式】函数类型 函数名(形参表)内部变量定义 函数主体语句返回语句,返回到本节目录,1.2.3 相关C语言知识
24、回顾,(2)函数的调用【格式】函数类型 函数名(实参表);【说明】1实参表中各参数应与形参表中各参数类型及个数相符。2在调用函数时,表达式应与该函数的类型相符,如果该函数有返回值时,在调用时要将该函数的返回值赋给相同类型的变量。,返回到本节目录,1.2.3 相关C语言知识回顾,4 Turbo C 2.0中的汉字显示在TurboC 2.0中,如果想输入和显示汉字,需要使用UCDOS汉字系统。但现在的Windows操作系统不支持UCDOS汉字系统的16位显示。下面介绍一种能在Windows XP系统环境下,在TurboC 2.0中使用UCDOS的汉字系统的方法。,返回到本节目录,1.2.3 相关C
25、语言知识回顾,(1)将UCDOS的核心文件进行兼容性设置(有的机器可省略这步,直接执行(2)。点“开始”菜单-“所有程序”-“附件”-“程序兼容性向导”-“我想手动定位程序”-“浏览”-win98-256色,640X480-程序工作正确吗?选“是,设置此程序为一直使用兼容性设置。”完成。有的UCDOS版本的核心文件是knlvga.exe,也要照此进行兼容性设置。,返回到本节目录,1.2.3 相关C语言知识回顾,(2)运行UCDOS系统文件的方法。进入到命令提示符(MS-DOS状态)(“开始”-“程序”-“附件”-“命令提示符”)切换到UCDOS目录。(带下划线文字为输入的命令信息,“”表示回车
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实用教程 语言版
链接地址:https://www.31ppt.com/p-6154130.html