当前位置:文档之家› 图的深度优先遍历算法课程设计报告

图的深度优先遍历算法课程设计报告

合肥学院计算机科学与技术系课程设计报告2013~2014学年第二学期课程数据结构与算法课程设计名称图的深度优先遍历算法的实现学生姓名陈琳学号1204091022专业班级软件工程指导教师何立新2014 年9 月一:问题分析和任务定义涉及到数据结构遍会涉及到对应存储方法的遍历问题。

本次程序采用邻接表的存储方法,并且以深度优先实现遍历的过程得到其遍历序列。

深度优先遍历图的方法是,从图中某顶点v 出发: (1)访问顶点v ;(2)依次从v 的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v 有路径相通的顶点都被访问;(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

二:数据结构的选择和概要设计 设计流程如图:图1 设计流程利用一维数组创建邻接表,同时还需要一个一维数组来存储顶点信息。

之后利用创建的邻接表来创建图,最后用深度优先的方法来实现遍历。

图 2 原始图 1.从0开始,首先找到0的关联顶点32.由3出发,找到1;由1出发,没有关联的顶点。

3.回到3,从3出发,找到2;由2出发,没有关联的顶点。

4.回到4,出4出发,找到1,因为1已经被访问过了,所以不访问。

所以最后顺序是0,3,1,2,4三:详细设计和编码1.创建邻接表和图void CreateALGraph (ALGraph* G) //建立邻接表函数.{int i,j,k,s;char y;EdgeNode* p; //工作指针.printf("请输入图的顶点数n与边数e(以逗号做分隔符):\n");scanf("%d,%d",&(G->n),&(G->e));scanf("%c",&y); //用y来接收回车符.for(s=0;s<G->n;s++){printf("请输入下标为%d的顶点的元素:\n",s);scanf("%c",&(G->adjlist[s].vertex));scanf("%c",&y); //用y来接收回车符.当后面要输入的是和单个字符有关的数据时候要存贮回车符,以免回车符被误接收。

G->adjlist[s].firstedge=NULL;}printf("请分别输入该图的%d条弧\n",G->e);for(k=0;k<G->e;k++){printf("请输入第%d条弧的起点和终点(起点下标,终点下标):\n",(k+1));scanf("%d,%d",&i,&j);p=(EdgeNode*)malloc(sizeof(EdgeNode));p->adjvex=j;p->next=G->adjlist[i].firstedge;G->adjlist[i].firstedge=p;}}2.深度优先遍历void DFS(ALGraph* G,int v) //深度优先遍历{EdgeNode* p;int w;printf("%c ",G->adjlist[v].vertex);visited[v]=True;for(p=G->adjlist[v].firstedge;p;p=p->next){w=p->adjvex;if(!visited[w])DFS(G,w); //对于没有访问过的顶点,调用深度优先搜索函数 }}void DFStraverse(ALGraph* G){int v;for(v=0;v<G->n;v++){visited[v]=False;}for(v=0;v<G->n;v++) //对v尚未访问到的邻接点w进行一个递归遍历.{if(!visited[v])DFS(G,v);}}四:上机调试过程在创建图时,输入程序printf("第%d条弧的起点和终点(格式为"起点下标,终点下标"):\n",(k+1));运行发现有十六个错误,错误截图为:图3 调试错误图经调试,将该段程序修改为:printf("请输入第%d 条弧的起点和终点(起点下标,终点下标):\n",(k+1));即可成功。

五:测试结果及其分析 1.测试结果:图4 测试结果图 2.分析此程序的图如下:图5 原始图遍历从0开始,第一步到3 0 3 241图6 第一次遍历与3相连的有1和2,在此先遍历1图7 第二次遍历而与1相关的没有,则返回到3,与3相连的有1和2,1遍历过,所以遍历2图8 第三次遍历2没有与之相关的顶点返回3,3的所有相关都遍历过,返回0,只剩下4图9 第四次遍历与4相关的1已遍历过,返回0,0的所有相关都已遍历,则深度优先遍历结束。

遍历顺序:0 3 1 2 4六:用户使用说明1.根据屏幕提示输入图的顶点数n与边数e(以逗号做分隔符);2.依次输入下标为0,1,2……(n-1)的顶点的元素;3.依次输入第1,2……e条弧的起点和终点,格式为:起点下标,终点下标;4.即可得出所输入图的深度优先遍历序列;七:参考文献1.王昆仑、李红.《数据结构与算法(第二版)》.北京:中国铁道出版社,20122.程杰.《大话数据结构[M]》.北京:清华大学出版社,20113.韩利凯、李军.《数据结构[M]》.浙江:浙江大学出版社,20134.谢若阳.《数据结构[M].北京》:清华大学出版社,20105.黄国瑜、叶乃菁.《数据结构[M]》.北京:清华大学出版社,2009八:附录//以邻接表为存储结构的深度优先搜索算法#include "stdio.h"#include "malloc.h"#define MaxVerNum 8#define MAXSIZE 100 //顶点最大个数#define False 0#define True 1int visited[MaxVerNum];//全局变量,0表示未被访问过,1表示已被访问过typedef char VertexType;typedef struct node //邻接表节点.{int adjvex; //邻接点的位置struct node* next; //指向下一个节点}EdgeNode; //邻接表中的节点类型typedef struct vnode //顶点节点.{VertexType vertex; //顶点信息EdgeNode* firstedge; //指向第一个邻接表节点}VertexNode; //表头节点类型typedef struct{VertexNode adjlist[MaxVerNum];//存储邻接表节点的一维数组int n,e; //定义顶点数n和边数e}ALGraph; //邻接表类型void CreateALGraph (ALGraph* G) //建立邻接表函数.{int i,j,k,s;char y;EdgeNode* p; //工作指针.printf("请输入图的顶点数n与边数e(以逗号做分隔符):\n");scanf("%d,%d",&(G->n),&(G->e));scanf("%c",&y); //用y来接收回车符.for(s=0;s<G->n;s++){printf(“请输入下标为%d的顶点的元素:\n",s);scanf("%c",&(G->adjlist[s].vertex));scanf("%c",&y);//用y来接收回车符.当后面要输入的是和单个字符有关的数据时候要存贮回车符,以免回车符被误接收。

G->adjlist[s].firstedge=NULL;}printf("请分别输入该图的%d条弧\n",G->e);for(k=0;k<G->e;k++){printf("请输入第%d条弧的起点和终点(起点下标,终点下标):\n",(k+1));scanf("%d,%d",&i,&j);p=(EdgeNode*)malloc(sizeof(EdgeNode))p->adjvex=j;p->next=G->adjlist[i].firstedge;G->adjlist[i].firstedge=p;}}void DFS(ALGraph* G,int v) //深度优先遍历{EdgeNode* p;int w;printf("%c ",G->adjlist[v].vertex);visited[v]=True;for(p=G->adjlist[v].firstedge;p;p=p->next)w=p->adjvex;if(!visited[w])DFS(G,w); //对于没有访问过的顶点,调用深度优先搜索函数}}void DFStraverse(ALGraph* G){int v;for(v=0;v<G->n;v++){visited[v]=False;}for(v=0;v<G->n;v++) //对v尚未访问到的邻接点w进行一个递归遍历{if(!visited[v])DFS(G,,v)}}int main(){ALGraph net; //定义一个有向图CreateALGraph(&net); //创建一个给定的有向图printf("图的深度优先遍历为:\n");DFStraverse(&net); //进行该有向图的深度优先遍历,并打印结果printf("\n");return 0;}。

相关主题