图的DFS或BFS遍历.docx
- 文档编号:3280685
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:16
- 大小:53.76KB
图的DFS或BFS遍历.docx
《图的DFS或BFS遍历.docx》由会员分享,可在线阅读,更多相关《图的DFS或BFS遍历.docx(16页珍藏版)》请在冰豆网上搜索。
图的DFS或BFS遍历
数学与计算机学院计算机系实验报告
课程名称:
数据结构
年级:
2010
实验成绩:
指导教师:
黄襄念
姓名:
实验教室:
6A-413
实验名称:
图的DFS或BFS遍历
学号:
实验日期:
2012/6/10
实验序号:
实验4
实验时间:
8:
00—11:
40
实验学时:
4
一、实验目的
1.熟悉的掌握图的深度很广度遍历。
二、实验环境
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<<"请输入顶点数和边数:
"< cin>>G->vexnum>>G->arcnum; cout<<"开始输入顶点表: "< for(i=0;i { cin>>G->adjlists[i].vertex; G->adjlists[i].edgelink=NULL; } cout<<"开始输入边表信息: "< for(k=0;k { cout<<"请输入边 "; cin>>i>>j; p1=newedgenode; p1->endver=j; p1->edgenext=G->adjlists[i].edgelink; G->adjlists[i].edgelink=p1; p2=newedgenode; p2->endver=i; p2->edgenext=G->adjlists[j].edgelink; G->adjlists[j].edgelink=p2; //因为是无向图,所以有两次建立边表的过程 } } 2)深度遍历模块: 将图进行深度遍历。 代码: voidDFS(Graph*G,inti,intvisit[]) { cout< visit[i]=1; edgenode*p=newedgenode; p=G->adjlists[i].edgelink; if(G->adjlists[i].edgelink&&! visit[p->endver]) { DFS(G,p->endver,visit); } } voidDFStraversal(Graph*G,charc)//深度优先遍历 { cout<<"该图的深度优先遍历结果为: "< intvisit[MaxVerNum]; for(inti=0;i { visit[i]=0;//全部初始化为0,即未访问状态 } intm; for(i=0;i { if(G->adjlists[i].vertex==c)//根据字符查找序号 { m=i; DFS(G,i,visit); break; } } //继续访问未被访问的结点 for(i=0;i { if(visit[i]==0) DFS(G,i,visit); } cout< } 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); cout< 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->endver; EnQueue(Q,m); } } } } } voidBFStraversal(Graph*G,charc) { cout<<"该图的广度优先遍历结果为: "< intvisited[MaxVerNum]; for(inti=0;i { visited[i]=0; } intm; for(i=0;i { if(G->adjlists[i].vertex==c) { m=i; BFS(G,i,visited); break; } } //继续访问未被访问的结点 for(i=0;i { if(visited[i]==0) BFS(G,i,visited); } cout< } 四、调试与运行 1.程序调试 调试: 程序开发过程不可能没有BUG,你用了哪些手段或方法发现并改正错误。 本程序开发过程中,采用的调试方法或手段如下: 1)方法1: 在程序执行的终止的函数中加一条输出语句cout<<”*******”< 2)方法2: 输出一些结点中的数据,看能不能正确的输出,调试了数据是否正确的录入了。 2.运行结果 运行结果图1 …… 五、实验总结 1.结果分析: 本程序完成了图的创建和图的深度遍历、广度遍历功能;但是还是存在不完善的地方,没有将图的大体构造展现在屏幕上,让人有点不是很明白。 2.心得体会: 通过这个实验我更熟练的掌握了递归算法,再次得以巩固,觉得数据结构是一个很不错的一门课程。 代码: #include #defineMaxVerNum50 structedgenode { intendver; intinform; edgenode*edgenext; }; structvexnode { charvertex; edgenode*edgelink; }; structGraph { vexnodeadjlists[MaxVerNum]; intvexnum; intarcnum; }; //队列的定义及相关函数的实现 structQueueNode { intnData; QueueNode*next; }; structQueueList { QueueNode*front; QueueNode*rear; }; voidEnQueue(QueueList*Q,inte) { QueueNode*q=newQueueNode; q->nData=e; q->next=NULL; if(Q==NULL) return; if(Q->rear==NULL) Q->front=Q->rear=q; else { Q->rear->next=q; Q->rear=Q->rear->next; } } voidDeQueue(QueueList*Q,int*e) { if(Q==NULL) return; if(Q->front==Q->rear) { *e=Q->front->nData; Q->front=Q->rear=NULL; } else { *e=Q->front->nData; Q->front=Q->front->next; } } //创建图 voidCreatAdjList(Graph*G) { inti,j,k; edgenode*p1; edgenode*p2; cout<<"请输入顶点数和边数: "< cin>>G->vexnum>>G->arcnum; cout<<"开始输入顶点表: "< for(i=0;i { cin>>G->adjlists[i].vertex; G->adjlists[i].edgelink=NULL; } cout<<"开始输入边表信息: "< for(k=0;k { cout<<"请输入边 "; cin>>i>>j; p1=newedgenode; p1->endver=j; p1->edgenext=G->adjlists[i].edgelink; G->adjlists[i].edgelink=p1; p2=newedgenode; p2->endver=i; p2->edgenext=G->adjlists[j].edgelink; G->adjlists[j].edgelink=p2; //因为是无向图,所以有两次建立边表的过程 } } //-------------------------------------------------------------深度优先遍历 voidDFS(Graph*G,inti,intvisit[]) { cout< visit[i]=1; edgenode*p=newedgenode; p=G->adjlists[i].edgelink; if(G->adjlists[i].edgelink&&! visit[p->endver]) { DFS(G,p->endver,visit); } } voidDFStraversal(Graph*G,charc)//深度优先遍历 { cout<<"该图的深度优先遍历结果为: "< intvisit[MaxVerNum]; for(inti=0;i { visit[i]=0;//全部初始化为0,即未访问状态 } intm; for(i=0;i { if(G->adjlists[i].vertex==c)//根据字符查找序号 { m=i; DFS(G,i,visit); break; } } //继续访问未被访问的结点 for(i=0;i { if(visit[i]==0) DFS(G,i,visit); } cout< } //-------------------------------------------------------------广度优先遍历 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); cout< 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->endver; EnQueue(Q,m); } } } } } voidBFStraversal(Graph*G,charc) { cout<<"该图的广度优先遍历结果为: "< intvisited[MaxVerNum]; for(inti=0;i { visited[i]=0; } intm; for(i=0;i { if(G->adjlists[i].vertex==c) { m=i; BFS(G,i,visited); break; } } //继续访问未被访问的结点 for(i=0;i { if(visited[i]==0) BFS(G,i,visited); } cout< } voidmain() { Graph*G=newGraph; CreatAdjList(G); charch; cout<<"请输入开始遍历的顶点: "; cin>>ch; DFStraversal(G,ch); BFStraversal(G,ch); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DFS BFS 遍历
![提示](https://static.bdocx.com/images/bang_tan.gif)