图的DFS或BFS遍历.docx

上传人:b****6 文档编号:3280685 上传时间:2022-11-21 格式:DOCX 页数:16 大小:53.76KB
下载 相关 举报
图的DFS或BFS遍历.docx_第1页
第1页 / 共16页
图的DFS或BFS遍历.docx_第2页
第2页 / 共16页
图的DFS或BFS遍历.docx_第3页
第3页 / 共16页
图的DFS或BFS遍历.docx_第4页
第4页 / 共16页
图的DFS或BFS遍历.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

图的DFS或BFS遍历.docx

《图的DFS或BFS遍历.docx》由会员分享,可在线阅读,更多相关《图的DFS或BFS遍历.docx(16页珍藏版)》请在冰豆网上搜索。

图的DFS或BFS遍历.docx

图的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;ivexnum;i++)

{

cin>>G->adjlists[i].vertex;

G->adjlists[i].edgelink=NULL;

}

cout<<"开始输入边表信息:

"<

for(k=0;karcnum;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<adjlists[i].vertex<<"";

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;ivexnum;i++)

{

visit[i]=0;//全部初始化为0,即未访问状态

}

intm;

for(i=0;ivexnum;i++)

{

if(G->adjlists[i].vertex==c)//根据字符查找序号

{

m=i;

DFS(G,i,visit);

break;

}

}

//继续访问未被访问的结点

for(i=0;ivexnum;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<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->endver;

EnQueue(Q,m);

}

}

}

}

}

voidBFStraversal(Graph*G,charc)

{

cout<<"该图的广度优先遍历结果为:

"<

intvisited[MaxVerNum];

for(inti=0;ivexnum;i++)

{

visited[i]=0;

}

intm;

for(i=0;ivexnum;i++)

{

if(G->adjlists[i].vertex==c)

{

m=i;

BFS(G,i,visited);

break;

}

}

//继续访问未被访问的结点

for(i=0;ivexnum;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;ivexnum;i++)

{

cin>>G->adjlists[i].vertex;

G->adjlists[i].edgelink=NULL;

}

cout<<"开始输入边表信息:

"<

for(k=0;karcnum;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<adjlists[i].vertex<<"";

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;ivexnum;i++)

{

visit[i]=0;//全部初始化为0,即未访问状态

}

intm;

for(i=0;ivexnum;i++)

{

if(G->adjlists[i].vertex==c)//根据字符查找序号

{

m=i;

DFS(G,i,visit);

break;

}

}

//继续访问未被访问的结点

for(i=0;ivexnum;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<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->endver;

EnQueue(Q,m);

}

}

}

}

}

voidBFStraversal(Graph*G,charc)

{

cout<<"该图的广度优先遍历结果为:

"<

intvisited[MaxVerNum];

for(inti=0;ivexnum;i++)

{

visited[i]=0;

}

intm;

for(i=0;ivexnum;i++)

{

if(G->adjlists[i].vertex==c)

{

m=i;

BFS(G,i,visited);

break;

}

}

//继续访问未被访问的结点

for(i=0;ivexnum;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);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1