图的基本操作数据实验报告书Word文件下载.docx
- 文档编号:22490909
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:18
- 大小:60.54KB
图的基本操作数据实验报告书Word文件下载.docx
《图的基本操作数据实验报告书Word文件下载.docx》由会员分享,可在线阅读,更多相关《图的基本操作数据实验报告书Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
[问题描述]
对给定图,实现图的深度优先遍历和广度优先遍历。
[基本要求]
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
【测试数据】
由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作
1、掌握图的相关概念。
2、掌握图的逻辑结构和存储结构。
3、掌握图的两种遍历算法的实现。
四、实验报告要求
1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
3、算法设计
1、程序所需头文件已经预处理宏定义和结构体定义如下
#include<
iostream.h>
#defineMaxVerNum100
structedgenode
{
intendver;
intinform;
edgenode*edgenext;
};
structvexnode
charvertex;
edgenode*edgelink;
structGraph
vexnodeadjlists[MaxVerNum];
intvexnum;
intarcnum;
2、队列的定义及相关函数的实现
structQueueNode
intnData;
QueueNode*next;
structQueueList
QueueNode*front;
QueueNode*rear;
voidEnQueue(QueueList*Q,inte)
QueueNode*q=newQueueNode;
q->
nData=e;
next=NULL;
if(Q==NULL)
return;
if(Q->
rear==NULL)
Q->
front=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;
rear=NULL;
3、创建无向图
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;
//因为是无向图,所以有两次建立边表的过程
4、深度优先遍历
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)
5、广度优先遍历
voidBFS(Graph*G,intv,intvisit[])
QueueList*Q=newQueueList;
Q->
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->
voidBFStraversal(Graph*G,charc)
该图的广度优先遍历结果为:
intvisited[MaxVerNum];
for(inti=0;
visited[i]=0;
intm;
for(i=0;
if(G->
adjlists[i].vertex==c)
m=i;
BFS(G,i,visited);
//继续访问未被访问的结点
for(i=0;
if(visited[i]==0)
4、调试与测试
我们开始测试数据,如图:
由图可知,我们得出了结果。
五、总结
通过做这次实验,发现自己在数据结构这门课中还有很多不足有很多知识还没掌握,所以在写程序的时候出现了很多的错误,及还有很多的知识不以灵活运用。
因为以前C语言没有掌握好,所以这次做本次实验还是有点吃力,刚开始完全没有思,后来经过查找资料,在自己的努力下和同学的帮助下,终于完了本次实验。
还要注意输入的问题,什么时候用空格,什么时候用回车,这一点是需要注意的,因为一旦数据的输入有问题,结果当然也就不可能正确了。
只有正确的输入数据,建立图,才能得出正确的遍历结果。
此次实验发现的自己的不足,我相信在以后的学习中,我会更加的努力。
六、源代码
//队列的定义及相关函数的实现
//创建图
//深度优先遍历
//广度优先遍历
QueueList*Q=newQueueList;
Q->
EnQueue(Q,v);
while(Q->
inte=0;
DeQueue(Q,&
visit[e]=1;
edgenode*p=newedgenode;
p=G->
if(p)
intm=p->
if(m==0)
{
EnQueue(Q,m);
while(visit[m]==0)
{
p=p->
if(p==NULL)
break;
m=p->
EnQueue(Q,m);
}
}
intvisited[MaxVerNum];
for(inti=0;
visited[i]=0;
BFS(G,i,visited);
if(visited[i]==0)
voidmain()
Graph*G=newGraph;
CreatAdjList(G);
charch;
请输入开始遍历的顶点:
ch;
DFStraversal(G,ch);
BFStraversal(G,ch);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 操作 数据 实验 报告书
![提示](https://static.bdocx.com/images/bang_tan.gif)