数据结构的图的广度优先搜索实验报告郭治民.docx

上传人:b****5 文档编号:4277618 上传时间:2022-11-28 格式:DOCX 页数:16 大小:119.24KB
下载 相关 举报
数据结构的图的广度优先搜索实验报告郭治民.docx_第1页
第1页 / 共16页
数据结构的图的广度优先搜索实验报告郭治民.docx_第2页
第2页 / 共16页
数据结构的图的广度优先搜索实验报告郭治民.docx_第3页
第3页 / 共16页
数据结构的图的广度优先搜索实验报告郭治民.docx_第4页
第4页 / 共16页
数据结构的图的广度优先搜索实验报告郭治民.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数据结构的图的广度优先搜索实验报告郭治民.docx

《数据结构的图的广度优先搜索实验报告郭治民.docx》由会员分享,可在线阅读,更多相关《数据结构的图的广度优先搜索实验报告郭治民.docx(16页珍藏版)》请在冰豆网上搜索。

数据结构的图的广度优先搜索实验报告郭治民.docx

数据结构的图的广度优先搜索实验报告郭治民

深圳大学实验报告

 

课程名称:

数据结构实验与课程设计

实验项目名称:

图的广度优先搜索

学院:

计算机与软件学院

专业:

计算机科学与技术

********

报告人:

郭治民学号:

**********班级:

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;i

for(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;col

if(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;col

if(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;i

InsertVertex(G,V[i]);

for(k=0;k

InsertEdge(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;i

visited[i]=0;

for(i=0;i

if(!

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;i

printf("%c",g1.Vertices.list[i]);

printf("\n");

printf("\n");

printf("权值集合为:

\n");

for(i=0;i

{

for(j=0;j

printf("%5d",g1.edge[i][j]);

printf("\n");

}

printf("\n广度优先搜索序列为:

\n");

BroadFirstSearch(g1,Visit);

printf("\n");

}

四、实验结果及数据处理分析:

1、结果截图

2、结果分析

因为输入样本和输出样本与结果截图一样,程序又能运行,所以结果正确。

五、实验结论:

在实验中遇到一些概念模糊的知识点,并且这次的实验课堂没教,是老师在实验课上刚教的,因为坐的远,没看清听懂,所以很难写好,很多知识点都是靠旁边的同学指导和帮助完成的,所以下次一定要预习好。

指导教师批阅意见:

成绩评定:

指导教师签字:

年月日

备注:

注:

1、报告内的项目或内容设置,可根据实际情况加以调整和补充。

2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

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

当前位置:首页 > 医药卫生 > 预防医学

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

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