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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计说明书 基于邻接矩阵的图的遍历.docx

1、数据结构课程设计说明书 基于邻接矩阵的图的遍历1 引言22 需求分析32.1设计目的 32.2设计任务 32.3基本操作 32.3.1 程序调用的基本函数32.3.2 各函数的调用关系43 数据结构设计43.1队列 43.1.1队列的类型定义43.1.2循环队列的存储结构53.2 基于邻接矩阵的图(MGraph) 53.2.1图的类型定义 53.2.2 图的结构 54 算法设计54.1 邻接矩阵的建立与输出 54.1.1建立基于邻接矩阵的无向图中54.1.2邻接矩阵方式输出无向图74.2 遍历搜索算法设计 74.2.1深度优先搜索74.2.2广度优先搜索85 程序实现及测试95.1 程序测试数

2、据95.2 调试过程及分析 96 设计体会106.1 不足之处106.2课程设计感悟10结束语11参考文献11附件:源程序12程序运行结果19基于邻接矩阵的图的遍历摘要:本课程设计主要目的在于更深一步的了解图的遍历的问题输入的图转换为邻接矩阵存储,并基于邻接矩阵实现图的深度优先遍历(DFS)和广度优先遍历(BFS)。实验证明,两种算法的遍历结果截然不同,但均能完成对图的遍历过程。在课程设计中,程序设计设计语言运行环境为Visual C+,程序运行平台为windows XP。summary :The main purpose of this course design is to underst

3、and graph traversal problems further and we should learn how to change the input diagram into adjacency matrix storage,and realize graph depth-first traversal (DFS) and breadth-first traversal (BFS),based on the adjacency matrix .The experimental results prove that the results of the two algorithms

4、ergodic are quite different, but all can complete the graph traversal process. In the curriculum design, program design language is running in the environment of Visual c + +. Program operation platform is Windows XP.关键字:图、存储结构、邻接矩阵、遍历。Key words: Diagram、storage structure、adjacency matrix、ergodic.1

5、引言图论在现代计算机科学中占有举足轻重的地位,而许多的图论问题需要在图中遍历来寻找某个特定的结构,图的遍历算法从而变得十分重要。图是一种较为复杂且重要的数据结构,其特殊性在于图形结构中结点之间的关系可以是任意的,图中任意两个数据元素之间都有可能相关。就本课程设计而言应用图论的知识讨论如何在计算机上实现图的遍历的操作,主要解决图的遍历的两种算法即广度优选遍历和深度优选遍历的实现。从图的定义可知,一个图的信息包括两个部分,即图中的顶点信息及描述图的顶点间的关系边或者弧的信息。因此,无论采用什么样的方法建立图的存储结构都应该保证图的信息的准确性和完整性。关于图的存储,有邻接矩阵和邻接表法,我们在此使

6、用邻接矩阵法来作为图的存储结构。2 需求分析2.1设计目的巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握 。掌握C语言编程和程序调试的基本技能 。利用C语言进行基本的软件设计。掌握书写程序设计说明文档的能力 。提高运用C语言、数据结构解决实际问题的能力。 了解图的存储结构,掌握并灵活应用图的算法。 熟练掌握图的两种搜索路径的遍历算法。2.2设计任务以邻接矩阵为存储结构编写程序,设计出的系统应具备的以下功能:根据输入建立基于邻接矩阵的图,并实现图的深度优先,广度优先遍历算法,输出原图结构及遍历结果。2.3基本操作2.3.1 程序调用的基本函数Status InitQueue(Link

7、Queue *Q) 操作结果:初始化队列Status QueueEmpty (LinkQueue Q) 操作结果:判断队列是否为空Status EnQueue(LinkQueue *Q, QElemType e) 操作结果:入队列Status DeQueue(LinkQueue *Q, QElemType *e) 操作结果:出队列void CreateGraph(MGraph *G)操作结果:以邻接矩阵为存储结构创建图。void PrintGraph(MGraph G) 操作结果:邻接矩阵方式输出无向图Dfs(MGraph G, int v) 操作结果:对已存在的图进行深度优先遍历。BfsTr

8、averse(MGraph G) 操作结果: 对已存在的图进行广度优先遍历。2.3.2 各函数的调用关系图3 数据结构设计3.1队列3.1.1队列的类型定义typedef int QElemType;typedef struct QNode QElemType data; struct QNode *next; QNode, *QueuePtr;QNode是队列中的每个节点元素的结构类型3.1.2循环队列的存储结构typedef struct QueuePtr front; QueuePtr rear; LinkQueue;LinkQueue是一个队列,是用于广度遍历的辅助队列,一般先将队列置

9、空,根结点入队列,队列非空,获得队列首节点,当前节点出队列,再访问当前节点。3.2 基于邻接矩阵的图(MGraph)3.2.1图的类型定义typedef struct ArcCell VRType adj; /*图中有1/0表示是否有边,网中表示边上的权值*/ /* InfoType *info; 与边相关的信息*/ ArcCell, AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;3.2.2 图的结构typedef struct VertexType vexsMAX_VERTEX_NUM; /*顶点向量*/ AdjMatrix arcs; /*邻接矩阵*/ int

10、 vexnum,arcnum; /*图中当前顶点数和边数*/ MGraph; MGraph是基于邻接矩阵的图的结构。其中Vertextype是顶点集;AdjMatrix是边集,也是邻接矩阵;vexnum,arcnum分别是顶点的总数和边的总数,用于初始化图.4 算法设计4.1 邻接矩阵的建立与输出4.1.1建立基于邻接矩阵的无向图中void CreateGraph(MGraph *G) int i,j,k; VertexType v1,v2; printf(n输入无向图的顶点个数,边个数(中间用逗号隔开):); scanf(%d,%d,&(*G).vexnum,&(*G).arcnum); p

11、rintf(输入 %d 个顶点的名字:,(*G).vexnum); for(i=0;i(*G).vexnum;i+) /*输入顶点向量*/ scanf(%s,(*G).vexsi); printf(n顶点数组:n); for(i=0;ivexnum;i+) /*输出顶点向量*/ puts(G-vexsi); for(i=0;i(*G).vexnum;i+) /*邻接矩阵初始化*/ for(j=0;j(*G).vexnum;j+) (*G).arcsij.adj=0; printf(请输入无向图中的%d 条弧arcs(vi vj):n,(*G).arcnum); for(k=0;k(*G).ar

12、cnum;k+) /*输入无权图的边*/ scanf(%s%s,v1,v2); i=LocateVex(*G,v1); j=LocateVex(*G,v2); (*G).arcsij.adj=1; (*G).arcsji=(*G).arcsij; 二维数组表示邻接矩阵作图的存储结构,其中vexnum为图中顶点数,查找每个顶点的邻接点所需时间为O(n2)。CreateGraph函数是创建一个图的初始化函数,图需要存储的信息有:顶点和边, 本算法所用的邻接矩阵是表示顶点之间相邻关系的二维数组矩阵,用于存储用户输入的顶点和边信息。其中LocateVex是表示顶点在顶点向量中的定位的函数,其算法为:i

13、nt LocateVex(MGraph G,VertexType v) int i; for(i=0;iG.vexnum;i+) if (strcmp(v,G.vexsi)=0) break; return i;4.1.2邻接矩阵方式输出无向图void PrintGraph(MGraph G) int i,j; printf(n图的邻接矩阵为:n); for(i=0; iG.vexnum; i+) printf(%10s,G.vexsi); for(j=0; j=0; w=NextAdjVex(G,v,w) if(!visitedw) Dfs(G,w);void DfsTraverse(MGr

14、aph G) int v; for (v=0; vG.vexnum; v+) visitedv=FALSE; for(v=0; vG.vexnum; v+) if (!visitedv) Dfs(G,v); 本算法中Dfs是采用递归的方式实现的,Dfs类似于树的先根遍历,是树的先根遍历的推广。具体算法思想为:从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图, 直至所有与v有通路的顶点都被访问到;若此时图中还有顶点未被访问到,则另选图中未被访问的顶点作起点,重复上述过程,直到图中所有顶点都被访问到为止, 本算法中Dfs是采用递归的方式实现的。4.2.2广度优先搜

15、索(Breadth First Search)void BfsTraverse(MGraph G) int v,u,w; LinkQueue Q; for(v=0; vG.vexnum; v+) visitedv=FALSE; InitQueue(&Q); for(v=0; v=0; w=NextAdjVex(G,u,w) if (!visitedw) visitedw=TRUE; printf(%s,G.vexsw); EnQueue(&Q,w); Bfstraverse函数采用队列作为中间存储介质来实现算法,BFS类似于树的层次遍历。具体算法流程是:从图中某个顶点v出发,在访问了v之后,依

16、次访问v的各个未曾访问过的邻接点(并保证先被访问的顶点的邻接点“要先于”后被访问的顶点的邻接点被访问), 直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中还有未被访问的顶点,则任选其中之一作为起点,重新开始上述过程,直至图中所有顶点都被访问到。5. 程序实现及测试5.1 程序测试数据输入顶点个数和边的个数:7,5输入每个顶点的名字:1 2 3 4 5 6 7程序输出所有顶点构成的一维数组:1 2 3 4 5 6 7输入五条边:输出的邻接矩阵应为: 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0

17、1 0 0 1 0 0 0 1 0 0 0 0 0 0以第一个节点为初始访问节点的DFS和BFS结果应分别为:1643572,16743525.2 调试过程及分析在调试过程中,程序中出现了许多的错误,有错误的调用、一些变量没有定义、等等。不断的对程序进行调试以得到最好的结果,程序中特别要注意的是类的对象作为作为参数时要注意如何去调用它,使程序有一个令人满意的结果,具体的调试是在上机过程中进行的,在编写程序的过程中主要有如下错误:、在编写程序的过程出现了一些函数名、变量的大小写不统一的错误,导致程序在运行的过程中出现函数名、变量没有被定义等问题;、在编写程序的过程中数组的大小写没有被确定;、在编

18、写程序的过程中一些变量没有被定义,导致程序出错;、函数的返回类型要确定,是void还是其他类型要十分注意;、在编程的过程中,函数里一些控制语句的嵌套使用,括号要引起注意,程序设计中有一些括号漏了或者多打了,导致括号不配套;(程序源代码及运行结果见附件)6. 设计体会6.1 不足之处、用邻接矩阵存储的图中大量的数据冗余。对于较大的图,其存储量消耗及遍历时间复杂度的劣势均会体现出来,可以使用邻接表作为补足。、该程序适用的图的种类有限。目前改程序只能用于对无向图的处理,那么对于有向图,其遍历优先级的判定的条件会发生一些变化,而且在图的初始化上也会发生变化。可以在对初始化和遍历进行重构,封装出一个能适

19、用于有向和无向图的遍历方法。、人机交互界面有待提升。6.2课程设计感悟图是一种较为复杂且重要的数据结构,其特殊性在于图形结构中结点之间的关系可以是任意的,图中任意两个数据元素之间都有可能相关。用邻接矩阵作为图的数据存储结构很好地解决了图的结构难点, 若借助于邻接矩阵容易判定任意两个顶点之间是否有边(或弧)相连,并容易求得各个顶点的度。通过本次算法设计,从两种不同的重要的图遍历算法去理解了图的存储方式和图的具体操作。并学会如何将已学过的数据结构形式灵活运用到有待解决的问题中去。并且发现,数据结构的设计与使用不应该注重于形式,而是特定的数据结构所具有的特殊的性质,利用这些特殊的性质来帮助我们编程实

20、现具体的问题。这次课程设计,对我的逻辑思维能力是一个很大的锻炼,还加强了我的系统思考问题的能力,在编程方面,我开始从整体的角度来考虑问题了,而不再像以前一样的,胡乱动手。也就是因为先前的这种编程习惯,使得我在课程设计过程中浪费了不少的时间,尝到了教训。结束语:通过这近一个星期的数据结构课程设计实践,我学到了很多东西。本次课程设计对我来说正是一个提高自己能力的机会,我好好的抓住机会,努力做好每一步,完善每一步。在今后的算法设计与编程过程中,应试着多用面向对象的角度入手,从数据结构的定义出发,进而定义出所需要的方法,完成设计与实现。参考文献:1 闫玉宝,徐守坤著. 数据结构. 北京,清华大学出版社

21、,2008,3.2 M.H.Alsuwaiyel著. 方世昌等译. 朱洪审校. 算法设计技巧与分析. 北京,电子工业出版社,2004,8.3 Fred Buckley,Marty Lewinter著. 李慧霸,王凤芹译. 图论简明教程. 北京,清华大学出版社,2005,1.4严蔚敏,吴伟民.数据结构(c语言版).北京:清华大学出版社,20095谭浩强,等.c语言程序设计教程.北京:高等教育出版社,2007 附件1源程序:/* 采用邻接矩阵完成无向图的“建立、深度遍历、广度遍历”操作 */#include stdio.h#include string.h#define TRUE 1#define

22、 FALSE 0#define OVERFLOW -2#define OK 1#define ERROR 0typedef int Status;#define INFINITY INT_MAX /*最大值“无穷”*/#define MAX_VERTEX_NUM 20 /*最大顶点个数*/typedef int Boolean;typedef char VertexType20;typedef int VRType;/*以下为队列的操作*/*队列的类型定义*/typedef int QElemType;typedef struct QNode QElemType data; struct QN

23、ode *next; QNode, *QueuePtr;typedef struct QueuePtr front; QueuePtr rear; LinkQueue;/*初始化队列*/Status InitQueue(LinkQueue *Q) (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode); if (!(*Q).front) exit(OVERFLOW); (*Q).front-next=NULL; return OK; /*判断队列是否为空*/Status QueueEmpty (LinkQueue Q) if (Q.front=Q

24、.rear) return TRUE; else return FALSE; /*入队列*/Status EnQueue(LinkQueue *Q, QElemType e) QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode); if (!p) exit(OVERFLOW); p-data=e; p-next=NULL; (*Q).rear-next=p; (*Q).rear=p; return OK; /*出队列*/Status DeQueue(LinkQueue *Q, QElemType *e) QueuePtr p; if (*Q).front=(

25、*Q).rear) return ERROR; p=(*Q).front-next; *e=p-data; (*Q).front-next=p-next; if (*Q).rear=p) (*Q).rear=(*Q).front; free(p); return OK; /*以下为图的操作*/*图的类型定义*/typedef struct ArcCell VRType adj; /*图中有1/0表示是否有边,网中表示边上的权值*/ /* InfoType *info; 与边相关的信息*/ ArcCell, AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typede

26、f struct VertexType vexsMAX_VERTEX_NUM; /*顶点向量*/ AdjMatrix arcs; /*邻接矩阵*/ int vexnum,arcnum; /*图中当前顶点数和边数*/ MGraph;/*建立无向图的邻接矩阵*/void CreateGraph(MGraph *G) int i,j,k; VertexType v1,v2; printf(n输入图的顶点个数,边个数(中间用逗号隔开):); scanf(%d,%d,&(*G).vexnum,&(*G).arcnum); printf(输入 %d 个顶点的名字:,(*G).vexnum); for(i=0;i(*G).vexnum;i+) /*输入顶点向量*/ scanf(%s,(*G).vexsi); printf(n顶点数组:n); for(i=0;ivexnum;i+) /*输出顶点向量*/ puts(G-

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

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