数据结构课程设计报告.doc
《数据结构课程设计报告.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.doc(62页珍藏版)》请在三一办公上搜索。
1、数据结构课程设计报告目录散列表的设计与实现3(一)设计内容简介3(二)算法设计说明4(三)测试结果8迷宫9(一)设计题目:迷宫9(二)需求分析:9(三)概要设计:9(四)详细设计11(五)调试分析、测试结果14(六)设计心得体会15猴子选大王20(一)设计题目:猴子选大王20(二)需求分析:20(三)概要设计:20(四)详细设计:21(五)调试分析、测试结果24(六)设计心得体会25(七)附录25基数排序27(一)设计题目:基数排序27(二)需求分析:27(三)概要设计:27(四)详细设计:27(五)调试分析、测试结果:30(六)附录:31校园导游咨询:34(一)设计题目:校园导游咨询34(三
2、)概要设计:35(四)详细设计:35(五)调试分析、测试结果:39(六)设计心得体会:41(七)附源码:41艺术品搬来搬去45(一)设计内容简介:45(二)算法设计说明:46(三) 测试结果:47(四)分析与探讨48大数运算48(一)设计内容简介48(二)算法设计说明:49(三)测试结果52灾区救灾53(一)设计内容简介:53(二)算法设计说明:54(三)测试结果:5556(四)分析与探讨56最小生成树56(一)设计题目:最小生成树56(二)需求分析:56(三)概要设计:57(四)详细设计:57(五) 调试分析,测试结果:59(六) 设计心得体会:59(七)附录:60散列表的设计与实现(一)设
3、计内容简介题目:散列表的设计与实现任务:设计散列表实现电话号码查找系统。要求:(1) 设每个记录有下列数据项:用户名、电话号码、地址;(2) 从键盘输入各记录,以用户名(汉语拼音形式)为关键字建立散列表;(3) 采用一定的方法解决冲突;(4) 查找并显示给定电话号码的记录; (二)算法设计说明在设计和实现哈希表时需要用到哈希函数,这是本次的重点,其他的输入和查找可以通过以前学到的顺序存储结构的相关知识进行解决。先看一下哈希函数的设计和实现,由于定义的名字是20个字符,则在输入后可以很容易知道它的第一个字母的相对应的阿克什码,利用阿克什码%哈希表的长度就应该得到它的位置。然而对于一些数据可能会有
4、发生一些冲突,这就需要我们解决冲突,对于这个冲突我是将待处理的冲突记录后移一位,若还冲突则还后移直到有空位或者记录满为止。再看一下按照电话号码查找时,由于不是按照电话号码排序进行的在查找电话号码时只能是从头到尾进行逐一检查对比,若对应的电话号码相同则输出其他的信息,直到最后仍没有则输出相关提示信息。其相应的数据结构如下:typedef char KeyType20;typedef structKeyType name;/姓名int TeleNo; /电话号码char Address100;/家庭住址RecType;/记录的类型typedef structRecType RecordM;/哈希表
5、中有M个记录int flagM;/标记,若有记录则标记为1,否则为0int CurrentSize;/当前哈希表中已被占用的个数HashItem;其中调用的相关函数:InitHash(h);/初始化哈希表,将记录清空InPutRecord(h);/想哈希表中输入记录信息,需要调用到上述哈希处理PrintRecord(h);/输出已经输入的信息FindRecord(h);/根据电话号码查找记录SaveRecord(h);/保存输入到程序中的记录到当前文件夹中对于整程序则有如下流程图:在输入信息时为了解决冲突,需要设计一个哈希函数,下面是我自己设计的哈希函数:bool Hash(HashItem
6、&H,RecType InRecord)int Key=(int)InRecord.name0%M;while(true)if (H.flagKey=0)/如果原记录不存在,则进行赋值H.flagKey=1;H.RecordKey=InRecord;return true; else/原记录存在/if(H.RecordKey.TeleNo=InRecord.TeleNo)if(strcmp(H.RecordKey.name,InRecord.name)=0)cout哈希表中记录H.RecordKey.name已存在了endl;return false;elseKey+;/coutjkjk;考虑
7、到没有输入数据时,不能进行查找和输出,所以要在调用检查这种情况,这样就可以避免不必要的错误。if(h.CurrentSize=0)cout记录为空,请输如信息endl;return false;输入数据时也需要考虑是否已经输入过,为了解决这个问题,在调用进行哈希处理时就需要在附加在已经发生冲突的位置进行比较,若有相同记录则输入过则给予相关提示。(三)测试结果 在没有输入任何数据的情况下,会有提示信息按照电话号码查找相关记录(四)分析与探讨在设计哈希表时考虑到便捷和操作的方便(因为输入姓名时必须至少输入一个字母),利用首字母的阿克什码,然而这样的发生冲突的概率会很大,这就需要一个更不易发生冲突的
8、哈希函数,其中一种哈希函数,就是将姓名的每个字符的阿克什码的值相加在进行处理,这样较我的方法更科学,也更不易发生冲突。 对于一个好的哈希函数在时间和空间复杂度上不是很高,同时发生冲突的机会较少,这样的函数才是一个真正的好函数。迷宫 (一)设计题目:迷宫(二)需求分析:任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求:在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;(三)概要设计: 在迷宫设计中,由于不能使用递归则可以借助栈来实现在迷宫中的前进和后退。同时在还需要设计
9、迷宫的大小、迷宫的出入口、根据输入的入口来寻找迷宫的出口,并把路径输出来。在这个编程中由于不知道所走路劲步数,所以采用了链式栈实现每一步的移动,若找到出路则前进否则返回下一步改变方向来实现相关的移动,所以栈在其间起到了工具作用。在设计迷宫大小和出入口时,采用的是根据操作者实现的,但迷宫的具体路障和通道是随机实现的。当然,重点是如何从出口来找出口。求迷宫的一条通路的伪码如下:设当前初始位置为出口:do 若当前位置可通,则 将该位置插入到栈顶;/纳入路径 若该位置为出口位置。则结束当前程序;/求得的路径放在栈中 否则切换当前位置的东临位置(即向右)为新的当前的位置; 否则 若栈不为空且栈顶元素尚有
10、其他位置未被探索,则设定新的当前位置为沿着顺时针旋转得到的栈顶位置的下一个临快; 若栈不为空且栈顶位置的四周均不通 则删去栈顶元素;/后退一步,从路径中删去该通块 若栈不空,则重新测试新的栈顶位置,直到找到一个可通的相邻块或出栈至栈空; /否则while(栈不为空)本程序的模块 主程序从main()函数中进行,包括输入迷宫的大小等信息,然后调用迷宫模块,在迷宫模块中也调用了栈的模块。栈模块实现栈抽象数据类型迷宫模块实现迷宫抽象数据类型各模块之间的关系如下: 主程序模块 迷宫模块栈模块(四)详细设计 1坐标的位置类型: typedef struct int r; int c;PosType;2.
11、迷宫类型:typedef structint Col,Row;/迷宫的大小int arrRangleRangle; /0表示障碍,1表示是可走的通道,-1表示外界的围墙 /2表示已经走过, 3表示已经知道其不能通过MazeType;void InitMaze(MazeType &M,int col,int row)/按照用户的输入的行数row和列数col列的二维数组(元素值为1或0)/设置迷宫的错初值,加上边缘的一圈的值 void PrintMaze(MazeType M)/根据已经进行二维数组的标记值来输出迷宫(或者其通路)bool Pass(MazeType M,PosType pos)/
12、求解迷宫M中,从Start到end的一条路径/若存在则返回true,否则返回falseStack S;InitStack(S);PosType curpos=start;/设置当前坐标为入口位置;int curstep=1; /当前的步数bool Find=false; /是否找到出口ElemType e;do if(Pass(M,curpos)/如果当前位置可以通过(不是障碍物且未曾留下足迹) FootPrint(M,curpos);/在当前位置标记为2 e.step=1; e.seat=curpos; e.di=1;/初始化为向东临位置移动(即向右) Push(S,e);/将已经周的的放入
13、栈中 if(curpos.c=end.c&curpos.r=end.r)/如果找到了出口则终止,并返回true Find=true; return Find; else/在其东临位置上移动,当前步数加一 curpos=NextPos(curpos,1); curstep+; else/当前位置不能通过 if(!StackEmpty(S) Pop(S,e);/将已经走过的最近位置弹出,数据保存在e中 while(e.di=4&!(StackEmpty(S)/当方向改变一周后仍不能找到可通过的路径 MarkPrint(M,e.seat);/留下不能通过的标记 Pop(S,e);/删除站定元素 cu
14、rstep-; /while if(e.di4)/不能通过则改变方向 e.di+;/方向顺时针改变一下 Push(S,e); curpos = NextPos(e.seat,e.di); /求下一个节点 /if /if /elsewhile(!StackEmpty(S)&!Find);/(!StackEmpty(S)&!Find);/当栈不为空且没有找到出口return false;/没有找到出口则返回false 从入口口到出口的查找的流程图(五)调试分析、测试结果 (1)由于是不确定的步骤,采用的是易于操作的链式栈,这样就不免了时间和空间的浪费。 (2)对于设计迷宫,可能会觉得会很繁琐,刚开
15、始也是自己设计迷宫图,但由于是随机设定迷宫的大小这就需要利用随机数来设计一个迷宫图。而利用%运算则可以解决这个问题,因为在设置迷宫数组时,1就代表通道,而0就是障碍,随意一个随机数%2得到的就是0或者1就可以自由设计迷宫了。 (3)来利用到进出栈时为计算进出栈的情况,特设定了curstep来调试程序的执行。那下面就介绍一下设计的迷宫界面情况: (六)设计心得体会 在知识方面,在设计迷宫时需要用到一些基本的如栈的相关信息,来解决不能使用递归的问题,递归在使用过程中虽然简介但不易理解通过栈的使用来加强我们对递归的使用。 在对问题的理解上我们通过对相关知识的理解和认识,来解决一些实际问题。附: *迷
16、宫的相关信息*/#define Rangle 100typedef structint Col,Row;/int arrRangleRangle; /0表示障碍,1表示是可走的通道,-1表示外界的围墙 /2表示已经走过, 3表示已经知道其不能通过MazeType;void InitMaze(MazeType &M,int col,int row)/按照用户的输入的行数row和列数col列的二维数组(元素值为1或0)/设置迷宫的错初值,加上边缘的一圈的值M.Col=col;M.Row=row;int i;/根据随机产生数进行初始化这个二维数组for(i=1;iM.Row+2;i+)for(int
17、 j=1;jM.Col+2;j+)/srand(time(0);int n=rand()%101+100;M.arrij=n%2;/得到的值是1或者0,即恰好是路或是通道/围墙的标记for(i=0;iM.Col+2;i+)M.arr0i=-1;M.arrM.Row+1i=-1;for(i=0;iM.Row+2;i+)M.arri0=-1;M.arriM.Col+1=-1;void PrintMaze(MazeType M)/根据已经进行二维数组的标记值来输出迷宫(或者其通路)int i,j;for(i = 0; i M.Row+2; i+) for(j = 0; j M.Col+2; j+)
18、if(M.arrij = 0) cout; /障碍,在Dos界面上是白色的else if(M.arrij =-1)cout;/围墙else if(M.arrij =2)cout; else cout ; coutn; bool Pass(MazeType M,PosType pos)/若在迷宫M中,当前位置pos不是障碍物0,不是围墙-1,以前没有经过2且不是不可通过3 则可以通过,并返回trueif(M.arrpos.rpos.c!=0&M.arrpos.rpos.c!=-1&M.arrpos.rpos.c!=2&M.arrpos.rpos.c!=2&M.arrpos.rpos.c!=3)r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告

链接地址:https://www.31ppt.com/p-2396766.html