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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法与数据结构课程设计报告文档格式.docx

1、三、需求分析:按照需求,需要设计四种图、两种存储结构、创建四种图的个两种存储结构的操作(8个)、其他基本操作、多级菜单显示,图的操作有用到了线性表、栈和队列的基本操作。在老师给出了多级菜单现实的代码后,我们需要做的只是将函数写入其中。四、总体设计:我用的软件是Visual C+6.0。将不同的操作分在了不同的包里面。如右图所示。Typedef.h包里面是所有的相关结构定义;UDG_Operation.h包里面是有关于无向图的有关操作;UDN_Operation.h包里面是有关于无向网的有关操作;DG_Operation.h包里面是有关于有向图的有关操作;DN_Operation.h包里面是有关

2、于有向网的有关操作;Queue_Operation.h包里面是有关队列的有关操作;Stack_Operation.h包里面是顺序栈的有关操作。包的引用很有规范,如下:#include stdafx.hiostream#includestdlib.hstdio.hstdlib.hmalloc.husing namespace std;int visited20;Typedef.hQueue_Operation.hStack_Operation.hUDG_Operation.hUDN_Operation.hDG_Operation.hDN_Operation.h菜单由于老师已经给出,主要就是将函数

3、带上参数写入代码。在菜单选择后触发函数,得出结果。函数总结:创建无向图的邻接矩阵:CreatUDG_M(MG);打印无向图的邻接矩阵:dispgraph_MG(MG);创建无向图的邻接表:CreatUDG_ALG(ALG);打印无向图的邻接表:dispgraph_G(ALG);无向图的深度优先遍历:DFSTraverse(ALG);无向图的广度优先遍历:BFSTraverse(ALG);创建无向网的邻接矩阵:CreatUDN_M(MN);打印无向网的邻接矩阵:dispgraph_MN(MN);创建无向网的邻接表:CreatUDN_ALG(ALN);打印无向网图的邻接表:dispgraph_N(

4、ALN);Prim算法求最小生成树:MiniSpanTree(MN,1);kraskal算法求最小生成树:kruskal();创建有向图的邻接矩阵: CreatDG_M(MG);打印有向图的邻接矩阵:创建有向图的邻接表:CreatDG_ALG(ALG);打印有向图的邻接表:dispgraph_DG_G(ALG);拓扑排序:TopologicalSort(ALG);创建有向网的邻接矩阵:CreatDN_M(MN);打印有向网的邻接矩阵:创建有向网的邻接表:CreatDN_ALG(ALN);打印有向网的邻接表:dispgraph_DN_G(ALN);求关键路径:CriticalPath(ALN);

5、求单源顶点最短路径:ShorttestPath_DIJ(MN,1);求每对顶点间最短路径:ShorttestPath_FLOYD(MN);大体设计就是这么一个流程。还有一些有关于循环队列和顺序栈的操作,这里就不一一列出了。五、详细设计与实现(含代码和实现界面):5.0储存所有定义和预处理的包(typedef.h)5.0.1预处理:#define MAXVEX 30/最大结点的个数#define MAXCOST 1000/最大权值#define STACKINCREMENT 10/栈的增量typedef char VertexType;/结点信息类型5.0.2图的邻接矩阵存储结构:typedef

6、 struct VertexType vexsMAXVEX;/顶点信息 int arcsMAXVEXMAXVEX; int vexnum,arcnum;/顶点数、边数MGraph;5.0.3图的邻接表存储结构:typedef struct arcnode int adjvex; /邻接点序号 int w; /边或狐上的权 struct arcnode *next;/指向下一条弧的指针ArcNode;typedef struct vnode VertexType data; /顶点信息 int indegree; /该点的度 ArcNode *firstarc; /指向下一个边结点Vnode,A

7、djListMAXVEX; AdjList vertices;/图的当前顶点数和弧数ALGraph;5.0.4循环队列和栈的顺序存储表示a.在处理无向图的广度优先遍历用到了循环队列极其简单操作。/栈的顺序存储表示 int *base; int *top; int Stacksize;SqStack;/队列定义typedef struct SqQueue int front; int rear;SqQueue;5.0.5多级菜单展示主菜单:次级菜单展示:5.1无向图的基本操作及应用(UDG_Operation.h)5.1.1创建无向图的邻接矩阵用一个二维数组实现的。测试用如右图的无向图。测试结果

8、:5.1.2创建无向图的邻接表主要运用指针,运用链式分配存取空间。5.1.3无向图的深度遍历无向图的深度优先遍历我采取的是用邻接表的方式。从图中的某个顶点出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历,直至途中所有和v有路径相同的顶点都被访问到,若此时还有顶点未被访问,则另选图中一个未曾被访问的顶点做起始点,重复上述过程,直到所有顶点被访问完。5.1.4无向图的广度优先遍历广度优先遍历也是利用邻接表,从顶点v出发访问v后依次访问v的各个未曾访问的邻接点,直到所有的邻接点被访问。若此时图中尚有顶点未被访问,则选择途中另一个未曾被访问的结点作为起始点重复上述过程。5.2无向网的基

9、本操作及应用(UDN_Operation.h)5.2.1创建无向网的邻接矩阵和无向图的几乎差不多,只是当两个顶点之间存在边时,存的是边的权值,不存在边时用-1表示。5.2.2创建无向图的邻接表与无向图的几乎一样,只是把权值存入其中。5.2.3prim算法求最小生成树主要利用无向网邻接矩阵的存取方式操作的,还需要用到一个标志数组。5.2.4kraskal算法求最小生成树主要是如何判断两个顶点是否属于同一分支,这里用一个数组记录。5.3.1创建有向图的邻接矩阵有向图的邻接矩阵和无向图的邻接矩阵实现过程一样,只是存的弧是有顺序的。 5.3.2创建有向图的邻接表有向图的邻接表的实现过程和无向图的过程几

10、乎一样,只是存取弧是有顺序。5.3.3拓扑排序有向图的拓扑排序主要用到栈,采用的是有向图的邻接表的存取方法。5.4.1创建有向网的邻接矩阵和无向网的邻接矩阵思想一样,其中两顶点有边时,存入他们的权值,弧也是有方向的。5.4.2创建有向网的邻接表实现过程与无向网的邻接表的实现过程一样,只是这里两点的边有方向。5.4.3求关键路径主要是求取每个活动的最早和最迟发生时间,这里用到拓扑排序的思想求最早发生时间和逆拓扑排序的思想求最迟发生时间。5.4.4求单源顶点最短路径的问题运用了迪杰斯特拉算法,用了网的邻接矩阵存取方式。所求的无向网如右图。5.4.5求每对顶点间最短路径的问题采用了弗洛依德算法,采用

11、的也是有向网的邻接矩阵的存取方式。六、课程设计小结:1难点与收获:这次是我第一次用Visual Studio 2008编写小程序,以前只是用它来做过一些动态网页,所以一开始使用的不是很熟悉,比如:包的导入顺序这个问题也是让我找了半天先用到的必需放在前面。后来的编写过程也不是很顺利。书上都是一些伪码,使我不得不再到网上多看一些代码来做参考,但是也还是会遇到十分不好解决的问题。有一些算法很是复杂,参考再多也不能看懂。一般都还是得再去请教他人。代码做出来后,有的问题不是什么简单的语法问题,而是逻辑问题。这种是最难找的,不过我还是想起了以前老师教的一种方法:设置断点,新加入做参考的变量一步一步的调试。

12、用这个方法着实解决了一些变量的问题,如未初始化、没有加&改变数据。通过这一次的课设,我深深的体会到了编写代码所必须的性格:耐心、细心。在遇到问题是一定要静下心来,不要急躁,细心的查看代码,耐心的调试。在这些过程当中,确实会感到急躁,但是一旦在我们解决问题后,总是会有一种成就感油然而生。我想这应该是学习计算机的人们都会有的感觉吧。在今后的学习中我定将继续努力,继续享受这份学习计算机编程的乐趣。2可以改进的地方我知道我程序写的不完美,有许多可改进的地方,但是在目前我还不知道具体需要从哪里下手改进,如果我知道我一定会用我觉得好的方法去编写。不得不说,我现在的水平和理解能力有限,有待提高的地方还有很多

13、。学习编程的路程是艰辛的,我现在自己独立编写代码,独立思考的能力还是太有限了,代码参考的成分居多,希望以后我可以更加独立的去完成任务。七、部分重要代码:UDG_Operation.h 无向图的深度优先遍历和广度优先遍历。/无向图的深度优先遍历void DFS(ALGraph ALG,int v) ArcNode *p; int v1=ALG.verticesv.data; coutv1adjvex=0) DFS(ALG,p-adjvex); p=p-next; void DFSTraverse(ALGraph ALG) int v; for(v=1;vfront=Q-rear=0;ALG.ve

14、rticesv.dataadjvex=0) v=p-adjvex; cout void BFSTraverse(ALGraph ALG)v+)该图的广度优先遍历结果: BFS(ALG,v);UDN_Operation.h prim算法和kruskal算法求最小生成树/prim算法求最小生成树void MiniSpanTree(MGraph G,int u) int i,i1; int j,j1; int k=INT_MAX; j1=u; struct int lowcost;/各边上当前最小权值 int adjvex;/权值依附的顶点的序号 closedgeMAXVEX; for(j=1;j=

15、G.vexnum ;j+) /初始化辅助数组 if(j!=u) closedgej.lowcost =G.arcs uj; if(G.arcs uj!=-1) closedgej.adjvex =u; else closedgej.adjvex =0; else closedgej.lowcost =0; for(i=1;i=G.vexnum-1 ;i+) k=INT_MAX; for(i1=1;i1i1+) /找到当前最小的边 if(i1!=u&closedgei1.lowcost !=-1& if(closedgei1.lowcost k) k=closedgei1.lowcost ; u

16、=closedgei1.adjvex ; j1=i1; coutG.vexs uG.vexs j1endl; closedgej1.lowcost =0; for(j=1;j+) /添加新的结点 if(closedgej.lowcost ! if(G.arcs j1j!G.arcs j1jclosedgej.lowcost&closedgej.lowcost !=0 ) closedgej.lowcost =G.arcs j1j; closedgej.adjvex =j1; closedgej.lowcost =G.arcs j1j; closedgej.adjvex =j1;/kruskal

17、算法求最小生成树int rMAXVEX+1;/记录点的顺序int pMAXVEX+1;/判断是结点否属于同一分支数组int choMAXVEX*(MAXVEX-1)/2+1=0;/记录边的顺序int n;/顶点数int m;/边数struct edge int u;/起始点编号/终点编号/权值eMAXVEX*(MAXVEX-1)/2+1;void Init() int i;=MAXVEX; pi=i; ri=0;bool cmp(edge a,edge b) /判断两条边权值的大小 return a.w ry) ry=x; else px=y; if(rx=ry) ry+;void krusk

18、al()请输入顶点数和边数: cinnm; int i,j;=m;请输入第条边的起点序号、终点序号和权值: cinei.u ei.v ei.w ; Init(); sort(e+1,e+m+1,cmp); int cnt=0; if(Find(ei.u )!=Find(ei.v ) cnt+; Union(ei.u ,ei.v ); cho+cho0=i; if(cnt=n-1) break;=cho0;j+)echoj.u echoj.v DG_Operation.h 拓扑排序void TopologicalSort(ALGraph ALG) int k; int count=0; ArcNode *p=(ArcNode *)malloc(sizeof(ArcNode); SqStack S; InitStack(S);=ALG.vexnum ; if(ALG.vertices i.indegree =0) Push(S,i); while(S.top !=S.base ) Pop(S,i);ALG.vertices i.data next) k=p-adjvex ; ALG.vertices k.indegree -; if(ALG.vertices k.indegree =0) Push(S,k); if(countw vek) vek=vei+p-w ; if

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

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