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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;sn;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;ke;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;vn;v++)

{

visited[v]=False;

}

for(v=0;vn;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 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; //指向第一个邻接表节点

相关文档
最新文档