数据结构的图的广度优先搜索实验报告郭治民.docx
《数据结构的图的广度优先搜索实验报告郭治民.docx》由会员分享,可在线阅读,更多相关《数据结构的图的广度优先搜索实验报告郭治民.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构的图的广度优先搜索实验报告郭治民
深圳大学实验报告
课程名称:
数据结构实验与课程设计
实验项目名称:
图的广度优先搜索
学院:
计算机与软件学院
专业:
计算机科学与技术
********
报告人:
郭治民学号:
**********班级:
3
实验时间:
2012-11-05
实验报告提交时间:
2012-11-06
教务部制
一、实验目的与要求:
1、实验目的
掌握图结构的说明、创建以及图的存储表示(邻接表)
掌握队列的定义、插入、删除、清空、判空方式
掌握广度优先搜索算法原理
掌握广度优先搜索算法的编程实现方法
2、实验要求
熟悉C++语言编程
熟悉队列的操作原理
图的存储表示
熟悉广度优先搜索算法原理
熟练使用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"
#include"stdlib.h"
typedefcharDataType;
#defineMaxSize100
#defineMaxVertices10
#defineMaxEdges100
#defineMaxWeight10000
typedefstruct
{
DataTypelist[MaxSize];
intsize;
}SeqList;
typedefstruct
{
DataTypequeue[MaxSize];
intrear;
intfront;
intcount;
}SeqCQueue;
typedefstruct
{
introw;
intcol;
intweight;
}RowColWeight;
typedefstruct
{
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)
{
printf("参数i不合法!
\n");
return0;
}
else
{
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
L->list[i]=x;
L->size++;
return1;
}
}
//图G初始化
voidInitiate(AdjMGraph*G,intn)
{
inti,j;
for(i=0;ifor(j=0;j{
if(i==j)
G->edge[i][j]=0;
else
G->edge[i][j]=MaxWeight;
}
G->numOfEdges=0;//边的条数数置为0
ListInitiate(&G->Vertices);//顺序表初始化
}
//在图G中插入结点vertex
voidInsertVertex(AdjMGraph*G,DataTypevertex)
{
ListInsert(&G->Vertices,G->Vertices.size,vertex);
}
//在图G中插入边
voidInsertEdge(AdjMGraph*G,intv1,intv2,intweight)
{
if(v1<0||v2>G->Vertices.size||v2<0||v1>G->Vertices.size)
{
printf("参数v1或v2越界出错!
\n");
exit
(1);
}
G->edge[v1][v2]=weight;
G->numOfEdges++;
}
//在图G中寻找序号为v的结点的第一个邻接结点
intGetFirstVex(AdjMGraphG,intv)
{
intcol;
if(v<0||v>G.Vertices.size)
{
printf("参数v1越界出错!
\n");
exit
(1);
}
for(col=0;colif(G.edge[v][col]>0&&G.edge[v][col]returncol;
return-1;
}
//在图G中寻找v1结点的邻接结点v2的下一个邻接结点
intGetNextVex(AdjMGraphG,intv1,intv2)
{
intcol;
if(v1<0||v1>G.Vertices.size||v2<0||v2>G.Vertices.size)
{
printf("参数v1或v2越界出错!
\n");
exit
(1);
}
for(col=v2+1;colif(G.edge[v1][col]>0&&G.edge[v1][col]returncol;
return-1;
}
//在图G中插入n个结点信息V和e条边信息E(创图函数)
voidCreatGraph(AdjMGraph*G,DataTypeV[],intn,RowColWeightE[],inte)
{
inti,k;
Initiate(G,n);
for(i=0;iInsertVertex(G,V[i]);
for(k=0;kInsertEdge(G,E[k].row,E[k].col,E[k].weight);
}
//队列初始化
voidQueueInitiate(SeqCQueue*Q)
{
Q->rear=0;
Q->front=0;
Q->count=0;
}
//队列非空
intQueueNotEmpty(SeqCQueueQ)
{
if(Q.count!
=0)
return1;
else
return0;
}
//入队列
intQueueAppend(SeqCQueue*Q,DataTypex)
{
if((Q->rear+1)%MaxSize==Q->front)
{
printf("队列已满!
\n");
exit
(1);
}
Q->queue[Q->rear]=x;
Q->rear=(Q->rear+1)%MaxSize;
Q->count++;
return1;
}
//出队列
intQueueDelete(SeqCQueue*Q,DataType*x)
{
if(Q->front==Q->rear)
{
printf("队列是空的!
\n");
exit
(1);
}
*x=Q->queue[Q->front];
Q->front=(Q->front+1)%MaxSize;
Q->count--;
return1;
}
//图的广度优先遍历函数
//连通图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;
QueueAppend(&queue,w);
}
w=GetNextVex(G,u,w);
}
}
}
//非连通图G访问操作为Visit()的广度优先遍历
voidBroadFirstSearch(AdjMGraphG,voidVisit(DataTypeitem))
{
inti;
int*visited=(int*)malloc(sizeof(int)*G.Vertices.size);
for(i=0;ivisited[i]=0;
for(i=0;iif(!
visited[i])
BroadFSearch(G,i,visited,Visit);
free(visited);
}
//定义访问操作的函数
voidVisit(DataTypeitem)
{
printf("%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;
inti,j;
CreatGraph(&g1,a,n,rcw,e);//创图函数
printf("结点集合为:
\n");
for(i=0;iprintf("%c",g1.Vertices.list[i]);
printf("\n");
printf("\n");
printf("权值集合为:
\n");
for(i=0;i{
for(j=0;jprintf("%5d",g1.edge[i][j]);
printf("\n");
}
printf("\n广度优先搜索序列为:
\n");
BroadFirstSearch(g1,Visit);
printf("\n");
}
四、实验结果及数据处理分析:
1、结果截图
2、结果分析
因为输入样本和输出样本与结果截图一样,程序又能运行,所以结果正确。
五、实验结论:
在实验中遇到一些概念模糊的知识点,并且这次的实验课堂没教,是老师在实验课上刚教的,因为坐的远,没看清听懂,所以很难写好,很多知识点都是靠旁边的同学指导和帮助完成的,所以下次一定要预习好。
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。