ImageVerifierCode 换一换
格式:DOCX , 页数:157 ,大小:155.36KB ,
资源ID:9819422      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9819422.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构1.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构1.docx

1、数据结构1第一章 绪论1.1 什么是数据结构一数据结构的概念 Niklaus Wirth说过Algorithm + Data Structures = Programs,其中程序设计: 为计算机处理问题编制一组指令集,算法:处理问题的策略,数据结构:问题的数学模型。在计算机发展的早期,主要用于 数值计算,例如:结构静力分析计算 线性代数方程组,全球天气预报 环流模式方程,但是随着计算机应用领域的扩大和硬、软件技术的发展,非数值计算问题越来越多(占90%) 例1:学生信息检索,计算机处理的对象之间存在一种简单的线性关系,这类数学模型可以归结为线性数据结构。 例2:计算机和人对弈(八皇后问题等),

2、为了得到合理的布局,计算机要存储当前的布局,从最初的布局开始,每个布局都会衍生出许多新的布局,这时计算机所要处理的是一颗对弈树,也是一种典型的数据结构。 例3:教学计划的编排(交通灯),一个教学计划包含许多课程,课程间有些必须按规定的先后顺序进行,有些则没有次序要求,各个课程间的次序关系可用图来表示。也是一种典型的数据结构 由此可见,描述这类非数值计算问题的数学模型已不再是数学方程,而是诸如表、树、图之类的数据结构,因此说,数据结构主要是研究非数值计算的程序设计中所出现的计算机操作对象以及它们之间关系和操作的学科。二数据结构的产生和发展1968年以独立的学科设立,之后不断发展,目前已成为计算机

3、专业的核心课程和许多非计算机专业的选修课程。1.2有关概念和术语一数据结构的概念 1数据: 所有能被输入到计算机中,且被计算机处理的符号的集合计算机操作的对象的总称,是计算机处理的信息的某种特定的符号表示形式 2数据元素: 数据中的一个“个体”,数据结构中讨论的基本单位,一个数据元素可能包含若干数据项,数据项:数据结构中讨论的最小单位,数据元素是数据项的集合,例如运动员(数据元素)姓名 俱乐部名称 出生日期 参加日期 职务 业绩其中出生日期 年 月 日 是组合项 3数据对象:性质相同的数据元素的集合,是数据的一个子集, 4数据结构:是相互之间存在一种或多种特定关系的数据元素的集合 ,数据元素的

4、关系称为结构。 二数据结构的表示 数据结构是一个二元组: Data_Structures = (D, S)其中:D是数据元素的有限集,S是D上关系的有限集。严格地讲,以上定义仅是数据的逻辑结构的定义,逻辑结构可以看作是从一个具体问题抽象出来的数学模型,与数据的存储无关。 数据的逻辑结构可归结为以下四类:线性结构、树形结构、图状结构、集合结构。 集合结构:属于同一集合,别无其他关系(常用其他结构表示) 线性结构:数据元素之间存在一对一的关系 树状结构:数据元素之间存在一对多的关系图状结构:数据元素之间存在多对多的关系 数据的存储结构 逻辑结构在存储器中的映象,他所研究的是数据结构在计算机中的实现

5、,主要有顺序存储、链式存储、索引和散列存储数据元素的映象方法即关系的映象方法:(表示 的方法) 顺序映象 以存储位置的相邻表示后继关系,y的存储位置和x的存储位置之间差一个常量C,而C是一个隐含值,整个存储结构中只含数据元素本身的信息,通常用数组来实现。 链式映象 以附加信息(指针)表示后继关系,需要用一个和x在一起的附加信息指示y的存储位置,不要求物理位置的相邻。 在不同的编程环境中,存储结构可有不同的描述方法,当用高级程序设计语言进行编程时,通常可用高级编程语言中提供的数据类型描述之。 例如:以三个带有次序关系的整数表示一个长整数时,可利用C语言中提供的整数数组类型,定义长整数为:type

6、def int Long_int 3;三、数据类型 数据类型:在用高级程序语言编写的程序中,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。因为类型明显或隐含地规定了,在程序执行期间,变量或表达式所有可能取值的范围,以及在这些之上允许进行的操作。 数据类型是一个值的集合和定义在此集合上的一组操作的总称。四抽象数据类型(Abstract Data Type 简称ADT) 1定义:是指一个数学模型以及定义在此数学模型上的一组操作,和数据类型本质相同,抽象指的是数学模型的数学抽象特性,而且抽象数据类型的范围更广。 ADT有两个重要特征: 数据抽象:用ADT描述程序处理的实体时,

7、强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。 数据封装:将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。例如 抽象数据类型复数的定义:ADT Complex 数据对象:De1,e2e1,e2RealSet 数据关系:R1 | e1是复数的实数部分,| e2 是复数的虚数部分 基本操作:InitComplex( &Z, v1, v2 )操作结果:构造复数Z,其实部和虚部分别被赋以参数v1和v2的值。DestroyComplex( &Z)操作结果:复数Z被销毁。GetReal( Z, &realPart )初始条件:复数已存在。操作结

8、果:用realPart返回复数Z的实部值。GetImag( Z, &ImagPart )初始条件:复数已存在。操作结果:用ImagPart返回复数Z的虚部值。Add( z1,z2, &sum )初始条件:z1,z2是复数。操作结果:用sum返回两个复数z1,z2的和值。 ADT Complex 假设:z1和z2是上述定义的复数,则Add(z1,z2,z3)操作的结果将得到z3=z1+z2抽象数据类型的描述方法 2抽象数据类型可用(D,S,P)三元组表示其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。 ADT 抽象数据类型名 数据对象:数据对象的定义数据关系:数据关系的定义基本操作:

9、基本操作的定义 ADT 抽象数据类型名其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为基本操作名(参数表)初始条件:初始条件描述操作结果:操作结果描述 基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以&打头, 除可提供输入值外,还将返回操作结果。 “初始条件”描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。 “操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。若初始条件为空,则省略之。1.3抽象数据类型的表示和实现:抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现一、 预处理:#defin

10、e TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#include #include typedef int Status;二、 C语言中的运算符()、-、 。 ! + - +(正) -(负) *(指针) & sizeof (类型) * / % + - = = != = & | & | = += -= *= /= %= = = &= = |= ,(逗号)1.4 算法和算法的衡量 一、算法 算法是为了解决某类问题而规定的一个有限长的操作序列。 一个算法必须满足以下五个

11、重要特性: 1有穷性 对于任意一组合法输入值,在执行有穷步骤之后一定能结束,即:算法中的每个步骤都能在有限时间内完成; 2确定性 对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径; 3可行性 算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之; 4有输入 作为算法加工对象的量值,通常体现为算法中的一组变量。有些输入量需要在算法执行过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中; 5有输出 它是一组与“输入”与确定关系的量值,是算法进行信息加工后得到的结果,这

12、种确定关系即为算法的功能。二、算法设计的原则 设计算法时,通常应考虑达到以下目标:1正确性 首先,算法应当满足以特定的“规格说明”方式给出的需求。其次,对算法是否“正确”的理解可以有以下四个层次:a程序中不含语法错误;b程序对于几组输入数据能够得出满足要求的结果;c程序对于精心选择的、典型、苛刻切带有刁难性的几组输入数据能够得出满足要求的结果;d程序对于一切合法的输入数据都能得出满足要求的结果;通常以第c层意义的正确性作为衡量一个算法是否合格的标准。2. 可读性 算法主要是为了人的阅读与交流,其次才是为计算机执行。因此算法应该易于人的理解;另一方面,晦涩难读的程序易于隐藏较多错误而难以调试;3

13、健壮性 当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名奇妙的输出结果。并且,处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。4高效率与低存储量需求 通常,效率指的是算法执行时间;存储量指的是算法执行过程中所需的最大存储空间。两者都与问题的规模有关。三、算法效率的衡量方法和准则 通常有两种衡量算法效率的方法:事后统计法缺点:1。必须执行程序 2其它因素掩盖算法本质事前分析估算法和算法执行时间相关的因素: 1算法选用的策略2问题的规模3编写程序的语言4编译程序产生的机器代码的质量5计算机执行指令的速度 一个特定算法

14、的“运行工作量”的大小,只依赖于问题的规模(通常用整数量n表示),或者说,它是问题规模的函数。假如,随着问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,则可记作:T (n) = O(f(n),称T (n) 为算法的(渐近)时间复杂度如何估算算法的时间复杂度? 算法 = 控制结构 + 原操作(固有数据类型的操作)算法的执行时间=原操作(i)的执行次数原操作(i)的执行时间,算法的执行时间与原操作执行次数之和成正比 从算法中选取一种对于所研究的问题来说是 基本操作的原操作,以该基本操作,在算法中重复执行的次数作为算法运行时间的衡量准则例1 for (i=1; i=n; +i)for

15、(j=1; j=n; +j) ci,j = 0;for (k=1; k=n; +k) ci,j += ai,k*bk,j;基本操作: 乘法操作,时间复杂度: O(n3)例2void select_sort(int a, int n) / 将a中整数序列重新排列成自小至大有序的整数序列。for ( i = 0; i n-1; +i ) j = i; for ( k = i+1; k n; +k ) if (ak aj ) j = k;if ( j != i ) aj ai / select_sort基本操作: 比较(数据元素)操作,时间复杂度: O(n2) 四、算法的存储空间需求 算法的空间复杂

16、度:S(n) = O(g(n) 表示随着问题规模n的增大,算法运行所需存储量的增长率与g(n)的增长率相同。 算法的存储量包括:1输入数据所占空间;2程序本身所占空间;3辅助变量所占空间。 若输入数据所占空间只取决与问题本身,和算法无关,则只需要分析除输入和程序之外的额外空间。若所需额外空间相对于输入数据量来说是常数,则称此算法为原地工作。若所需存储量依赖于特定的输入,则通常按最坏情况考虑。学习要点 :1. 熟悉各名词、术语的含义,掌握基本概念,特别是数据的逻辑结构和存储结构之间的关系。分清哪些是逻辑结构的性质,哪些是存储结构的性质。2. 了解抽象数据类型的定义、表示和实现方法。3理解算法五个

17、要素的确切含义:动态有穷性(能执行结束);确定性(对于相同的输入执行相同的路径);有输入;有输出;可行性(用以描述算法的操作都是足够基本的)。4掌握计算语句频度和估算算法时间复杂度的方法。第二章 线性表线性结构是一个数据元素的有序(次序)集 线性结构的基本特征:1集合中必存在唯一的一个“第一元素”;2集合中必存在唯一的一个“最后元素”;3除最后元素在外,均有唯一的后继;4除第一元素之外,均有唯一的前驱。2.1 线性表的逻辑结构一、线性表的类型定义抽象数据类型线性表的定义如下:ADT List 数据对象:D ai | ai ElemSet, i=1,2,.,n, n0 称n为线性表的表长; 称n

18、=0时的线性表为空表。数据关系:R1 |ai-1 ,aiD, i=2,.,n 设线性表为 (a1,a2,.,ai,.,an), 称i为ai在线性表中的位序。二、基本操作:结构初始化1InitList( &L )操作结果:构造一个空的线性表L。销毁结构2DestroyList( &L )初始条件:线性表L已存在。操作结果:销毁线性表L。引用型操作3ListEmpty( L )初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则FALSE。4ListLength( L )初始条件:线性表L已存在。操作结果:返回L中元素个数。5PriorElem( L, cur_e, &pre_e

19、)初始条件:线性表L已存在。操作结果:若cur_e是L的元素,但不是第一个,则用pre_e 返回它的前驱,否则操作失败,pre_e无定义。6NextElem( L, cur_e, &next_e )初始条件:线性表L已存在。操作结果:若cur_e是L的元素,但不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。7GetElem( L, cur_e, &next_e )初始条件:线性表L已存在, 1iLengthList(L)操作结果:用e返回L中第i个元素的值。8LocateElem( L, e, compare( ) )初始条件:线性表L已存在,compare( )

20、是元素判定函数。操作结果:返回L中第1个与e满足关系compare( )的元素的位序。若这样的元素不存在,则返回值为0。9ListTraverse(L, visit( )初始条件:线性表L已存在。操作结果:依次对L的每个元素调用函数visit( )。一旦visit( )失败,则操作失败。加工型操作10ClearList( &L )初始条件:线性表L已存在。操作结果:将L重置为空表。11PutElem( L, i, &e )初始条件:线性表L已存在,1iLengthList(L)操作结果:L中第i个元素赋值同e的值。12ListInsert( &L, i, e )初始条件:线性表L已存在,1iL

21、engthList(L)+1操作结果:在L的第i个元素之前插入新的元素e,L的长度增1。13ListDelete(&L, i, &e)初始条件:线性表L已存在且非空,1iLengthList(L)操作结果:删除L的第i个元素,并用e返回其值,L的长度减1。 ADT List利用上述定义的线性表可以完成其它更复杂的操作例2-1 假设有两个集合A和B分别用两个线性表LA和LB表示(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合AAB。 上述问题可演绎为,要求对线性表作如下操作:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去。1从线性表LB中依

22、次取得每个数据元素; GetElem(LB, i)e2依值在线性表LA中进行查访; LocateElem(LA, e, equal( )3若不存在,则插入之。 ListInsert(LA, n+1, e)void union(List &La, List Lb) / 将所有在线性表Lb中但不在La中的数据元素插入到La中 La_len = ListLength(La); Lb_len =ListLength(Lb); / 求线性表的长度 for (i = 1; i = Lb_len; i+) GetElem(Lb, i, e); / 取Lb中第i个数据元素赋给e if(!LocateElem(

23、La, e, equal( ) ListInsert(La, +La_len1, e); / La中不存在和 e 相同的数据元素,则插入之 / union例2-2 已知一个非纯集合B,试构造一个纯集合A,使A中只包含B中所有值各不相同的数据元素。void purge(List &La, List Lb) / 已知线性表Lb中的数据元素依值非递减有序排列(Lb是有序表),/ 构造线性表La,使其只包含Lb中所有值不相同的数据元素 InitList(LA); La_len = ListLength(La); Lb_len =ListLength(Lb); / 求线性表的长度 for (i = 1;

24、 i = Lb_len; i+) GetElem(Lb, i, e); / 取Lb中第i个数据元素赋给e if(!equal (en, e) ListInsert(La, +La_len, e); en = e; / La中不存在和 e 相同的数据元素,则插入之 / purge例2-3 归并两个“其数据元素按值非递减有序排列的”线性表LA和LB,求得线性表LC也具有同样特性设 La = (a1, , ai, , an) Lb = (b1, , bj, , bm) Lc = (c1, , ck, , cm+n)则 Ck = k = 1, 2, , m+n1分别从LA和LB中取得当前元素ai和bj

25、;2若aibj,则将ai插入到LC中,否则将bj插入到LC中。void MergeList(List La, List Lb, List &Lc) / 已知线性表La和Lb中的元素按值非递减排列。/ 归并La和Lb得到新的线性表Lc,/ Lc的元素也按值非递减排列。 InitList(Lc); i = j = 1; k = 0; La_len = ListLength(La); Lb_len = ListLength(Lb); while (i = La_len) & (j = Lb_len) / La和Lb均非空 GetElem(La, i, ai); GetElem(Lb, j, bj);

26、 if (ai = bj) ListInsert(Lc, +k, ai); +i; else ListInsert(Lc, +k, bj); +j; while (i = La_len) GetElem(La, i+, ai); ListInsert(Lc, +k, ai); while (j = Lb_len) GetElem(Lb, j+, bj); ListInsert(Lc, +k, bj); / merge_list 2.2 线性表的顺序存储和基本操作的实现一、 顺序表 用一组地址连续的存储单元依次存放线性表中的数据元素,线性表的起始地址,称作线性表的基地址,以“存储位置相邻”表示有

27、序对 即:所有数据元素的存储位置均取决于第一个数据元素的存储位置Loc(ai)=Loc(a1)+(I-1)*l,1in,l=sizeof(ElemType)顺序映像的C语言描述/- 线性表的动态分配顺序存储结构 -#define LIST_INIT_SIZE 80 / 线性表存储空间的初始分配量#define LISTINCREMENT 10 / 线性表存储空间的分配增量typedef struct ElemType *elem; / 存储空间基址 int length; / 当前长度 int listsize; / 当前分配的存储容量(以sizeof(ElemType)为单位) SqList

28、; / 俗称顺序表二、 线性表的基本操作的实现1、 初始化在顺序映像中的实现Status InitList_Sq(SqList &L) / 构造一个空的线性表L。 L.elem = (ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType); if (!L.elem) exit(OVERFLOW); / 存储分配失败 L.length = 0; / 长度为0 L.listsize = LIST_INIT_SIZE; / 初始存储容量 return OK; / InitList_Sq2、 线性表的建立Status CreaList_Sq(SqList

29、&L) int length,i,data; printf(输入表的长度n); scanf(%d,&length); InitList_Sq(L); printf(输入表中数据n); for(i=0;ilength;i+) scanf(%d,&data); L.elemi=data; L.length=length; return OK;/Crea_Sq3、线性表操作LocateElem(L, e, compare( )的实现:int LocateElem_Sq(SqList L, ElemType e,Status (*compare)(ElemType, ElemType) / 在顺序线性表L中查找第1个值与e满足compare()的元素的位序。/ 若找到,则返回其在L中的位序,否则返回0。 i = 1; / i的初值为第1元素的位序 p = L.elem; / p的初值为第1元素的存储位置 while (i = L.length & !(*compare)(*p+, e) +i; if (i = L.length) return i; else

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1