收藏 分享(赏)

2010数据结构实验指导书.doc

上传人:精品资料 文档编号:11174300 上传时间:2020-02-11 格式:DOC 页数:34 大小:628.62KB
下载 相关 举报
2010数据结构实验指导书.doc_第1页
第1页 / 共34页
2010数据结构实验指导书.doc_第2页
第2页 / 共34页
2010数据结构实验指导书.doc_第3页
第3页 / 共34页
2010数据结构实验指导书.doc_第4页
第4页 / 共34页
2010数据结构实验指导书.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

1、数据结构 B实验指导书目 录实验说明及要求 .3实验一 线性表 .4实验二 栈 .6实验三 队列 .8实验四 树 .10实验五 散列表 .14实验六 排序 .2实验七 查找 .5实验八 图 .8综合设计考核 .11附录 1 在 Visual S 2003 中建立、编译和运行程序 12附录 2 使用教材提供的参考文件的方法 17附录 3 如何设置编译器生成 C 代码 .20参考文献 .21实验说明及要求一 实验说明数据结构 B实验是为了辅助数据结构 B(双语教学)而开展的。因为理论教学采用了两种教材(数据结构与算法分析的 C+版和 C 语言描述版) ,所以在实验时程序的编写既允许采用 C 语言,

2、又允许采用 C语言。若采用 C 语言编程,C 语言版本的数据结构教材上给出的基本结构,均已包含在头文件中,具体实验时可以从计算机的“E:DataStruSourceCodeC”目录下获取。若采用 C+语言编程, 数据结构与算法分析(C+)(第 3 版)教材上给出的一些源码可以从计算机的“E:DataStruSourceCodeCPP”目录下获取。编程的工具建议使用 Visual C+开发环境,该编译环境对 C 和 C+代码均支持。 具体操作:在“F:DataStru”目录下面创建自己以自己学号作为名字的文件夹。自己所有的实验程序均放在该文件夹下面。如学号为“0600820101”的同学,在“F

3、:DataStru”目录下创建一个名为 0600820101 的文件夹,自己整个数据结构实验过程中设计的实验程序,都放在“F:DataStru0600820101”目录下即可。 二 实验要求在数据结构 B的课程实验过程中,要求学生做到: (1)预习实验,认真做好实验内容的准备,对实验可能出现的情况提前做出思考和分析,并写成实验预习报告,需要编写程序的实验,提前做好实验的分析和设计工作。 (2)仔细观察上机编程操作时出现的各种现象,记录主要数据、信息,做出必要说明1和分析。对实验中遇到的问题及对应的解决方案,要及时加以记录并写在实验报告上。 (3)认真书写实验报告。实验报告包括实验目的和要求,实

4、验情况及其分析。对需编程的实验,写出程序设计说明,给出主要源程序流程图和清单。 (4)遵守机房纪律,每人每次实验固定一台机器,不得随意换用其他机器。服从实验教师的安排和指挥,爱护实验设备,开关机时注意保护机器。 (5)实验课不得迟到、早退。如有事不能参加实验,须提前向实验教师请假,申请调换批次。 (6)根据学校规定,无故缺少任一次实验操作或任一次实验报告,实验总成绩为 0 分。平时实验的验收将分为两个部分。第一部分是上机操作,包括检查预习报告、实验操作、程序运行和即时提问。第二部分是提交书面的实验报告。此外,针对以前教学中出现的问题,实验将采用阶段检查方式,每个实验都应当在规定的时间内完成,过

5、期视为未完成该实验,以避免期末集中检查产生的诸多不良问题,希望同学们抓紧时间,合理安排,认真完成。 三 实验步骤1 选择自己的实验课题,写出预习报告,预习报告中应给出自己解决问题使用的实现算法以及对应算法的代码编写(注意不要把教材已经给出的文件代码重复抄写) 。2 利用预习报告,在上机实验时完成自己设计的实现,完成后举手示意让老师验收。3 回去后完成自己的实验报告。实验报告中应有算法的复杂度分析、实现以及遇到的问题及其解决方案和实验后的心得。实验报告在下一次实验时上交。实验一 线性表实验目的1、 掌握线性表的逻辑结构和物理实现;2、 掌握线性表的顺序存储结构和链式存储结构,熟悉对线性表的基本操

6、作;3、 在学有余力的情况下,掌握循环链表的实现及其基本操作;4、 根据实验要求设计并完成程序,把理论的基本操作知识转化到实际的实践应用中。实验原理线性表是最简单的一种数据结构。线性表是由 n(n=0)个数据元素组成的有限序列。线性表中的数据元素可以是各种各样的,但同一线性表中的数据元素必须有相同的属性,因此是属于同一数据类型的。在计算机内,可以用不同的方式来表示线性表,其中最简单和最常用的方式是用一组地址连续存储单元依次存储线性表中的元素。其特点是逻辑关系上相邻的两个元素在物理位置上也相邻。一般地,线性表的顺序存储结构可用一个一维数组结构来描述。用这种方法存储的线性表简称为顺序表。线性表的链

7、式存储结构(也称链表)的特点是用一组任意的存储单元存储线性表中的数据元素,不要求逻辑上相邻的元素在物理位置上也相邻。链表中的结点可用 C 语言中的结构数据类型来描述,也可以用 C+语言中类来实现。链表中的结点只有一2个链域的链表称为单链表。循环链表则是一种首尾相接的链表。对线性表首先要掌握作为抽象数据类型(ADT)的那些基本操作,其次才是具体实现的细节。实验要求(课题一必做,课题二选做)实验课题一:a、 (C+语言实现):1、 使用教材参考代码中给出的线性表类构造一个表,查找表内是否有某元素,如果有则交换该元素和它相邻的下一元素的位置;2、 (2 和 3 中选一个即可)为链表类 List 增加

8、一个成员函数 reverse,使其具备能倒置链表中元素的功能。写好的表倒置函数的时间复杂度应该是(n);3、 为 List 链表实现增加逆转迭代器类(reverse iterators) ,并增加方法 rbegin 和 rend,具体要求参见教科书 109 页习题 3.16。b、 (C 语言实现)在给出参考代码中给出的线性表结构体以及与之相关的函数的基础上,编写程序,实现以下操作:1、构造一个表,然后查找表内是否有某元素,如果有则交换该元素和它相邻的下一元素的位置;2、写一个函数 reverse,使其能倒置线性表中元素。这个表倒置函数的时间复杂度应该是(n) 。课题一的具体实验内容1、构造元素

9、类型为整型的线性表,将以下元素插入分别插入线性表:2、查找表中是否存在元素 20,实现元素 20 与元素 9 的交换;3、按照课题要求编写函数,实现线性表元素的倒置,即倒置后的表应为。*实验课题二:约瑟夫(Josephus)问题的求解(循环链表的使用,使用 C 和 C+语言均可) 。假设有编号为 1,2,n 的 n 个人围坐成一圈,约定从编号为 k(n=k=1)的人开始报数,数到 m 的那个人出列,他的下一个人从 1 开始重新报数,数到 m 的那个人出列,依次类推,直到所有的人全部出列为止,由此产生一个出队编号的序列。1、给定一个 8 个人的圈(n=8) ,约定从第 3 个人开始报数(k3)

10、,数到第 4 个人时的那个人出列(m4) ,使用循环链表,产生一个出队编号的序列。2、参考的出队序列为:。实验步骤:1、 在“F:DataStru”目录下面创建自己以自己学号作为名字的文件夹。自己所有的实验程3序均放在该文件夹下面。2、 创建项目,文件保存到第 1 步说的目录。3、 每台计算机的教材参考代码在“E:DataStru” ,先解压至“F:DataStru ”。4、 通过“工具/选项/vc+目录/包含文件”把相应的 F:DataStru”的代码包含进去,以便编程的时候,包含相关头文件,或参考测试程序。5、 弄懂教材参考代码中给出的线性表类(c+)或线性表结构体以及与之相关的函数(c)

11、;构造一个表,进行实验要求的课题。实验二 栈【实验目的】1、 掌握栈的 LIFO(后进先出)特点和栈的存储结构;2、熟悉栈的各种操作;3、掌握栈的应用方法,理解栈的重要应用;4、根据实验要求设计并完成程序,把理论的基本操作知识转化到实际的实践应用中。【实验原理】栈是一种特殊的线性表,这种线性表只能在固定的一端(称为栈顶(top) )进行插入和删除操作。由于只允许在栈顶进行插入和删除操作,所以栈的操作是按照“后进先出”(Last In First Out,缩写为 LIFO)原则进行的。本实验要求用栈作为基本的数据结构解决4各实验课题。【实验要求】 (实验课题一必做,其他选做)实验课题一: 将一个

12、十进制数转换成另外一个 P 进制数字符串(可以是二进制到十六进制)。转换函数的原型为:void Convert (int n, char str, unsigned P);n:输入,待转换的数str:输出,转换好的 P 进制字符串P:输入,要转换的进制,取值可从 2 到 16。如果在这范围之外,可认为输入错,不做转换。将一个整数转换成 P 进制的数,我们可以采用如下的方法:例:十进制转换成八进制(P 等于 8):(66) 10=(102)866/8=8 余 28/8 =1 余 01/8 =0 余 1当商为 0 时转换结束,转换结果为上述过程余数序列的逆序:102。先求得的余数在写出结果时最后写

13、出,最后求出的余数最先写出,符合栈的 LIFO 性质,故可用栈来实现数制转换。*实验课题二:用 2 个栈实现一个队列,并对使用这种方法实现的队列执行入队、出队操作的时间进行分析。用 C 实现的同学,应该实现教科书第 76 页 Figure 3.56(参考代码的 queue.h)中定义的队列类型的那些操作函数;用 C+实现作为 ADT 的队列,应以以下抽象类 VQueue 作为与用户的界面接口:template class VQueue public:virtual void enqueue (const Objectvirtual void dequeue (Objectvirtual voi

14、d dequeue () = 0;virtual const Objectvirtual bool empty () const = 0;出队函数 dequeue()有 2 个原型,如 QueueQ; int x; x = Q.front(); Q.dequeue (); 等价于Q.dequeue(x); 前面的用法符合 STL 的习惯,后面一个有时会觉得方便,所以 2 个都放在接口里。*实验课题三: 将一个普通代数表达式(infix expression)转换为后缀表达式(postfix 5expression) 。转换规则描述参见:描述 C 语言描述的课本 pp.68-71,C+语言描述的

15、课本pp.99-102。在本实验中,也只用、 (、 )作为算符,优先级自低至高为、*、 () 。栈的 ADT 接口:用 C+描述的教科书中没给栈的 ADT,可以用以下 Stack 类模版:template class Stack public:bool empty( ) const return theList.empty( ); const Object void push( const Object void pop( Object theList.pop_front( ); void pop( ) theList.pop_front( ); private:List theList;实验

16、三 队列【实验目的】1、 掌握队列的 FIFO 的特点(先进先出)特点和队列的存储结构;2、熟悉队列的各种操作;3、掌握队列的应用方法,理解队列的重要应用;4、根据实验要求设计并完成程序。【实验原理】队列是限定只能在表的一端进行插入,而在表的另一端进行删除的线性表。是一种“先进先出” (First In First Out,缩写为 FIFO)的线性表。队列可以有多种实现形式,本实验要求将队列作为一个抽象数据类型(ADT)来解决各实验课题。6【实验要求】 (实验课题一必做,课题二选做)实验课题一:回文(palindrome)是指一个字符串从前面读和从后面读都一样,仅使用若干栈和队列、栈和队列的

17、ADT 函数以及若干个 int 类型和 char 类型的变量,设计一个算法来判断一个字符串是否为回文。假设字符串从标准输入设备一次读入一个字符,算法的输出结果为 true 或者 false。可以用一些字符串测试输出结果,如:“abcdeabcde“, “madamimadam“ 等实验课题二:打印扬辉三角形。打印二项式 ( a + b )i 的展开系数,也就是扬辉三角,国外叫做 Pascals triangle。如右下图为扬辉三角的前 8 行数据。按照如右图所示的方式,完成对应杨辉三角的打印输出。杨辉三角队列的 ADT 接口:用 C+描述的教科书中没给队列的 ADT,可以根据上次实验给出的抽象

18、类 VQueue 写一个实现,也可以用以下 Queue 类模版:template class Queuepublic:bool empty( ) const return theList.empty( ); const Object void enqueue( const Object void dequeue( Object theList.pop_front( ); void dequeue( ) theList.pop_front( ); private:List theList;如果要用 STL 的 queue,可以包含头文件:#include 要注意在 STL 的 queue 中,入

19、队、出队函数不是用 enqueue 和 dequeue,而是类似 stack,用 push 和 pop。实验四 树【实验目的】1、 掌握树这种数据结构的特点和树的存储结构;2、掌握二叉树的建立(二叉链表的建立) ;3、掌握并灵活运用各种次序的遍历算法;4、根据实验要求设计并完成程序,把理论的基本操作知识转化到实际的实践应用中。【实验原理】由于树的定义是递归的,对树的处理原则上也应是用递归的方式。二叉树是一种非常重要的类型。针对二叉树的操作主要有三种遍历(先序遍历、中序遍历、后序遍历) ,遍历二叉树是二叉树中各种运算的基础。8【实验要求】 (实验课题一必做,课题二、三选做)实验课题一:将下图中的

20、二叉树用二叉链表表示:1 用三种遍历算法遍历该二叉树,给出对应的输出结果;2 写一个函数对二叉树搜索,若给出一个结点,根据其是否属于该树,输出 true 或者false。3 写函数完成习题 4.31(C+版)或 4.28(C 版教科书) 。实验课题二:构造表达式树。可参考教科书4.2.2(具体规则用 C+描述教材的见 p.122,用 C 描述教材的见 p.87) 。实验课题 3:哈夫曼编码的生成当哈夫曼树生成后,对由根节点到各叶结点(对应于待编码的符号)的路径作 0-1 编码就得到相应的哈夫曼编码。任何一棵满二叉树(a full binary tree)都可以看作是一棵哈夫曼树,所以本课题要求

21、:造一棵满二叉树,根据这棵二叉树生成相应的哈夫曼编码。AB CD EF G H9附录:二叉树的 ADT 接口用 C+描述的教科书中没有给出一个二叉树的 ADT 接口,我们在这里给出一个二叉树类模板,供同学们使用。/ Binary tree node abstract classtemplate class BinaryNode public:/ Return the nodes elementvirtual Object/ Set the nodes elementvirtual void setVal(const Object/ Return the nodes left childvirt

22、ual BinaryNode* left() const = 0;/ Set the nodes left childvirtual void setLeft(BinaryNode*) = 0;/ Return the nodes right childvirtual BinaryNode* right() const = 0;/ Set the nodes right childvirtual void setRight(BinaryNode*) = 0;/ Return true iff the node is a leafvirtual bool isLeaf() = 0;/ Binar

23、y tree node class, an implementation of the abstract class BinaryNodetemplate class BinNode : public BinaryNode private:Object it; / The nodes valueBinNode* lc; / Pointer to left childBinNode* rc; / Pointer to right childpublic:/ Two constructors - with and without initial valuesBinNode() : lc(NULL)

24、, rc(NULL) BinNode(Object e, BinNode* l =NULL, BinNode* r =NULL): it(e), lc(l), rc(r) BinNode () / DestructorObject 10void setVal (const Object inline BinaryNode* left() const return lc; void setLeft(BinaryNode* b) lc = (BinNode*)b; inline BinaryNode* right() const return rc; void setRight(BinaryNod

25、e* b) rc = (BinNode*)b; bool isLeaf() return (lc = NULL) ;生成二叉树根据不同的应用规则可以有各种生成二叉树的方法,如二叉搜索树、表达式树、哈夫曼树等。我们在这里描述一个根据对二叉树各节点遍历所得序列生成二叉树的方法,一般从这样一个序列不一定能生成这棵二叉树。但如果把这二叉树的所有空指针都画出来就得到一棵满的扩充的树,根据对这棵扩充树的遍历得到的序列,可以生成那棵二叉树。例如,用表示空指针,那么课题一图中那棵扩充二叉树的先序遍历得到的节点序列是:char *extendedPreOrd = “ABDFEGHC“;用它做为下列二叉树建造函数

26、的输入就得到前图所示的树。BinNode *BinTreeBuildFrmStr(char *root-setLeft(BinTreeBuildFrmStr (str);root-setRight(BinTreeBuildFrmStr (str);return root;else / the NULL pointer , just skip itstr+;return NULL;注:把这个函数的参数类型由对二叉树节点指针的引用改为指向指针的指针,很容易把它改为 C 的函数。11二叉树的打印与教科书上的二叉树图相比,这里打出的数向左旋转了 90 度。当然了,这里还是递归。改成 C 函数也很容易。

27、template void printTree(BinaryNode* subroot, int depth = 0) if (subroot = NULL) return; / Empty treeprintTree(subroot-right(), depth +1); / Do right subtreefor (int i=0; ival() left(), depth +1); / Do left subtree12实验五 散列表【实验目的】1 掌握散列表的构造方法;2 观察冲突现象及其解决;3 掌握使用散列法进行查找的方法。【实验原理】散列(hashing)的基本思想是:通过一个确

28、定的散列函数关系 H,把数据对象的关键字 K 映射到相应的散列值 H (K),这个值就是该对象在散列表中的存储位置,又称散列地址。查找时根据要查找的关键字 k 用同样的散列函数计算地址 H(k) ,然后在散列表相应的单元取要找的对象。对于散列表,最重要的是构造散列函数和对冲突的处理。影响散列表查找效率的因素是装填因子(load factor) 。【实验要求】实验课题:做这个实验时采用 Open Addressing 框架,也可加做 Separate Chaining 以形成比较。1 构造散列表,把字符串数组中的各项加入到散列表中string MyBirds13 = “robin“, “spar

29、row“, “hawk“, “eagle“, “seagull“, “bluejay“,“owl“, “cardinal“, “Jakana“, “Moa“, “Egret“, “Penguin“, “hawk“ ;用 C 表示,可以是char * MyBirds13 = “robin“, “sparrow“, “hawk“, “eagle“, “seagull“, “bluejay“,“owl“, “cardinal“, “Jakana“, “Moa“, “Egret“, “Penguin“, “hawk“ ;为便于观察冲突现象,初始构造散列表时,表的容量不要过大,对 Open Addres

30、sing,装载因子为 0.5 左右,对于 Separate Chaining,装载因子为 1 左右即可。也不要做 rehash(应该改源代码的哪里,如何改) 。建议对源代码做些改动、增加一些输出(建议用条件编译控制这些输出) ,以便于观察冲突的发生和解决;对于 Open Addressing,参考代码的冲突解决方案是用的平方探测(quadratic probing) ,如果用线性探测(linear probing)的策略,应该对函数 findPos 做什么修改(冲突解决的策略都集中在那里)?2 观察不同的散列函数产生冲突散列地址的情况教科书上给了 3 个以字符串作输入的散列函数(两教科书第 3

31、 个不一样) ,观察记录它们产生冲突散列地址的情况,写入你的实验报告。还可对下列散列函数(所谓 ELF hash,Unix System V 用的)作观察13int hash (const string for ( int i = 0; i 24;h return h; / % M3 对散列表做查找。【提示】伴随课本的参考源程序中相关的部分,提供了一个现成的框架,可在此基础上修改(C+描述):Separate Chaining:TestSeparateChaining.cppSeparateChaining.hSeparateChaining.cppOpen Addressing:TestQu

32、adraticProbing.cppQuadraticProbing.hQuadraticProbing.cpp用 C 描述课本的同学可参考:hashfunc.c、hashquad.c、hashquad.h、hashsep.c、hashsep.h 和 testhash.c实验六 排序【实验目的】1、 掌握常用的几种内部排序算法,理解各种内部排序算法的基本思想和特点;2、熟悉内部排序法的排序过程;3、掌握内部排序算法的时间复杂度,针对不同的问题能选择出合适的排序方法。【实验原理】int hash (char * key) / C versionunsigned long h = 0;while

33、( *key ) h = (h 24;h return h; / % M14排序是将一个无序的数据元素(或记录)序列,重新排列成一个按关键字递增(或递减)的有序序列的过程。在计算机算法设计中,排序占有相当重要的地位。排序分为内排序和外排序。我们只讨论内排序。本课程涉及的主要的内排序算法有:插入排序、Shell 排序、归并排序、快速排序等。排序算法有稳定和不稳定之分。【实验内容】 (实验课题一必做,课题二选做)实验课题一:【用 C 描述课本的同学】有以下结构体构成的数组:struct StudentInfo char ID10;char * name;float score;StuInfo12=

34、“0800301105“, “JACK“, 95,“0800201505“, “LUN“, 85,“0400820115“, “MARY“, 75.5,“0400850122“, “KATE“, 78.9,“0500201011“, “LILI“, 88,“0800401105“, “JACK“, 96,“0600830105“, “JAN“, 98.4,“0952520012“, “SAM“, 75,“9721000045“, “OSCAR“, 64,“0700301105“, “JACK“, 97,“0458003312“, “ZOE“, 68.9,“0400830211“, “BOBI“

35、, 87.6 ; 1 使用直接插入的排序方法按照学号的顺序对以上数组进行排序(递增) ;2 分别用归并排序和快速排序按照姓名的顺序对以上数组进行排序(递增) ,有 3 人的名字是“JACK“,注意观察排序是否稳定。【用 C+描述课本的同学】对实验 5 中的 Bird 类数组排序class Bird int ID; / 代表其它信息string name; / 当作 keypublic:15Bird() / 缺省构造函数Bird (int k, const string const string ;由于排序是基于比较的,所以可排序的对象一定要定义比较算符,有的排序算法需要比较算符 operato

36、r V 排序,但vector 没有 的初始化形式,所以这里以数组的形式初始化。实验中做各种排序时,可以用循环把数组的各元素赋给 vector。实验课题二:实测比较各排序算法的运行时间。1、定义长度为 N 的数组(C)或 vector(C+) ,用 0 到 N-1 之间的随机整数对各元素赋值;2、用内插排序、归并排序和快速排序对其排序,记录排序的时间;3、用不同的 N 做几次测试,比较各排序算法所用的时间。最初可以取 N = 1000,你可能得不到有效的测试结果,接下来,你可能会令 N = 10000,这时的测试数据会比较有意义了,再接着你可能想把 N 再扩大 10 倍,这里要提醒同学们,内插排

37、序的时间复杂度是 O (N2),当 N 扩大 10 倍,它需要的排序时间大致要扩大上百倍,你有这个耐心等待吗?所以请同学们小心,对较大的 N,只应对 O(N log N)的算法测试;4、当测试框架搭好后,很方便对其它排序作测试,所以鼓励同学们对 Shell 排序、堆排序等,甚至 STL 中的 sort、stable_sort(用迭代器指定排序范围) ,都可一并作比较测试;5、注意记录整理测试结果好写入实验报告。【实验参考程序】C 和 C+描述的排序算法的实现分别在各自的 Sort.h 内。16C+ 版还有:TestSort.cpp 和 Random.h、Random.cpp,后面 2 个用于产

38、生伪随机数。TestSort 已经搭了一个测试框架,对书中各种排序甚至选择算法作了测试,但没有测排序时间,用 C 写的同学也可以参考(时间测试见下面) 。用 C 的同学可以用 C 标准库的随机数产生器(C+版实际用的也是它):#include / 这个头文件包含下列函数的说明void srand (unsigned seed); / 随机数产生器初始化,一般应用只需自选 seed 初始化一次/ seed 就决定了后面调用 random 产生的序列int random (int num); / 产生 0, num-1 之间的随机数【时间测试函数】C 和 C+都可以用#include / Used

39、 by timing functions/ Timing variables and functionsclock_t tstart = 0; / Time at beginning of timed sectionvoid Settime () / Initialize the program timer tstart = clock(); double Gettime() / Return the elapsed time since the last call to Settime return (double)(double)clock() - (double)tstart)/(dou

40、ble)CLOCKS_PER_SEC; 测试例:Settime (); / 开始计时,这之后到调用 Gettime ()之间是要测试时间的程序段/ 待测的语句段double elapsedTime = Gettime (); / elapsedTime 就是这段时间(以秒计)实验七 查找【实验目的】1、 掌握几种常用的内部查找算法;172、熟悉二分查找算法和二叉搜索树的查找过程。【实验原理】查找又称为检索,就是根据给定的某一个值从一个数据元素集合中找出某个特定的数据元素。查找和排序一样,是数据处理中经常使用的运算,查找算法的优劣对整个软件系统的影响很大。在一个数据元素集合中进行查找可选用的方法

41、和该数据元素集合的存储结构有很大关系。查找有内查找和外查找之分。对于线性表,主要的内查找算法有顺序查找、二分查找等。但要注意,二分查找只适合于有序的线性表。第 4 章学的二叉搜索树是搜索性能优良的存储结构。【实验要求】 (实验课题一必做,课题二选做)实验课题:1 编写程序对实验六中的数组进行查找:用 C 版教科书的同学:对数组 StuInfo 按照学号(ID)递增排序,然后用二分查找的方法进行学号查找,若找到则输出该学生的全部信息,若找不到相应记录也给出提示;接下来,对该数组按照学分绩(score) 递减排序后,使用二分查找法以学分绩作关键字进行查找。用 C+版教科书的同学:对 MyBirds

42、 分别以 name 和 ID 为关键字排序,然后进行二分查找。2 对二叉搜索树查找用 C 版教科书的同学:对 StuInfo 数组的数据以姓名(name)为关键字(key)建立一棵二叉搜索树(BST) ,然后以姓名为关键字进行搜索,并输出该记录相应的其它信息。要做到对关键字查找和删除,需要改变 Find 和 Delete 函数的原型,把对 ElementType 的查找和删除变成对 KeyType 的查找和删除,即把Position Find( ElementType X, SearchTree T );SearchTree Delete( ElementType X, SearchTree

43、T );改为Position Find( KeyType X, SearchTree T );SearchTree Delete( KeyType X, SearchTree T );当然,对这些函数也要做相应的改动。用 C+教材的同学,和实验五(散列)的进阶类似,要改进二叉搜索树(BST)ADT 定义,原来的 BST ADT 主要函数是:18template class BinarySearchTreeconst Comparable const Comparable bool contains( const Comparable void insert( const Comparable

44、void remove( const Comparable ;现在要添加一个类模版参数 Key,以及根据 Key 来查找和删除的函数 find 和 remove:template class BinarySearchTreebool find(const Keyconst Comparable const Comparable bool contains( const Comparable void insert( const Comparable void remove( const Comparable void remove( const Key ;这样,就可以根据 Key 来对 BST

45、 搜索和删除。读一下参考源码(或教科书 pp.126-34) ,就知道还应该添加/修改相应的私有成员函数。接下来,对 MyBirds 数组的数据以 name 为关键字(Key)建立一棵二叉搜索树(BST) ,如果打印这棵树,注意是不是少了什么?是什么原因,如果以 ID 作 Key 呢?建好 BST 后,对其作相应的查找。【实验参考程序】二分查找C 版教科书在 p.24 Figure 2.9,相应的程序名是 fig2_9.c。二分查找函数原型是:int BinarySearch ( const ElementType A , ElementType X, int N );用它只能对 C 的基本算

46、术类型(整型、浮点、指针)进行搜索,要对其它构造类型搜索,需对其进行改写,其原型应该是:int BinarySearch (const ElementType A , int N, Key X, int cmp(Key, ElementType) );其中类型 Key 一般是 ElementType 的一个域;cmp 是指向比较函数的指针,取代原先函数中的、 int binarySearch( const vector 原程序中两个对象的比较变成 Comparable 对象 a 和 Key x 的比较,所以你有两种选择:要19么重载比较算符,要么把原函数中相应语句改为用 Comparable

47、对象的 key 和 x 比较。二叉搜索树(BST)C 版教科书:tree.h 、tree.c 和 testtree.c,注意程序中标注的图和教科书中的图编号有差别。C+版:BinarySearchTree.h 和 TestBinarySearchTree.cpp在打印树的时候,可能需要重载算符 “ “ bird.getInfo(); 20实验八 图【实验目的】1、 掌握图的邻接矩阵表示方法和邻接表表示法;2、掌握图的深度优先遍历和宽度优先遍历方法;3、熟悉构造最小生成树的 Prim 算法;4、单源最短路径的 Dijkstra 算法。【实验原理】图是一种比树更为复杂的数据结构。图的逻辑结构是数据

48、元素之间多对多的联系,在图中的每一个结点都可能和其它的结点相关联。图的应用范围十分广泛,诸如电子线路分析、系统工程、寻找最短路径、人工智能、计算机科学、化学、控制论以及社会科学等领域。相对前面的数据结构而言,图的内容比较难。通常有两种遍历图的方法:深度优先搜索(DFS)遍历和广度优先搜索(BFS)遍历。深度优先搜索类似于树的先序遍历,是树的先序遍历的推广,是一个递归过程。广度优先遍历类似于树的按层次遍历过程。最小生成树是用于构造连通图的最小代价生成树,在交通、通信等领域有着广泛的应用,最小生成树有着很多种算法,典型的有 Prim 算法和 Kruskal 算法。从单个源点到其余各顶点的最短路径算法的应用比较广泛,尤其是在交通联系方面。典型的实现算法有 Dijkstra 算法。【实验要求】实验课题:图 2图 10 657431 2012340 1 23 454 2 1 3285 14921图 3实验任务: 对图 1 图 3,实现以下操作,记录并分析相应的试验结果: 输出相应图的邻接矩阵; 输出相应图的 DFS 结果; 输出相应图的 BFS 结果。选做:对图 3,用 Dijkstra 算法求出其单源最短路径。使用 Prim 算法求出其最小生成树。图 4 图的邻接矩阵表示

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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