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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计说明书.doc

1、*实践教学* 兰州理工大学计算机与通信学院2014年秋季学期数据结构课程设计 题 目:猴子吃桃子问题;跳马问题; 通过单字符置换可以将一个 单词改为另一个单词 专业班级:12级信息与计算科学(2)班 姓 名: 林承勇 学 号: 12540236 指导教师: 包仲贤 成 绩: 目 录摘 要1一猴子吃桃问题21.采用类语言定义相关的数据类型22.算法设计23.调试分析34.测试结果45.源程序(带注释)6二跳马问题101.采用类语言定义相关的数据类型102.算法设计103.调试分析114.测试结果115.源程序(带注释)13三通过单字符置换可以将一个单词改为另一个单词161.采用类语言定义相关的数

2、据类型162.算法设计163.调试分析184.测试结果185.源程序(带注释)19总 结23参考文献24致 谢25摘 要 本程序主要主要解决猴子吃桃问题,跳马问题,通过单字符置换可以将一个单词改为另一个单词。猴子吃桃问题是分别采用数组数据结构,链式数据结构以及递归方法根据猴子每天吃的桃子数来求解一群猴子摘的桃子数。跳马问题也称为骑士周游问题,是算法的设计中的经典问题。如果有这样一种走法,则称所走的这条线为马的周游路线。在8*8的方格棋盘中马的行走规则从棋盘的某一方格出发,开始在棋盘上周游,如果能不重复地走遍棋盘上的每一个方格,这样的一条周游路线在数学上被称为国际象棋棋盘上马的哈密尔顿链。通过单

3、字符置换可以将一个单词改为另一个单词是假设存在一个5字母单词的字典,给出一个算法确定单词A是否可以通过一系列的单字符置换转换为单词B,并且如果可以的话,输出相应的单词序列。正如bleed通过序列bleed、blend、blond、blood转换为blood。这些程序主要功能是加深我们对算法与数据结构中存储,线性表和栈的理解。让我们对算法与数据结构有个更深刻的认识。关键词: 猴子吃桃;跳马;字符转换;数据结构一猴子吃桃问题 有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。要求:1)采用数组数据结构实现上

4、述求解;2)采用链式数据结构实现上述求解;3)采用递归实现上述求解。1.采用类语言定义相关的数据类型typedef struct Nodeint i;intk;/数据域struct Node *next;/指针域Node,*PNode;/定义一个指针用于链表求解2.算法设计1.一维数组解决。 建立一个一维数组a10从第九天开始算起令a9=1利用for循环计算前八天猴子吃的桃子数目并同时将后一天吃的桃子数赋值到前一天。最后即可得出猴子一共吃的桃子数。2.递归函数解决: 定义一个整形函数DiGui使用if函数控制是否调用函数本身。桃子数等与一这说明第九天吃了一个桃子函数便可以结束。如果桃子数不为一

5、则一直调用函数本身知道调用结束。3链式数据结构解决:定义头指针p1,p2指针指向头结点。P2指针负责传值进行循环。利用for函数进行循环。并将后一天的之赋值给前一天。最后便可得到猴子吃的总的桃子数。主函数控制各子函数的调用流程如图1-1所示4321退出DiGuiShuZuLianBiao结束开始输入n判断n请输入正确的选择N图1-1 主控制程序流程图3.调试分析a、调试中遇到的问题及对问题的解决方法;根据第十天所剩桃子个数,采用倒推方法,递归的求出第九天,第八天,第七天.直到算出刚开始猴子拥有桃子的总数。解决方法主要是用递归算法采用数组存储方法。b、算法的时间复杂度和空间复杂度。 通过1、2、

6、3数字键选择计算方法时间复杂度为O(n),空间复杂度为O(1)4.测试结果1)执行程序进入主菜单,如图1-1所示图1-2 主菜单2) 输入1用数组方法求解,如图1-2所示图1-3数组求解3) 输入2用链表求解,如图1-3所示图1-4 链表求解4) 输入3用递归方法求解,如图1-4所示图1-5递归求解5) 输入4退出程序,如图1-5所示图1-6 退出界面5.源程序(带注释)#include#includetypedef struct Nodeint i;intk;/数据域struct Node *next;/指针域Node,*PNode;/定义一个指针用于链表求解int ShuZu()/数组求解

7、int i,a10;a9=1;for(i=8;i=0;i-)ai=(ai+1+1)*2;return a0;int DiGui(int i,int j,int k)/递归求解if(j=i) return k;k=(k+1)*2;DiGui(i,j-1,k);int LianBiao()/链表求解int i;PNode p1,p2;if(p1=(PNode)malloc(sizeof(Node)=NULL) /生成新的结点printf(分配内存失败!);exit(0);p1-i=10;p1-k=1;p1-next=NULL;for(i=9;i0;i-)if(p2=(PNode)malloc(si

8、zeof(Node)=NULL) printf(分配内存失败!); exit(0); p2-i=9;p2-k=(p1-k+1)*2;p2-next=NULL;free(p1);p1=p2;return p1-k;int main()/主函数 char n;int i,j,k;i=ShuZu();j=DiGui(1,10,1);k=LianBiao();for(;)printf(t* 欢迎进入猴子吃桃问题 *n);printf(t*1.数组方法*n);printf(t*2.链表方法*n);printf(t*3.递归方法*n); printf(t*4. 退 出 *n);printf(t*n);pr

9、intf(t输入选项(14):); scanf(%s,&n);switch (n) case 1: printf(n); printf(tttt数组方法得出的总桃子数为:%dn,i); printf(n); printf(tttt*如需继续进入主菜单请按回车键*n); break;case 2: printf(n); printf(tttt链表方法得出的总桃子数为:%dn,k); printf(n); printf(tttt*如需继续进入主菜单请按回车键*n); break;case 3: printf(n); printf(tttt递归方法得出的总桃子数为:%dn,j);printf(n);

10、printf(tttt*如需继续进入主菜单请按回车键*n);break;case 4: printf(n); printf(谢谢使用本系统on);exit(0); break; default: printf(n); printf(n请键入一个正确的选择); printf(n);printf(tttt*如需继续进入主菜单请按回车键*n);break; getchar();getchar();system(cls); 二跳马问题 要求在64个国际象棋格子,任意位置放一个马,如何不重复地把格子走完。1.采用类语言定义相关的数据类型#include typedef struct DataType i

11、nt board88; /定义一个int的二位数组board int step;/*走的步数*/ int test;/*可以遍历成功的次数*/SeqList;SeqList L;int start;int deltar = -2, -1, 1, 2, 2, 1, -1, -2;int deltac = 1, 2, 2, 1,-1,-2, -2, -1;/*马的可能走法对当前位置的横纵增量*/Main()输入r,c表示马在棋盘上的初始位置检测是否有下一出口(k = next(r, c) = -1)此路不通此路可通过输出满足该问题的一种正确解法,程序结束。初始化数组表示棋盘2.算法设计该问题分为两

12、步首先在8*8的棋盘上的任意一个位置上放一个马(r,c),求马所在位置的出口数。其次选择出口最少的那个位置。函数执行流程图如图2-1所示 图2-1 函数执行流程图3.调试分析a、调试中遇到的问题及对问题的解决方法对于跳马问题,一般情况下,可以采用回溯法找解,但对于该问题来说,只要找到一种解法即可。然而,在写该问题的程序时,有时得到的不止一种,这就和“贪婪法”的思想相悖,在经过反复的思考和查阅资料之后,才明白须将if(step64)放在dowhile(step=64)循环语句之外,才能达到用“贪婪法”解决该问题的目的。b、算法的时间复杂度和空间复杂度时间复杂度的计算是按照运算次数来进行的, 关于

13、空间复杂度的计算是在程序运行过程所要借助的内容空间大小。时间复杂度:O(n 2);空间复杂度:O(n)。4.测试结果1) 进入主界面 如图2-1所示图2-2 主界面2) 输入初始的行列,结果如图2-2所示图2-3 输入初始数据图3) 重新设置初始行列5 6 如图2-3所示图2-4 重新设置初始数据图5.源程序(带注释)#include typedef struct DataTypeint board88; /定义一个int的二位数组boardint step;/*走的步数*/ int test;/*可以遍历成功的次数*/SeqList;SeqList L;/int board88;int st

14、art;int deltar = -2, -1, 1, 2, 2, 1, -1, -2;int deltac = 1, 2, 2, 1,-1,-2, -2, -1;/*马的可能走法对当前位置的横纵增量*/int exitn(int r, int c, int nexta)/*求马所在位置(r,c)的出口数,nexta为出口号*/ int i, k, a, b; int num = 0; for(i = 0;i = 7;i+) k = (i + start) % 8; a = r + deltark; b = c + deltack; if(a = 0 & b = 0 & b = 7 & L.b

15、oardab = 0) nextanum = k; num+; return num;int number(int r, int c)/*返回下次可以找到的增量的个数*/ int i, k, a, b; int num = 0; for(i = 0;i = 7;i+) k = (i + start) % 8; a = r + deltark; b = c + deltack; if(a = 0 & b = 0 & b = 7 & L.boardab = 0) num+; return num;int next(int r, int c)/*选择下一个出口*/ int nexta8, num,

16、num1 = 0, min, i, k;/*min用来确定最少出口数*/ min =9; num = exitn(r, c, nexta);/*num为(r,c)的出口个数*/ if(num = 0) return -1; /*没有出口 */ for(i = 0;i = num-1;i+) /* 找出口最少的点*/ num1 = number(r + deltarnextai, c + deltacnextai); if(num1 = min) min = num1; k = nextai; return k;/*返回出口最少的点*/int main() int ber, bec;/*用于保存

17、输入初始的行列*/ int r, c; int i, j, k; printf(Enter the first node:(ber bec)/n); while(scanf(%d%d, &ber, &bec) != -1)/接收起点 start = 0; L.test = 1; while(start = 7)/*进行测试的次数*/ dofor(i = 0;i = 7;i+) for(j = 0;j = 7;j+)L.boardij = 0;/*初始化board数组*/r = ber;/*将当前值赋给r*/ c = bec;/*将当前值赋给c*/ L.boardrc = 1;/*将初始位置赋值

18、为1*/for(L.step=2;L.step=64;L.step+)if(k = next(r, c) = -1)/*此路不通*/start+; break;/*进行下一次测试*/r+=deltark;c+=deltack;L.boardrc = L.step;while(L.step 64)/*如果步数大于棋盘的格子数,则表明遍历成功*/printf(方案 %d:n, L.test+);for(i = 0;i = 7;i+)/*打印出该方案*/for(j = 0;j = 7;j+)printf(%4d , L.boardij);printf(nn);start+;break;/end if

19、 /end while(start = 7)/end while(scanf(%d%d, &ber, &bec) != -1)return 0;三通过单字符置换可以将一个单词改为另一个单词 假设存在一个5字母单词的字典。给出一个算法确定单词A是否可以通过一系列的单字符置换转换为单词B,并且如果可以的话,输出相应的单词序列。例如,bleed通过序列bleed、blend、blond、blood转换为blood。1.采用类语言定义相关的数据类型#define LEN 6 #define LINE 23 #define MAXVALUE 100typedef struct DataTypeint g

20、raphLINELINE; /定义一个int的二位数组graph int aLINELINE;int pathLINELINE;SeqList;char dicLINELEN= bland,blank,bleak,bleed,blend,blind,blink,blond,blood,bloom,blown,blows,brand,brank,bread,break,bream,breed,brown,clank,clink,dread,dream; /定义一个由5个字母组成的字典 bool edge_test(char source,char target); 2.算法设计最初简单的想法是,

21、对于第一个给定的单词,将其中的任意字母替换,循环查找是否可以变换为另一个单词,但仔细思考发现,事实上这种方法是很难到达循环结束终点的,因为其中的变换步骤是不定的,也就是说单词可以通过有限步变到另一个单词,只要存在变换,这种方法就是可行解。于是想到将任意单词抽象为节点,任意两个单词之间可以通过变换一个字母到达的变换可以抽象为图中两个节点是相连通的,而不能仅通过替换一个字母变换就到达终点的两个节点之间是不连通的,问题变为如果任意两个单词之间存在可行解,意味着图中两个单词是连通的。我们发现,寻找两个节点的通路就能找到一种解法。所以可以查找图中两个节点之间的最短路径,用Floyd算法进行求解,Floy

22、d算法直接给出了所有节点之间的最短路径。若不存在路径的情况,即两个节点之间没有可达的路径,则这两个节点必定存在不同的连通分支中,意味着字典中的词是存在着至少两个连通分支的。Floyd算法流程图如图3-1所示YNYN开始L.aij = L.graphiji != j &L. aij MAXVALUEL.pathij = 0L.pathij = iL.aik + L.akj L.aijL.aij = L.aik + L.akj;L.pathij = L.pathkj结束图3-1 Floyd算法执行流程图3.调试分析a、调试中遇到的问题及对问题的解决方法调试过程出现了edge_test没定义的问题,

23、解决办法是在最前面加上bool edge_test(char source,char target); b、算法的时间复杂度和空间复杂度该算法的复杂度为O(n);空间复杂度为O(n)4.测试结果1) 执行程序进入主界面,如图3-1所示图3-1 主界面2) 输入bleed blood,输出结果如图3-2所示3-2结果输出5.源程序(带注释)#include #include #define LEN 6 #define LINE 23 #define MAXVALUE 100typedef struct DataTypeint graphLINELINE; /定义一个int的二位数组graphint aLINELINE;int pathLINELINE;SeqList;char dicLINELEN= bland,blank,bleak,bleed,blend,blind,blink,blond,blood,bloom,blown

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

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