1、报告数据结构课程设计设计报告学院、系: 理学院 数学系 专 业: 数学与信息 姓 名: 学 号: 任课教师: 陆老师 提交日期: 2012、2、12 电子邮箱: 综合题目一 猫抓老鼠的模拟【目录】1题目与内容叙述 32数据结构描述 43算法描述 1、主函数与整体架构 6 2、分块函数功能描述 74调试 115小结 13 第一部分 题目与内容叙述题目: 在一个迷宫内,猫正在追老鼠,猫总是选择在迷宫中到老鼠最近的路线走,而老鼠也选择远离猫的路线逃离。模拟猫抓老鼠的动态过程。 要求 1) 设计一个迷宫 ;猫、老鼠的位置随机生成; 2) 猫、老鼠每移动一次,都重新计算最短路径。 3) 分别模拟猫的速度
2、大于老鼠、猫的速度等于老鼠两种情形。4) 迷宫可用数组表示,最短路径可用队列表示。思路叙述: 通过审题,计划主要运用“图”的知识,用“邻接表”的存储方法实现,用“单链表”存储路径。 迷宫用二维数组表示,通过坐标惟一标识每个位置。在程序中设置好的固定迷宫如下图所示 定义 ALGraph; 图类型、无向图相当于迷宫路线简图 AdjListMAXV; 邻接表类型 LinkList; 非绝路信息图单链表 第二部分 数据结构描述class InfoType public: int iv; int loc1,loc2; InfoType(记录顶点中的其他信息) / iv=0时非绝路;iv=1是绝路; /
3、loc1 和loc2记录在迷宫中的位置(横纵坐标); typedef struct int no; InfoType info;Vertex; Vertex(矩阵中每个点的信息) / 顶点编号;typedef struct ANode int adjvex; Struct ANode *nextrac; InfoType info;ArcNode; / 顶点中的其他信息; ArcNode (弧结点类型) / 该弧的终点编号 / 指向下一条弧的指针 / 该弧重点位置的相关信息 typedef struct VNode int hno; Vertex data; ArcNode *firstrac
4、;VNode; VNode(表头结点类型) / 该顶点的弧边数 / 该顶点信息 / 指向第一条弧typedef VNode AdjListMAXV; 邻接表类型typedef struct AdjList adjlist; int n,e;ALGraph; ALGraph(图类型。无向图相当于迷宫路线简图) / 邻接表 / 图中的顶点数和边数typedef struct LNode InfoType data; struct LNode *next;LinkList; LinkList(非绝路信息图单链表) / 该位置的信息 / 指向下一结点的指针 typedef struct int no;
5、 int mano1; int mano2; int samefl;intv; / 该结点编号 / 图中 母亲结点编号 / 轨迹队列中 母亲结点编号 / 队列点间同层信息 【图示】ALGraph adjlist n e hno data *firstrac 1 no info adjvex info 2 3 第三部分 算法描述 1、 主函数与整体架构过程简述: 系统提示输入“请按上图数字,依次输入猫和老鼠的初始坐标,及出口位置”; 输入猫坐标 cs1 cs2 ,调用translatecu1函数,转化为图编号; 输入老鼠坐标 ms1 ms2 ,调用translatecu1函数,转化为图编号; 输
6、入出口坐标 ex1 ex2 ,调用translatecu1函数,转化为图编号; 系统提示输入“请依次输入猫和老鼠的速度(最好不超过3)”; 依次输入猫的速度sp1,老鼠速度sp2; 调用CatchARun函数,显示路径和结果。变量定义: 猫的坐标: 坐标 cs1 cs2 图编号 cs ( cs=translatecu1(cs1,cs2,map) ) 老鼠的坐标: 坐标 ms1 ms2 图编号 ms ( ms=translatecu1(ms1,ms2,map) ) 出口的坐标: 坐标 ex1 ex2 图编号 ex ( ex=translatecu1(ex1,ex2,map) ) 速度: 猫 sp
7、1 老鼠 sp2 运动路径: 猫 queue1 M*N 老鼠 queue2 M*NPathBFS函数的调用:newloc(含有重载)CatchARun(计算结果,显示路径) mainCreatALG(创建图)translatecu1(将坐标转换为图编号) 2. 分块函数功能描述(一)创建图 ALGraph *CreateALG ( int mgM+1N+1,LinkList *&map2 ) 主要变量定义: ALGraph *a ArcNode *p 主要设计步骤: for (int m=1;m=M;m+) for (int n=1;nadjlistl.data.info.loc1=m; a-
8、adjlistl.data.info.loc2=n; a-adjlistl.hno=0; a-adjlistl.firstrac=NULL; for (int di=0;di4;di+) /选择上下左右的入口 switch(di) case 0:f=m-1;g=n;break; /上 case 1:f=m;g=n+1;break; /右 case 2:f=m+1;g=n;break; /下 case 3:f=m;g=n-1;break; /左 for (l=0;lk;l+)/传递弧边终点的编号 for (l=0;l=k;l+)/判断是否为绝路点 for (l=0;ladjlistl.first
9、rac; while(p!=NULL) p-info.iv=a-adjlistp-adjvex.data.info.iv; p=p-nextrac; (2)广度优先函数int PathBFS(ALGraph *G,int v,int z,int &rear,intv queueMAXV)v为起点位置编号、z为目标位置编号、寻找两点间最短路径、返回长度和路径 ArcNode *p; int front=0,temp=0;rear=0; int visitedMAXV; int w,i,h=0; /h为记录路径长度 for (i=0;in;i+)visitedi=0; visitedv=1; qu
10、euerear.samefl=-2; rear=(rear+1)%MAXV; queuerear.no=v; queuerear.mano2=0; queuerear.samefl=-1; while (queuerear.no!=z & front!=rear) /广度遍历、每层图点入列 front=(front+1)%MAXV; w=queuefront.no;/图中母亲节点编号变量 p=G-adjlistw.firstrac ;if(frontadjvex=0) visitedp-adjvex=1;rear=(rear+1)%MAXV; queuerear.no=p-adjvex ; q
11、ueuerear.mano1=w; queuerear.mano2=front; queuerear.samefl=h; p=p-nextrac ; if (front!=rear) /有路径到达 return h; else return -1;(3)坐标转换为图编号 int translatecu1(int c1,int c2,ALGraph *map) int p=0; for (int i=0;in;i+) if (map-adjlisti.data.info.loc1=c1 & map-adjlisti.data.info.loc2=c2) p=1; return i; break;
12、 if (p=1) cout1) if (h1) e1=e; e=j; for (i=sp;i0;i-)/后退速度的步数 if(e1) e=queuee.mano2; else break; temp=j;j=e;e=temp;h+; if (h=1) i=sp; for (h=sp-i;h0;h-)/翻转过来 e1=queuee1.mano2; return e1;(5)抓捕函数void CatchARun (ALGraph *map,LinkList *map2,int cs,int ms,int ex,int sp1,int sp2,intv queue1M*N,intv queue2M
13、*N)主要变量定义: int rear1,rear2, boolv=1,i,j,k,j1,temp; int e1,e2,e,e0; /boolv为判断是否抓住老鼠逻辑变量默认值为1(没抓 到正在捕抓) int csl=PathBFS(map,cs,ex,rear1,queue1); int msl=PathBFS(map,ms,ex,rear2,queue2);主要设计结构: if (msl=-1 | msl=0 | csl=-1) boolv=-1; Else if (queue1rear1.sameflsp1) Else if (boolv=0) /递归出口抓住输出 else if (b
14、oolv=-1) /老鼠到达出口或者开始位置是隔离的 else if (msl/sp2=csl/sp1) /老鼠可安全逃向出口 Else /无法安全到达出口跑向最远离猫的非绝路点 第四部分 调试初始界面特殊情况验证:猫和老鼠同起点猫和老鼠都从(1,1)位置开始,出口在(1,8),速度都为1时,;老鼠被抓住。特殊情况验证:老鼠初始位置在出口处猫在(1,1),老鼠在(1,8),出口为(1,8),速度均为1,老鼠能逃走。改变速度猫(1,1),老鼠(1,4),出口(1,8),猫速度2,老鼠速度1,老鼠被抓住 第五部分 总结经过自己的学习探索,以及向专业人士的咨询,终于完成了此次课程设计,收获颇丰。通过
15、请教、编辑、调试,毋庸置疑使我在理论、操作方面都有所提高,学会了如何将所学知识应用到实际,体会到C语言的强大和数据结构的神奇之处。但由于所学知识有限、编程经验不足,课程设计进行中遭遇错误、卡壳、无从下手等困难,但正由此可见,实践对于学习数据结构的重要性。因此,为了在今后必要时能熟练使用C+语言,还需时常的学习和长久的应用训练,使之成为自己的一项本领。根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点:1、认真上好专业实验课,多在实践中锻炼自己。2、写程序的过程中要考虑周到,严密。3、在做设计的时候要有信心,有耐心,切勿浮躁。4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会
16、灵活运用。5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。综合题目二 复杂表达式的求值【目录】1题目与内容叙述 152栈的数据结构描述 163算法设计 1、算符的优先级比较函数Compare 17 2、确定如何入栈函数evaluate 18 3、主函数及分模块介绍 19四调试 20五小结 22 第一部分 题目与内容叙述问题描述 输入一个含有运算符和运算函数的表达式,计算其结果。要求 1) 以字符串方式输入一个复杂的表达式; 2) 利用栈,根据各运算符的优先度进行数值计算,显示结果 3) 循环回1),继续下个表达式的输入。功能扩展:显示计算过程 第
17、二部分 栈的数据结构描述栈的抽象数据类型定义ADT SqStack数据对象:D=ai| ai ElemSet,i=1,2,3,n,n0数据关系:R1=| ai-1,ai D,i=1,2,3,,n 约定其中ai端为栈底,an端为栈顶操作集合:(1)void InitStack1(SqStack1 &S1);/声明栈建立函数(2)void InitStack2(SqStack2 &S2);/声明栈建立函数(3)void evaluate(SqStack1 &S1,SqStack2 &S2);/确定如何入栈函数(4)void Push1(SqStack1 &S1,char e);/声明入栈函数(5)
18、void Push2(SqStack2 &S2,float e);/声明入压栈函数(6)char GetTop1(SqStack1 &S1);/声明取栈顶元素函数(7)float GetTop2(SqStack2 &S2);/声明取栈顶元素函数(8)char Pop1(SqStack1 &S1);/声明出栈函数(9)float Pop2(SqStack2 &S2);/声明出栈函数(10)char Compare(char m,char n);/声明比较函数(11)float Operate(float a,char rheta,float b);/声明运算函数(12)void DispStac
19、k1(SqStack1 &S1);/从栈底到栈顶依次输出各元素(13)void DispStack2(SqStack2 &S2);/从栈底到栈顶依次输出各元素 ADT SqStack 第三部分 算法设计1、算符的优先级比较函数Compare (char m,char n)算法的基本思想: 通过已知的算符间的优先关系写出算符的优先级算法。任意两个相继出现的算符c1和c2之间的优先关系至多是下面3种关系之一: c1c2 c1的优先权高于c2算法步骤:Step1:如果输入符号为“+”或“-”1.1如果栈顶元素为“(”、“#”,此时栈顶符号优先级低,返回“”Step2:如果输入符号为“*”或“/”2.
20、1 如果栈顶元素为“)”、“*”、“/”,此时栈顶符号优先级高,返回“”2.2 否则,栈顶符号优先级低,返回“”Step3: 如果输入符号为“(”, 则直接返回“”Step5:输入符号为其他5.1 栈顶元素为“#”,此时优先级同,返回“=”5.2 否则,栈顶符号优先级高,返回“” 2、确定如何入栈函数evaluate(SqStack1 &S1,SqStack2 &S2)算法的基本思想: (1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素; (2)依次读入表达式中每个字符,若是操作数则进运算数栈,若是运算符则和运算符栈的栈顶运算符比较优先后作相应操作,直至整个表达式求值完毕(即运
21、算符的栈顶元素和当前读入的字符均为“#”)。算法步骤:Step1:将#入栈,作为低级运算符Step2:输入不含变量的表达式(以#结束!)Step3:如果c!=#|GetTop1(S1)!=#3.1如果输入的字符如果不是运算符号,则继续输入直到输入的是运算符为止,将非运算符转换成浮点数3.2 如果输入的是运算符a、 遇到运算符,则将之前输入的操作数进栈b、 比较运算符的优先级1) 栈顶元素优先级低,则入栈且继续输入2) 栈顶元素优先级相等,脱括号并接收下一字符3) 栈顶元素优先级高,则退栈并将运算结果入栈Step4:显示表达式最终结果 3、主函数及分模块介绍 程序包含三个模块(1) 主程序模块,
22、其中主函数为void main 输入表达式; 根据要求进行转换并求值; 输出结果;(2) 表达式求值模块实现具体求值。(3) 表达式转换模块实现转换。各个函数之间的调用关系 第四部分 调试初始界面验证简单加减乘除表达式:输入1.0+2.0# 结果正确验证混合运算表达式:输入:1+2*4# 结果正确特殊情况验证:输入:3/0 显示输入错误提示 第五部分 总结1结构分析:栈中的数据节点是通过数组来存储的。因为在C语言中数组是用下标从零开始的,因此我们在调用他们的数据是要特别注意。指针变量的值要么为空(NULL),不指向任何结点;要么其值为非空,即它的值是一个结点的存储地址。注意,当P为空值时,则它
23、不指向任何结点,此时不能通过P来访问结点,否则会引起程序错误。如果输入的数字不符合题目要求,则会产生错误结果。2算法的时空分析:时间和空间性能分析:时间上,对于含n个字符的表达式,无论是对其进行合法性检测还是对其进行入栈出栈操作n次,因此其时间复杂度为O(n)。空间上,由于是用数组来存储输入的表达式,用栈来存储运算中的数据和运算符,而栈的本质也用到的数组,数组在定义时必须确定其大小。在不知表达式长度的情况下确定数组的长度确非易事,此时极易造成空间的浪费,因此空间性能不是很好。不足之处:(1)用栈的结构来解决表达式的求值,首先要解决的问题是如何将人们习惯书写的表达式转换成计算机容易处理的表达式。开始有些茫然,后来通过结合课本和同学的帮助完成了该课题。(2)对一些看似简单的东西掌握不够熟练,比如由于函数的调用参数问题不熟而造成了调试的困难。对于语法的掌握也欠缺成熟,需要进一步掌握。(3)栈的结构理解不够清晰,造成了设计程序时理不清头绪,需要对数据结构有更深层次的理解。基础题运行截图1.链表2.二叉树3.图
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1