数据结构的图的广度优先搜索实验报告郭治民Word格式文档下载.docx
- 文档编号:17195387
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:16
- 大小:119.24KB
数据结构的图的广度优先搜索实验报告郭治民Word格式文档下载.docx
《数据结构的图的广度优先搜索实验报告郭治民Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构的图的广度优先搜索实验报告郭治民Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
熟悉队列的操作原理
图的存储表示
熟悉广度优先搜索算法原理
熟练使用C++语言,实现广度优先搜索算法
二、实验内容:
1、问题描述
给定一个结点(始点),从它开始,对(连通)图中其它结点进行广度优先搜索。
2、图的广度优先搜索算法
所有顶点访问标志visited[]设置为FALSE,从某顶点v0开始,访问v0,visited[v0]=TRUE,将v0插入队列Q
(1)如果队列Q不空,则从队列Q头上取出一个顶点v,否则结束
(2)依次找到顶点v的所有相邻顶点v’,如果visited[v’]=TRUE
(3)重复
(1),
(2)
3、输入
第一行:
样本顶点个数,假设为n
第二行,n个顶点(用空格隔开)
第三行,图中边(或弧)的数目
第四行开始,每一行是边(弧)的两个顶点(用空格隔开)
4、输入样本
5、输出
广度优先搜索的顶点序列(用空格隔开,回车前无空格)
6、输出样本
三、实验步骤与过程:
1、图的定义
2、找到顶点字符在邻接表中对应的序号
3、将一个新的边插入到邻接表中
4、创建图的邻接表
5、显示邻接表
6、队列定义
7、清空队列
8、在队列中插入一个数据元素
9、在队列中删除一个数据元素
10、判断队列是否为空
11、图的广度优先搜索函数
12、主函数
代码:
#include"
stdio.h"
stdlib.h"
typedefcharDataType;
#defineMaxSize100
#defineMaxVertices10
#defineMaxEdges100
#defineMaxWeight10000
typedefstruct
{
DataTypelist[MaxSize];
intsize;
}SeqList;
DataTypequeue[MaxSize];
intrear;
intfront;
intcount;
}SeqCQueue;
typedefstruct
introw;
intcol;
intweight;
}RowColWeight;
SeqListVertices;
intedge[MaxVertices][MaxVertices];
intnumOfEdges;
}AdjMGraph;
//顺序表初始化
voidListInitiate(SeqList*L)
L->
size=0;
}
//顺序表插入函数
intListInsert(SeqList*L,inti,DataTypex)
intj;
if(L->
size>
=MaxSize)
{
printf("
顺序表已满无法插入!
\n"
);
return0;
}
elseif(i<
0||i>
L->
size)
参数i不合法!
else
for(j=L->
size;
j>
i;
j--)
list[j]=L->
list[j-1];
list[i]=x;
size++;
return1;
//图G初始化
voidInitiate(AdjMGraph*G,intn)
inti,j;
for(i=0;
i<
n;
i++)
for(j=0;
j<
j++)
if(i==j)
G->
edge[i][j]=0;
edge[i][j]=MaxWeight;
numOfEdges=0;
//边的条数数置为0
ListInitiate(&
G->
Vertices);
//在图G中插入结点vertex
voidInsertVertex(AdjMGraph*G,DataTypevertex)
ListInsert(&
Vertices,G->
Vertices.size,vertex);
//在图G中插入边
voidInsertEdge(AdjMGraph*G,intv1,intv2,intweight)
if(v1<
0||v2>
Vertices.size||v2<
0||v1>
Vertices.size)
参数v1或v2越界出错!
exit
(1);
edge[v1][v2]=weight;
numOfEdges++;
//在图G中寻找序号为v的结点的第一个邻接结点
intGetFirstVex(AdjMGraphG,intv)
if(v<
0||v>
G.Vertices.size)
参数v1越界出错!
for(col=0;
col<
G.Vertices.size;
col++)
if(G.edge[v][col]>
0&
&
G.edge[v][col]<
MaxWeight)
returncol;
return-1;
//在图G中寻找v1结点的邻接结点v2的下一个邻接结点
intGetNextVex(AdjMGraphG,intv1,intv2)
G.Vertices.size||v2<
for(col=v2+1;
if(G.edge[v1][col]>
G.edge[v1][col]<
//在图G中插入n个结点信息V和e条边信息E(创图函数)
voidCreatGraph(AdjMGraph*G,DataTypeV[],intn,RowColWeightE[],inte)
inti,k;
Initiate(G,n);
InsertVertex(G,V[i]);
for(k=0;
k<
e;
k++)
InsertEdge(G,E[k].row,E[k].col,E[k].weight);
//队列初始化
voidQueueInitiate(SeqCQueue*Q)
Q->
rear=0;
front=0;
count=0;
//队列非空
intQueueNotEmpty(SeqCQueueQ)
if(Q.count!
=0)
//入队列
intQueueAppend(SeqCQueue*Q,DataTypex)
if((Q->
rear+1)%MaxSize==Q->
front)
printf("
队列已满!
queue[Q->
rear]=x;
rear=(Q->
rear+1)%MaxSize;
count++;
//出队列
intQueueDelete(SeqCQueue*Q,DataType*x)
if(Q->
front==Q->
rear)
队列是空的!
*x=Q->
front];
front=(Q->
front+1)%MaxSize;
count--;
//图的广度优先遍历函数
//连通图G以v为初始点访问操作为Visit()的广度优先遍历
//数组visited标记了相应结点是否已访问过,0表示未访问,1表示已访问
voidBroadFSearch(AdjMGraphG,intv,intvisited[],voidVisit(DataTypeitem))
DataTypeu,w;
SeqCQueuequeue;
Visit(G.Vertices.list[v]);
visited[v]=1;
QueueInitiate(&
queue);
QueueAppend(&
queue,v);
while(QueueNotEmpty(queue))
QueueDelete(&
queue,&
u);
w=GetFirstVex(G,u);
while(w!
=-1)
if(!
visited[w])
Visit(G.Vertices.list[w]);
visited[w]=-1;
queue,w);
w=GetNextVex(G,u,w);
//非连通图G访问操作为Visit()的广度优先遍历
voidBroadFirstSearch(AdjMGraphG,voidVisit(DataTypeitem))
inti;
int*visited=(int*)malloc(sizeof(int)*G.Vertices.size);
visited[i]=0;
for(i=0;
visited[i])
BroadFSearch(G,i,visited,Visit);
free(visited);
//定义访问操作的函数
voidVisit(DataTypeitem)
%c"
item);
//主函数
voidmain(void)
AdjMGraphg1;
DataTypea[]={'
1'
'
2'
3'
4'
5'
};
//图的结点
RowColWeightrcw[]={{0,1,1},{0,2,1},{0,3,1},{0,4,1},{1,0,1},{1,3,1},{2,0,1},{2,4,1},{3,0,1},{3,1,1},{4,0,1},{4,2,1}};
intn=5,e=12;
CreatGraph(&
g1,a,n,rcw,e);
//创图函数
结点集合为:
\n"
g1.Vertices.size;
g1.Vertices.list[i]);
权值集合为:
%5d"
g1.edge[i][j]);
\n广度优先搜索序列为:
BroadFirstSearch(g1,Visit);
四、实验结果及数据处理分析:
1、结果截图
2、结果分析
因为输入样本和输出样本与结果截图一样,程序又能运行,所以结果正确。
五、实验结论:
在实验中遇到一些概念模糊的知识点,并且这次的实验课堂没教,是老师在实验课上刚教的,因为坐的远,没看清听懂,所以很难写好,很多知识点都是靠旁边的同学指导和帮助完成的,所以下次一定要预习好。
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 广度 优先 搜索 实验 报告 郭治民