分享
分享赚钱 收藏 举报 版权申诉 / 25

类型数据结构与算法-实现基础.ppt

  • 上传人:无敌
  • 文档编号:78456
  • 上传时间:2018-03-10
  • 格式:PPT
  • 页数:25
  • 大小:845.02KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    数据结构与算法-实现基础.ppt
    资源描述:

    1、第2章 实现基础,2.1 引子, 还是为每个具体应用都编一个程序?,类型名称:数据集合的基本统计数据对象集:集合S= , , 操作集:ElementType Average(S):求S中元素的平均值;ElementType Max(S):求S中元素的最大值;ElementType Min(S):求S中元素的最小值;ElementType Median(S):求S中元素的中位数。, 从不同的应用中抽象出共性的数据组织与操作方法?,例2.1 在日常数据处理中经常碰到的问题是需要对一组数据进行基本的统计分析。比如,分析一个课程班学生的平均成绩、最高成绩、最低成绩、中位数、标准差等。同样的统计要求也可

    2、能发生在其他领域。,1/25, 如何利用程序设计语言实现上述抽象类型?,第2章 实现基础,2.1 引子,1. 数据存储, C语言(包括其他高级语言)提供了数组、结构、链表等。 数据结构的存储实现跟所需要的操作密切相关。 在数据结构里,是利用数组和链表方式来实现的,包括很复杂的数据结构,如图、树等。,2. 操作实现,流程控制语句,即分支控制语句(如if-else、switch语句)、循环控制语句(如for、while、do-while语句)。 此外,还有模块化的程序设计方法函数,2/25,方法2 基于问题分解,相近的另一个问题是:求集合中的第K大整数。 当K = N/2时,集合的第K大整数就是中

    3、位数。,第2章 实现基础,2.1 引子, 求中位数Median(S),方法1 基于排序。首先将集合S从大到小排序,第 N/2 (大于等于N/2的最小整数)个元素就是中位数。,求解集合第K大整数问题的一种递归思路是:,元素 = e,元素 e,当K = N1时, 第K大整数就是e。,当K N1 时,第K大整数是在S2中的第(K-N1)大整数。,比较慢!,3/25,例2.2 求集合 6 5 9 8 2 1 7 3 4 的中位数。,【分析】由于该集合有9个元素,所以中位数应该是集合从大到小排序后的第9/2 = 5个元素。 首先,选取集合的第一个元素6,根据这个元素从集合中分解出S1=6,9,8,7,S

    4、2=5,2,1,3,4。 由于|S1|=4”访问指针指向的结构成员,形式: 结构指针变量名-结构成员名,对结构数组元素成员的引用是通过使用数组下标与结构成员操作符“.”相结合的方式来完成的,其一般格式为:结构数组名下标.结构成员名,7/25,共用体【定义】共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。,第2章 实现基础,2 数据存储基础,共用体类型定义的一般形式为:union共用体名 类型名 成员名1; 类型名 成员名2; 类型名 成员名n;, 各个成员变量在内存中都使用同一段存储空间,因此共用体变量的长度等于最长的成员的长度。 共用体的访问方式同结构体类似。,

    5、u.k=258的二进制表示:,u.ch0 = 2,u.ch1 = 1,8/25,链表,链表是一种重要的基础数据结构,也是实现复杂数据结构的重要手段。它不按照线性的顺序存储数据,而是由若干个同一结构类型的“结点”依次串接而成的,即每一个结点里保存着下一个结点的地址(指针)。 链表又分单向链表,双向链表以及循环链表等。,单向链表的结构,使用结构的嵌套来定义单向链表结点的数据类型。如:struct Node ElementType Data; struct Node *Next;,第2章 实现基础,2 数据存储基础,struct Node *p;p = (struct Node *) malloc(

    6、sizeof(struct Node);,9/25,(1)插入结点 ( p之后插入新结点t ),单向链表的常见操作,(2)删除结点,第2章 实现基础,2 数据存储基础,p-Next = t;,p-Next = t-next;,10/25,(3) 单向链表的遍历,p = head;while (p!=NULL) 处理p所指的结点信息; p = p-Next;,(4)链表的建立,有两种常见的插入结点方式:(1)在链表的头上不断插入新结点;(2)在链表的尾部不断插入新结点。如果是后者,一般需要有一个临时的结点指针一直指向当前链表的最后一个结点,以方便新结点的插入。,第2章 实现基础,2 数据存储基础

    7、,11/25,双向链表,如果将双向链表最后一个单元的Next指针指向链表的第一个单元,而第一个单元的Previous指针指向链表的最后一个单元,这样构成的链表称为双向循环链表。,第2章 实现基础,2 数据存储基础,struct Node ElementType Data; struct Node *Next; struct Node * Previous;,12/25, 双向链表的插入、删除和遍历基本思路与单向链表相同,但需要同时考虑前后两个指针。,第2章 实现基础,2 数据存储基础,struct DNode ElementType Data;struct DNode *Next;struct

    8、 DNode *Previous; *p,*t;指针操作顺序: t-Previous = p; t-Next = p-Next; p-Next-Previous = t; p-Next = t;,13/25,例2.4 给定一个单链表L,请设计函数Reverse将链表L就地逆转,即不需要申请新的结点,将链表的第一个元素转为最后一个元素,第二个元素转为倒数第二个元素,【分析】 基本思路是: 利用循环,从链表头开始逐个处理。 如何把握住循环不变式。(循环不变式表示一种在循环过程进行时不变的性质,不依赖于前面所执行过程的重复次数的断言。) 在每轮循环开始前我们都面临两个序列,其中p是一个待逆转的序列,

    9、而q是一个已经逆转好的序列,如下图。 每轮循环的目的是把p中的第一个元素插入到q的头上,使这轮循环执行好后,p和 q还是分别指向新的待逆转序列和已经逆转好的序列。,第2章 实现基础,2 数据存储基础,t = p-Next;p-Next = q;q = p;p = t;,14/25,类型定义typedef,第2章 实现基础,2 数据存储基础,除了使用C语言提供的标准类型和自己定义的一些结构体、枚举等类型外,还可以用typedef语句来建立已经定义好的数据类型的别名。,typedef 原有类型名 新类型名,typedef struct Node * NodePtr;,这样,Reverse函数头就可

    10、以写成:NodePtr Reverse( NodePtr L ),15/25,第2章 实现基础,3 流程控制基础,顺序结构是一种自然的控制结构,通过安排语句或模块的顺序就能实现。C语言为分支控制提供了if-else和switch两类语句,为循环控制提供了for、while和do-while三类语句。, 三种基本的控制结构是顺序、分支和循环。,函数定义函数调用函数递归,语句级控制,单位级控制,16/25,例2.5 求100到200之间的所有素数。,分析 可以设定两重循环:大循环(外层循环)控制整数i在100到200之间变化(用for语句),而小循环(内层循环)则用来判别i是否是素数(用while

    11、语句)。,第2章 实现基础,3 流程控制基础,17/25,函数与递归,比如:C语言提供了实数和整数的加法运算符号“+”来完成运算;但是“+”不能对复数做加法运算;可以写一个函数来实现这个功能。,第2章 实现基础,3 流程控制基础,【定义】函数是一个完成特定工作的独立程序模块。 只需定义一次,就可以多次调用。 函数包括库函数和自定义函数两种。例如,scanf、printf等库函数由C语言系统提供定义,编程时只要直接调用即可。 在程序设计中,往往根据模块化程序设计的需要,用户可以自己定义函数,属于自定义函数。,先定义复数类型 ImgType,以约定何为复数:struct Image double

    12、r; double i; ;typedef struct Image ImgType;,再定义复数的加法函数:ImgType ImgAdd(ImgType a, ImgType b) ImgType c; c.r = a.r + b.r; c.i = a.i + b.i; /* 实部和虚部分别相加 */ return c;,有了这个函数,以后可以在任何需要计算复数加法的地方调用它!,18/25, 在设计函数时,注意掌握以下原则:,第2章 实现基础,3 流程控制基础,(1)函数功能的设计原则:结合模块的独立性原则,函数的功能要单一,不要设计多用途的函数,否则会降低模块的聚合度;,(2)函数规模的

    13、设计原则:函数的规模要小,尽量控制在50行代码以内,这样可以使得函数更易于维护;,(3)函数接口的设计原则:结合模块的独立性原则,函数的接口包括函数的参数(入口)和返回值(出口),不要设计过于复杂的接口,合理选择、设置并控制参数的数量,尽量不要使用全局变量,否则会增加模块的耦合度。,19/25, 递归函数,【定义】一个函数除了可以调用其他函数外,C语言还支持函数直接或间接调用自己。这种函数自己调用自己的形式称为函数的递归调用,带有递归调用的函数也称为递归函数。, 两个关键点:(1)递归出口:即递归的结束条件,到何时不再递归调用下去;,第2章 实现基础,2.3 流程控制基础,(2)递归式子:当前

    14、函数结果与准备调用的函数结果之间的关系,如求阶乘函数的递归式子 Factorial(n) = n* Factorial(n-1),注意:程序代码不能写成上述式子!,递归调用,20/25,例2.8 设计函数求n!,图2.7 递归求解4!的过程,第2章 实现基础,2.3 流程控制基础,递归出口,递归式子,21/25,例2.9 汉诺塔(Tower of Hanoi)问题,(a)初始状态,(b)中间状态,3 流程控制基础,第2章 实现基础,【分析】可以用递归方法来求解汉诺塔问题,也就是将n个金片的移动问题转换为2个n-1个金片的移动问题。当n=1时,就不需要再递归了。,递归调用,22/25,3 流程控制基础,第2章 实现基础,23/25,例2.10 用递归方法求集合的中位数。,第2章 实现基础,2.3 流程控制基础, 根据前面求解集合第K大整数问题的递归算法思路,还需要解决以下两个关键问题:,(1)如何根据元素e将集合S分解为S1和S2两个集合? 可以采用临时申请空间的方法建立一个临时数组。,(2)如何设计递归函数的参数? 将临时数组作为参数传递。,24/25,25/25,若Small=right,即没有比e小的元素,要另选一个 基准,

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:数据结构与算法-实现基础.ppt
    链接地址:https://www.docduoduo.com/p-78456.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开