图的深度优先遍历算法课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
合肥学院
计算机科学与技术系
课程设计报告
2013~2014学年第二学期
课程数据结构与算法
课程设计名称图的深度优先遍历算法的实现
学生姓名陈琳
学号1204091022
专业班级软件工程
指导教师何立新
2014 年9 月
一:问题分析和任务定义
涉及到数据结构遍会涉及到对应存储方法的遍历问题。本次程序采用邻接表的存储方
法,并且以深度优先实现遍历的过程得到其遍历序列。
深度优先遍历图的方法是,从图中某顶点v 出发: (1)访问顶点v ;
(2)依次从v 的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v 有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 二:数据结构的选择和概要设计 设计流程如图:
图
1 设计流程
利用一维数组创建邻接表,同时还需要一个一维数组来存储顶点信息。之后利用创建的邻接表来创建图,最后用深度优先的方法来实现遍历。
图 2 原始图 1.从0开始,首先找到0的关联顶点3
2.由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
{
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
{
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
{
visited[v]=False;
}
for(v=0;v
{
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 2
4
1
图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.王昆仑、李红.《数据结构与算法(第二版)》.北京:中国铁道出版社,2012
2.程杰.《大话数据结构[M]》.北京:清华大学出版社,2011
3.韩利凯、李军.《数据结构[M]》.浙江:浙江大学出版社,2013
4.谢若阳.《数据结构[M].北京》:清华大学出版社,2010
5.黄国瑜、叶乃菁.《数据结构[M]》.北京:清华大学出版社,2009
八:附录
//以邻接表为存储结构的深度优先搜索算法
#include "stdio.h"
#include "malloc.h"
#define MaxVerNum 8
#define MAXSIZE 100 //顶点最大个数
#define False 0
#define True 1
int visited[MaxVerNum];//全局变量,0表示未被访问过,1表示已被访问过
typedef char VertexType;
typedef struct node //邻接表节点.
{
int adjvex; //邻接点的位置
struct node* next; //指向下一个节点
}EdgeNode; //邻接表中的节点类型
typedef struct vnode //顶点节点.
{
VertexType vertex; //顶点信息
EdgeNode* firstedge; //指向第一个邻接表节点