图的DFS或BFS遍历Word文档格式.docx
《图的DFS或BFS遍历Word文档格式.docx》由会员分享,可在线阅读,更多相关《图的DFS或BFS遍历Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
二、实验环境
1.操作系统:
Windows7
2.开发软件:
MicrosoftVisualC++6.0
三、实验内容
●程序功能
本程序完成了以下功能:
1.创建图
2.图的深度遍历
3.图的广度遍历
●数据结构
本程序中使用的数据结构:
1.它的优缺点
1)图的深度优先遍历类似于树的前序遍历。
采用的搜索方法的特点是尽可能先对纵深方向进行搜索。
减轻了程序员的负担,其用的是递归算法。
2)缺点:
加重了计算机的负担,变的很繁琐。
2.逻辑结构图
3.存储结构图
4.存储结构的C/C++语言描述
structedgenode
{
intendver;
intinform;
edgenode*edgenext;
};
structvexnode
charvertex;
edgenode*edgelink;
structGraph
vexnodeadjlists[MaxVerNum];
intvexnum;
intarcnum;
structQueueNode
intnData;
QueueNode*next;
structQueueList
QueueNode*front;
QueueNode*rear;
●算法描述
本程序中采用的算法
1.算法名称:
递归
2.算法原理或思想
其是通过一层一层的递归,遍历到最后一个结点。
3.算法特点
4.图的深度优先遍历类似于树的前序遍历。
●程序说明
1.系统流程图
2.程序模块
1)创建图模块:
将图创建并确定结点数和边数同时录入结点名。
代码:
voidCreatAdjList(Graph*G)
inti,j,k;
edgenode*p1;
edgenode*p2;
cout<
<
"
请输入顶点数和边数:
endl;
cin>
>
G->
vexnum>
arcnum;
开始输入顶点表:
for(i=0;
i<
vexnum;
i++)
{
cin>
adjlists[i].vertex;
G->
adjlists[i].edgelink=NULL;
}
开始输入边表信息:
for(k=0;
k<
k++)
cout<
请输入边<
Vi,Vj>
对应的顶点:
;
i>
j;
p1=newedgenode;
p1->
endver=j;
edgenext=G->
adjlists[i].edgelink;
adjlists[i].edgelink=p1;
p2=newedgenode;
p2->
endver=i;
adjlists[j].edgelink;
adjlists[j].edgelink=p2;
//因为是无向图,所以有两次建立边表的过程
}
2)深度遍历模块:
将图进行深度遍历。
voidDFS(Graph*G,inti,intvisit[])
adjlists[i].vertex<
"
visit[i]=1;
edgenode*p=newedgenode;
p=G->
if(G->
adjlists[i].edgelink&
&
!
visit[p->
endver])
{
DFS(G,p->
endver,visit);
voidDFStraversal(Graph*G,charc)//深度优先遍历
该图的深度优先遍历结果为:
intvisit[MaxVerNum];
for(inti=0;
visit[i]=0;
//全部初始化为0,即未访问状态
intm;
if(G->
adjlists[i].vertex==c)//根据字符查找序号
{
m=i;
DFS(G,i,visit);
break;
}
//继续访问未被访问的结点
for(i=0;
if(visit[i]==0)
3)广度遍历模块:
将图进行广度遍历。
voidBFS(Graph*G,intv,intvisit[])
QueueList*Q=newQueueList;
Q->
front=Q->
rear=NULL;
EnQueue(Q,v);
while(Q->
rear!
=NULL)
inte=0;
DeQueue(Q,&
e);
adjlists[e].vertex<
visit[e]=1;
edgenode*p=newedgenode;
p=G->
adjlists[e].edgelink;
if(p)
intm=p->
endver;
if(m==0)
{
EnQueue(Q,m);
while(visit[m]==0)
{
p=p->
edgenext;
if(p==NULL)
break;
m=p->
EnQueue(Q,m);
}
}
voidBFStraversal(Graph*G,charc)
该图的广度优先遍历结果为:
intvisited[MaxVerNum];
for(inti=0;
visited[i]=0;
adjlists[i].vertex==c)
BFS(G,i,visited);
if(visited[i]==0)
四、调试与运行
1.程序调试
调试:
程序开发过程不可能没有BUG,你用了哪些手段或方法发现并改正错误。
本程序开发过程中,采用的调试方法或手段如下:
1)方法1:
在程序执行的终止的函数中加一条输出语句cout<
”*******”<
endl;
进行错误的定位,调试了指针没有正确使用的错误。
2)方法2:
输出一些结点中的数据,看能不能正确的输出,调试了数据是否正确的录入了。
2.运行结果
运行结果图1
……
五、实验总结
1.结果分析:
本程序完成了图的创建和图的深度遍历、广度遍历功能;
但是还是存在不完善的地方,没有将图的大体构造展现在屏幕上,让人有点不是很明白。
2.心得体会:
通过这个实验我更熟练的掌握了递归算法,再次得以巩固,觉得数据结构是一个很不错的一门课程。
#include<
iostream.h>
#defineMaxVerNum50
//队列的定义及相关函数的实现
voidEnQueue(QueueList*Q,inte)
QueueNode*q=newQueueNode;
q->
nData=e;
next=NULL;
if(Q==NULL)
return;
if(Q->
rear==NULL)
Q->
rear=q;
else
rear->
next=q;
rear=Q->
next;
voidDeQueue(QueueList*Q,int*e)
if(Q==NULL)
if(Q->
front==Q->
rear)
*e=Q->
front->
nData;
//创建图
//-------------------------------------------------------------深度优先遍历
//-------------------------------------------------------------广度优先遍历
voidmain()
Graph*G=newGraph;
CreatAdjList(G);
charch;
请输入开始遍历的顶点:
ch;
DFStraversal(G,ch);
BFStraversal(G,ch);