图的遍历实现课程设计 数据结构 程序 图
数据结构中的图的遍历算法

数据结构中的图的遍历算法图是一种非常重要且广泛应用的数据结构,它由顶点和边组成,可以用来表示各种实际问题,如社交网络、路线规划等。
图的遍历算法是对图中的所有顶点进行系统访问的方法,它可以用来查找、遍历和搜索图中的元素。
本文将介绍图的遍历算法的基本概念和常用的实现方法。
一、图的遍历算法概述图的遍历算法是指按照某种规则遍历图中的所有顶点,以便于查找、遍历和搜索图中的元素。
常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)两种。
深度优先搜索(DFS)是一种先访问顶点的所有邻接顶点,再递归访问邻接顶点的邻接顶点的算法。
它以深度为优先级,一直向前走到不能继续为止,然后返回到前一个结点,继续向前走,直到遍历完整个图。
广度优先搜索(BFS)是一种先访问顶点的所有邻接顶点,再访问邻接顶点的邻接顶点,以此类推的算法。
它以广度为优先级,先访问离起始顶点最近的顶点,然后依次访问离起始顶点更远的顶点,直到遍历完整个图。
二、深度优先搜索(DFS)深度优先搜索是一种递归的搜索算法,它的基本思想是从图的某个顶点出发,沿着一条路径一直深入直到不能继续为止,然后返回到前一个结点,继续向前走。
具体实现时,可以使用递归或栈来保存需要访问的顶点。
以下是深度优先搜索的基本步骤:1. 选择一个起始顶点作为当前顶点,将其标记为已访问。
2. 访问当前顶点,并将其加入遍历结果。
3. 从当前顶点的未访问邻接顶点中选择一个作为下一个当前顶点,重复步骤2。
4. 如果当前顶点的所有邻接顶点都已访问,则返回到前一个顶点,重复步骤3。
5. 重复步骤4,直到遍历完整个图。
三、广度优先搜索(BFS)广度优先搜索是一种迭代的搜索算法,它的基本思想是从图的某个顶点出发,依次访问其所有未访问过的邻接顶点,然后再依次访问这些邻接顶点的未访问过的邻接顶点,直到遍历完整个图。
具体实现时,可以使用队列来保存需要访问的顶点。
以下是广度优先搜索的基本步骤:1. 选择一个起始顶点作为当前顶点,将其标记为已访问,并将其加入遍历结果。
数据结构实验报告图的遍历讲解

数据结构实验报告图的遍历讲解一、引言在数据结构实验中,图的遍历是一个重要的主题。
图是由顶点集合和边集合组成的一种数据结构,常用于描述网络、社交关系等复杂关系。
图的遍历是指按照一定的规则,挨次访问图中的所有顶点,以及与之相关联的边的过程。
本文将详细讲解图的遍历算法及其应用。
二、图的遍历算法1. 深度优先搜索(DFS)深度优先搜索是一种常用的图遍历算法,其基本思想是从一个顶点出发,沿着一条路径向来向下访问,直到无法继续为止,然后回溯到前一个顶点,再选择此外一条路径继续访问。
具体步骤如下:(1)选择一个起始顶点v,将其标记为已访问。
(2)从v出发,选择一个未被访问的邻接顶点w,将w标记为已访问,并将w入栈。
(3)如果不存在未被访问的邻接顶点,则出栈一个顶点,继续访问其它未被访问的邻接顶点。
(4)重复步骤(2)和(3),直到栈为空。
2. 广度优先搜索(BFS)广度优先搜索是另一种常用的图遍历算法,其基本思想是从一个顶点出发,挨次访问其所有邻接顶点,然后再挨次访问邻接顶点的邻接顶点,以此类推,直到访问完所有顶点。
具体步骤如下:(1)选择一个起始顶点v,将其标记为已访问,并将v入队。
(2)从队首取出一个顶点w,访问w的所有未被访问的邻接顶点,并将这些顶点标记为已访问,并将它们入队。
(3)重复步骤(2),直到队列为空。
三、图的遍历应用图的遍历算法在实际应用中有广泛的应用,下面介绍两个典型的应用场景。
1. 连通分量连通分量是指图中的一个子图,其中的任意两个顶点都是连通的,即存在一条路径可以从一个顶点到达另一个顶点。
图的遍历算法可以用来求解连通分量的个数及其具体的顶点集合。
具体步骤如下:(1)对图中的每一个顶点进行遍历,如果该顶点未被访问,则从该顶点开始进行深度优先搜索或者广度优先搜索,将访问到的顶点标记为已访问。
(2)重复步骤(1),直到所有顶点都被访问。
2. 最短路径最短路径是指图中两个顶点之间的最短路径,可以用图的遍历算法来求解。
数据结构与算法 图的遍历与连通性

数据结构与算法图的遍历与连通性数据结构与算法:图的遍历与连通性在计算机科学中,数据结构和算法是解决各种问题的基石。
其中,图作为一种重要的数据结构,其遍历和连通性的研究具有至关重要的意义。
让我们先来理解一下什么是图。
简单来说,图是由顶点(也称为节点)和边组成的结构。
顶点代表了事物或者对象,而边则表示顶点之间的关系。
例如,在一个社交网络中,人可以被视为顶点,而人与人之间的好友关系就是边。
图的遍历是指按照一定的规则访问图中的所有顶点。
常见的图遍历算法有深度优先遍历和广度优先遍历。
深度优先遍历就像是一个勇敢的探险家,一头扎进未知的领域,勇往直前,直到走投无路,然后回溯。
它的基本思想是先访问一个顶点,然后沿着一条未访问过的边递归地访问下一个顶点,直到没有可访问的边,再回溯到之前的顶点,继续探索其他未访问的边。
想象一下你在一个迷宫中,选择一条路一直走到底,直到遇到死胡同或者已经没有新的路可走,然后再返回之前的岔路口,选择另一条路继续前进。
广度优先遍历则像是一个谨慎的旅行者,逐层探索。
它先访问起始顶点,然后依次访问其所有相邻的顶点,再依次访问这些相邻顶点的相邻顶点,以此类推。
这就好比你在散播消息,先告诉离你最近的人,然后他们再告诉他们附近的人,一层一层地传播出去。
那么,为什么我们要进行图的遍历呢?这是因为通过遍历图,我们可以获取图的各种信息,比如顶点之间的关系、图的结构特点等。
在实际应用中,图的遍历有着广泛的用途。
例如,在搜索引擎中,通过遍历网页之间的链接关系来抓取和索引网页;在社交网络分析中,遍历用户之间的关系来发现社区结构等。
接下来,我们谈谈图的连通性。
连通性是指图中顶点之间是否存在路径相连。
如果从图中的任意一个顶点都可以到达其他任意一个顶点,那么这个图就是连通图;否则,就是非连通图。
判断图的连通性是一个重要的问题。
一种常见的方法是从某个顶点开始进行遍历,如果能够访问到所有的顶点,那么图就是连通的;否则,图是非连通的。
实验四图的实现及遍历

实验四图的实现及遍历题目:(1)采用邻接矩阵作为图的存储结构,完成有向图和无向图的DFS和BFS操作;(2)采用邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。
班级:0421001 姓名:杨欢学号:2010211971 完成日期:2011.12.3一、需求分析掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS 及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。
实验要求:1、分析、理解程序。
2、调试程序。
设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。
二、概要设计1,分析理解,调试程序2 ,设计一个无向图G,如右图所示3,设计一个有向图K,如右下图所示4,分别对无向图G和有向图K进行邻接矩阵存储和邻接链表存储,再分别进行深度优先遍历和广度优先遍历。
附加程序代码邻接矩阵作为存储结构的程序示例#include"stdio.h"#include"stdlib.h"#define MaxVertexNum 100 //定义最大顶点数typedef struct{char vexs[MaxVertexNum]; //顶点表int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表int n,e; //图中的顶点数n和边数e}MGraph; //用邻接矩阵表示的图的类型//=========建立邻接矩阵=======void CreatMGraph(MGraph *G){int i,j,k;char a;printf("Input VertexNum(n) and EdgesNum(e): ");scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数scanf("%c",&a);printf("Input Vertex string:");for(i=0;i<G->n;i++){scanf("%c",&a);G->vexs[i]=a; //读入顶点信息,建立顶点表}for(i=0;i<G->n;i++)for(j=0;j<G->n;j++)G->edges[i][j]=0; //初始化邻接矩阵printf("Input edges,Creat Adjacency Matrix\n");for(k=0;k<G->e;k++) { //读入e条边,建立邻接矩阵scanf("%d%d",&i,&j); //输入边(Vi,Vj)的顶点序号G->edges[i][j]=1;G->edges[j][i]=1; //若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 }}//=========定义标志向量,为全局变量=======typedef enum{FALSE,TRUE} Boolean;Boolean visited[MaxVertexNum];//========DFS:深度优先遍历的递归算法======void DFSM(MGraph *G,int i){ //以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵int j;printf("%c",G->vexs[i]); //访问顶点Vivisited[i]=TRUE; //置已访问标志for(j=0;j<G->n;j++) //依次搜索Vi的邻接点if(G->edges[i][j]==1 && ! visited[j])DFSM(G,j); //(Vi,Vj)∈E,且Vj未访问过,故Vj为新出发点}void DFS(MGraph *G){int i;for(i=0;i<G->n;i++)visited[i]=FALSE; //标志向量初始化for(i=0;i<G->n;i++)if(!visited[i]) //Vi未访问过DFSM(G,i); //以Vi为源点开始DFS搜索}//===========BFS:广度优先遍历=======void BFS(MGraph *G,int k){ //以Vk为源点对用邻接矩阵表示的图G进行广度优先搜索int i,j,f=0,r=0;int cq[MaxVertexNum]; //定义队列for(i=0;i<G->n;i++)visited[i]=FALSE; //标志向量初始化for(i=0;i<G->n;i++)cq[i]=-1; //队列初始化printf("%c",G->vexs[k]); //访问源点Vkvisited[k]=TRUE;cq[r]=k; //Vk已访问,将其入队。
数据结构课程设计-图的遍历

数据结构课程设计-图的遍历1. 介绍图是一种非线性数据结构,它由节点和边组成。
在图中,节点可以表示任何对象,而边则表示节点之间的关系。
图可以用于表示许多现实世界中的问题,例如社交网络、电路板和道路网络。
图遍历是图算法的基础,它是指从图的一个特定节点出发,按照一定顺序访问图中所有节点的过程。
在这篇文章中,我们将讨论基本的图遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。
2. 深度优先遍历 (DFS)深度优先遍历是一种用于遍历或搜索树或图的算法。
在深度优先遍历中,我们先访问一个顶点,然后沿着这个顶点下一条未访问的边走到下一个顶点,直到遇到一个没有未访问的邻居为止。
然后我们回溯到之前的节点,并访问该节点的另一个未访问的邻居。
我们重复这个过程,直到所有的节点都被访问。
在深度优先遍历中,每个节点仅被访问一次。
深度优先遍历有两种实现方式:递归实现和迭代实现。
递归实现方式是深度优先遍历的传统实现方式。
当对一个节点进行深度优先遍历时,我们首先访问这个节点,然后递归地遍历它的每一个邻居节点。
这个过程会一直持续到当前节点的所有邻居节点都被访问到为止。
下面是递归实现方式的伪代码:void DFS(Node node){visit(node);for (Node neighbor : node.neighbors) {if (!neighbor.visited) {DFS(neighbor);}}}另一种实现方式是使用栈来模拟递归过程,称为迭代实现方式。
在这种实现方式中,我们使用深度优先搜索的方式逐步遍历节点。
在遍历过程中,我们将每个节点的邻居节点加入到栈中,以便后续处理。
下面是迭代实现方式的伪代码:void DFS(Node node){Stack stack = new Stack();stack.push(node);while (!stack.isEmpty()) {Node currentNode = stack.pop();if (!currentNode.visited) {visit(currentNode);for (Node neighbor : currentNode.neighbors) {stack.push(neighbor);}}}}3. 广度优先遍历 (BFS)广度优先遍历是另一种图遍历算法。
数据结构与算法课程设计报告---图的算法实现

数据结构与算法课程设计报告课程设计题目:图的算法实现专业班级:信息与计算科学1002班目录摘要 (1)1、引言 (1)2、需求分析 (1)3、概要设计 (2)4、详细设计 (4)5、程序设计 (10)6、运行结果 (18)7、总结体会 (19)摘要(题目): 图的算法实现实验内容图的算法实现问题描述:(1)将图的信息建立文件;(2)从文件读入图的信息,建立邻接矩阵和邻接表;(3)实现Prim、Kruskal、Dijkstra和拓扑排序算法。
关键字:邻接矩阵、Dijkstra和拓扑排序算法1.引言本次数据结构课程设计共完成图的存储结构的建立、Prim、Kruskal、Dijkstra 和拓扑排序算法等问题。
通过本次课程设计,可以巩固和加深对数据结构的理解,通过上机和程序调试,加深对课本知识的理解和熟练实践操作。
(1)通过本课程的学习,能够熟练掌握数据结构中图的几种基本操作;(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。
使用语言:CPrim算法思想:从连通网N={V,E}中的某一顶点v0出发,选择与它关联的具有最小权值的边(v0,v),将其顶点加入到生成树的顶点集合V中。
以后每一步从一个顶点在V中,而另一个顶点不在V中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合V中。
如此继续下去,直到网中的所有顶点都加入到生成树顶点集合V中为止。
拓扑排序算法思想:1、从有向图中选取一个没有前驱的顶点,并输出之;2、从有向图中删去此顶点以及所有以它为尾的弧;重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
没有前驱-- 入度为零,删除顶点及以它为尾的弧-- 弧头顶点的入度减1。
2.需求分析1、通过键盘输入建立一个新的有向带权图,建立相应的文件;2、对建立的有向带权图进行处理,要求具有如下功能:(1)用邻接矩阵和邻接表的存储结构输出该有向带权图,并生成相应的输出结果;(2)用Prim、Kruskal算法实现对图的最小生成树的求解,并输出相应的输出结果;(3)用Dijkstra算法实现对图中从某个源点到其余各顶点的最短路径的求解,并输出相应的输出结果;(4)实现该图的拓扑排序算法。
数据结构图

所以:对于点多边少的稀疏图来说,采用邻接表 结构使得算法在时间效 率上大大提高。
16
3/12
广度优先搜索(Breadth First Search,简称BFS ) BFS类似于树的层序遍历; 用一个数组用于标志已访问与否,还需要一个工作队列。
【例】一个无向图的BFS
8
6
CD
4
7
HG
BA
邻接多重表(Adjacency Multilist)
9
边表
• 在某些应用中,有时主要考察图中边的权值以及所依附的 两个顶点,即图的结构主要由边来表示,称为边表存储结 构。
• 边表结构采用顺序存储,用2个一维数组构成,一个存储 顶点信息,一个存储边的信息。边数组的每个元素由三部 分组成:
– 边的起点下标 – 边的终点下标 – 边的权值
1
A [i][
j]
0
如果 (vi , v j ) 或 vi , v j G的边 其它
无权图的邻接矩阵表示示例
V1
V2
V0
3
V3
4 12/15
带权图的邻接矩阵的定义
A [i][ j] wij
如果 (vi , vj ) 或 vi , v j G的边 其它
带图权的图邻的接邻矩接阵矩表阵示表示示例示[例例6.9]
1
第一部分 图的定义和术语
2
图的定义
“图” G可以表示为两个集合:G =(V, E)。每条 边是一个顶点对(v, w) E ,并且 v, w V。
通常:用 |V| 表示顶点的数量(|V| ≥ 1), 用 |E| 表示边的数量(|E| ≥ 0)。
(1) 无向图(完全有向图边数与顶点数之间的 关系) (2) 有向图(完全有向图弧数与顶点数之间的 关系) (3) 简单图:没有重边和自回路的图 (4) 邻接 (5) 路径,路径长度 (6) 无环(有向)图:没有任何回路的(有向)图 (7) 度,入度,出度 (8) 无向图的顶点连通、连通图、连通分量 (9) 有向图的顶点强连通,强连通图、连通分量
《数据结构》课程设计题目

《数据结构》课程设计题目《数据结构》课程设计题目课程设计题一:学生成绩管理系统设计目的:1.2.3. 掌握线性链表的建立。
掌握线性链表的基本操作。
掌握查找的基本算法。
设计内容:利用线性链表实现学生成绩管理系统,具体功能:输入、输出、插入、删除、查找、追加、读入、显示、保存、拷贝、排序、索引、分类合计、退出,并能在屏幕上输出操作前后的结果。
设计要求:1.2.3.写出系统需求分析,并建模。
编程实现,界面友好。
输出操作前后的结果。
课程设计题二:停车场管理系统设计目的:1.2.3.4. 掌握栈和队列的建立。
掌握栈和队列的基本操作。
深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们。
加深对栈和队列的理解和认识。
设计内容:设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。
每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编制一程序模拟该停车场的管理。
设计要求:1. 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
2. 每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
3. 对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费,功能可自己添加)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计设计说明书图的遍历的实现数学与计算机科学学院 2014年1 月 4日学生姓名 英 茜 学 号1118064033 班 级网络1101班 成 绩 指导教师申 静课程设计任务书2013—2014学年第一学期课程设计名称:数据结构课程设计课程设计题目:图的遍历实现完成期限:自2013年12 月23日至2014年 1 月4 日共 2 周设计内容:1. 任务说明(1) 采用邻接表存储结构创建一个图;(2) 编程实现图的深度优先搜索(或广度优先搜索)遍历算法;(3) 输出遍历结果;(4) 给定具体数据调试程序。
2. 要求1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?2)逻辑设计:写出抽象数据类型的定义,各个主要模块的算法,并画出模块之间的调用关系图;3)详细设计:定义相应的存储结构并写出各函数的伪码算法。
4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。
5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。
6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。
算法的时间、空间复杂性分析;7)编写课程设计报告。
3. 参考资料指导教师:申静教研室负责人:余冬梅课程设计评阅摘要针对图问题中如何更好地实现图的遍历问题,以无向图为例,分别采用广度优先遍历和深度优先遍历的算法实现对各节点的遍历,以VC++为开发环境进行系统的设计和实现,其运行结果表明,系统能很好地完成遍历后节点的输出,实现了遍历的目的,系统界面友好,可操作性强。
关键词:数据结构;存储结构;邻接矩阵目录一课题描述 (1)二设计目的与任务 (2)2.1课程设计的目的 (2)2.2课程设计的任务 (2)三设计方案和实施 (3)3.1总体设计 (3)3.2基本操作 (3)3.3详细设计 (4)四运行调试结果 (6)五结论与致谢 (9)六附录 (11)一课题描述数据结构是一门专业基础课,它对学习者的要求很明确:学会分析、研究计算机加工的数据结构的特性,以便为应用设计所需的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术。
其次,该课程的学习过程也是复杂程序设计的训练过程,要求学习者编写的程序结构或设计的程序结构体清楚、正确、易读,符合软件工程的规范。
图是一种较为复杂且重要的数据结构,其特殊性在于图形结构中结点之间的关系可以是任意的,图中任意两个数据元素之间都有可能相关。
就本课程设计而言应用图论的知识讨论如何在计算机上实现图的遍历的操作,主要解决图的遍历的几种方法的实现。
本设计采用目前最通用的程序设计语言之一—C语言作为数据结构和算法的描述语言。
1二设计目的与任务2.1课程设计的目的进一步的了解图的遍历的问题,图的DFS,BFS的递归和非递归算法的实现,用无向图来实现图的遍历。
初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算法设计、编写程序,求解出指定的问题。
训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养严谨的科学态度和良好的工作作风。
提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
2.2课程设计的任务1)任务说明用C/C++编写一个程序实现图的遍历的算法。
从键盘上输入一个图的基本信息(图用邻矩阵表示)。
图的DFS,BFS的递归和非递归算法的实现;用有向图实现图的遍历;用无向图实现图的遍历;用邻接矩阵存储图;用邻接表存储图。
2)要求1>首先输入图的结点数;2>依次输入图的各条边(数据之间用空格隔开);3>输出的形式:按用户选择的遍历方法给出遍历顺序,各字符间用->分隔;4>程序所能达到的功能:能够按要求输出所要的结果。
2三设计方案和实施3.1总体设计采用邻接矩阵作为图的存储结构。
程序中主要用到以下抽象数据类型:抽象数据类型的定义typedef struct{char *vexs; //顶点向量int arcs[MAX_VEX][MAX_VEX];//邻接矩阵int vexnum,arcnum; //图的当前顶点数和弧数}Graph;3.2基本操作CreateUDN(Graph &G)操作结果:用邻接矩阵创建带权无向网图。
DFS(Graph G,int k)操作结果:对已存在的图进行深度优先遍历。
BFS(Graph G)操作结果:对已存在的图进行广度优先遍历。
choose(Graph G)操作结果:对将要实现的操作步骤进行选择。
程序包含两个模块主程序模块,其中主函数为int main{输入信息;根据输入要求进行选择操作和输出;输出结果;}选择操作模块—实现具体选择的对应操作及输出操作。
两模块之间关系如下图3.1所示3图3.1 模块关系图3.3详细设计程序流程图如图3.2所示图3.2 程序流程图函数设计程序设计中主要包括下列函数用邻接矩阵创建一个图:4void CreateUDN(Graph &G){用邻接矩阵创建一个带权无向网图;输入顶点数和弧数;输入各个顶点及各条弧;}递归方法实现图的遍历:void DFS(Graph G, int k){用递归的方法访问图中的结点;对图进行深度优先遍历;}非递归方法实现图的遍历:void BFS(Graph G){用队列辅助访问图中的结点;对图进行广度优先遍历;}选择输出需要的遍历方法:void choose(Graph G){给出程序运行的选项;对相应的输入选项调用相应的函数以执行操作;}5四运行调试结果)例:遍历如下无向图(图4.1)(a,b,c,d,e分别表示V1 V2 V3 V4 V5五个顶点步骤一:运行程序,按提示首先输入顶点数和弧数。
图4.2输入顶点数和弧数步骤二:输入顶点和弧(1)输入顶点图4.3 输入各顶点(2)输入弧67图4.3 输入各条弧步骤三:选择便利方式以及选择后结果选择1操作显示广度优先编历结果图4.4 广度优先结果选2操作显示深度优先遍历图4.4深度优先遍历结果8五结论与致谢在程序设计中我主要是解决的是给出一个图如何用多种方法完成图的遍历的问题,也包括如何创建一个图,深度优先遍历和广度优先遍历一个图,递归和非递归的方法实现图的遍历。
程序最终通过调试运行,初步实现了设计目标。
图是一种较为复杂且重要的数据结构,其特殊性在于图形结构中结点之间的关系可以是任意的,图中任意两个数据元素之间都有可能相关。
用邻接矩阵作为图的数据存储结构很好地解决了图的结构难点,借助于邻接矩阵容易判定任意两个顶点之间是否有边(或弧)相连,并容易求得各个顶点的度。
该程序通俗易懂且实用性强,并且该程序清单详细具体、全面、具有很强的可读性;系统整体上比较完美,可以从键盘获取输入元素,并且可以根据用户输入进行选择性地输出;整体输出画面效果整洁、大方。
这次课程设计也让我充分认识到《数据结构》这门课的重要性。
它给我们一个思想和大纲,让我们在编程时容易找到思路,不至于无章可循。
同时它也有广泛的实际应用。
最后,我还要特别感谢我们的辅导老师申静老师,在她的精心辅导和帮助下,我的设计才得以顺利完成。
对她为我们的设计所提出的宝贵意见表示忠心的感谢!9参考文献[1]谭浩强. C程序设计[第三版]. 北京:清华大学出版社.[2]罗宇等. 数据结构[M ].北京邮电大学出版社.[3]严藯敏. 数据结构[C语言版]. 北京:清华大学出版社.[4]杨路明. C语言程序设计教程. 北京邮电大学出版社.[5]徐孝凯. 数据结构课程实验. 清华大学出版社.10六附录源程序代码// 程序功能:采用递归和非递归算法,有向图和无向图,邻接矩阵和邻接表等多种结构存储实现图的遍历。
// 程序作者:英茜// 最后修改日期:2014-1-3#include"stdio.h"#include"stdlib.h"#define INFINITY 32767#define MAX_VEX 20 //最大顶点个数#define QUEUE_SIZE (MAX_VEX+1) //队列长度bool *visited; //访问标志数组int z=1; //图的邻接矩阵存储结构typedef struct{char *vexs; //顶点向量int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵int vexnum,arcnum; //图的当前顶点数和弧数}Graph;class Queue{ //队列类public:void InitQueue(){base=(int *)malloc(QUEUE_SIZE*sizeof(int));front=rear=0;}void EnQueue(int e){base[rear]=e;rear=(rear+1)%QUEUE_SIZE;}11void DeQueue(int &e){e=base[front];front=(front+1)%QUEUE_SIZE;}int *base;int front;int rear;};int Locate(Graph G,char c){ //图G中查找元素c的位置for(int i=0;i<G.vexnum;i++)if(G.vexs[i]==c) return i;return -1;}void CreateUDN(Graph &G){ //创建无向网int i,j,w,s1,s2;char a,b,c,temp;printf("输入顶点数和弧数(顶点数和弧数之间以空格隔开) : ");scanf("%d%d",&G.vexnum,&G.arcnum);temp=getchar(); //接收回车G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目printf("输入%d个顶点.\n",G.vexnum);for(i=0;i<G.vexnum;i++){ //初始化顶点scanf("%c",&G.vexs[i]);temp=getchar(); //接收回车}for(i=0;i<G.vexnum;i++) //初始化邻接矩阵for(j=0;j<G.vexnum;j++)G.arcs[i][j]=INFINITY;printf("输入%d条弧.\n",G.arcnum);for(i=0;i<G.arcnum;i++){ //初始化弧printf("输入弧%d: ",i);12scanf("%c %c %d%c",&a,&b,&w,&c); //输入一条边依附的顶点和权值s1=Locate(G,a);s2=Locate(G,b);G.arcs[s1][s2]=G.arcs[s2][s1]=w;}}int FirstVex(Graph G,int k){ //图G中顶点k的第一个邻接顶点if(k>=0 && k<G.vexnum){ //k合理for(int i=0;i<G.vexnum;i++)if(G.arcs[k][i]!=INFINITY) return i;}return -1;}//图G中顶点i的第j个邻接顶点的下一个邻接顶点int NextVex(Graph G,int i,int j){if(i>=0 && i<G.vexnum && j>=0 && j<G.vexnum){ //i,j合理for(int k=j+1;k<G.vexnum;k++)if(G.arcs[i][k]!=INFINITY) return k;}return -1;}//深度优先遍历void DFS(Graph G,int k){int i;if(k==-1){ //第一次执行DFS时,k为-1for(i=0;i<G.vexnum;i++)if(!visited[i]) DFS(G,i); //对尚未访问的顶点调用DFS}else{visited[k]=true;if(z==1)13printf("%c",G.vexs[k]);else printf(" -> %c",G.vexs[k]); ++z; //访问第k个顶点if((z-1)%G.vexnum==0) z=1;for(i=FirstVex(G,k);i>=0;i=NextV ex(G,k,i))if(!visited[i]) DFS(G,i); //对k的尚未访问的邻接顶点i递归调用DFS}}//广度优先遍历void BFS(Graph G){int k;Queue Q; //辅助队列QQ.InitQueue();for(int i=0;i<G.vexnum;i++)if(!visited[i]){ //i尚未访问visited[i]=true;printf("%c ",G.vexs[i]);Q.EnQueue(i); //i入列while(Q.front!=Q.rear){Q.DeQueue(k); //队头元素出列并置为kfor(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w))if(!visited[w]){ //w为k的尚未访问的邻接顶点visited[w]=true;printf("-> %c ",G.vexs[w]);Q.EnQueue(w);}}} printf("\n 请继续选择:\n");}void choose(Graph G){ //对输入选项调用相应的函数执行操作int i,m;visited=(bool *)malloc(G.vexnum*sizeof(bool));14scanf("%d",&m);switch(m){case 1:printf("广度优先遍历: ");for(i=0;i<G.vexnum;i++)visited[i]=false;BFS(G); choose(G); printf("\n");break;case 2:printf("深度优先遍历: ");for(i=0;i<G.vexnum;i++)visited[i]=false;DFS(G,-1);printf("\n 请继续选择:\n");choose(G);break;case 3:printf("程序结束."); break;default : printf(" 输入错误!\n请在1-3中选择:\n"); choose(G);}}//主函数void main(){int i,m;Graph G;CreateUDN(G);printf("有如下选项供选择:\n");printf("\n");printf("|*| 1:广度优先遍历2:深度优先遍历3:退出本程序!|*|\n"); printf("\n");printf("请选择(1--3):\n");choose(G);}15。