数据结构试验报告DFS和BFS算法.docx
- 文档编号:6855374
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:11
- 大小:68.80KB
数据结构试验报告DFS和BFS算法.docx
《数据结构试验报告DFS和BFS算法.docx》由会员分享,可在线阅读,更多相关《数据结构试验报告DFS和BFS算法.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构试验报告DFS和BFS算法
.
纸折叠)A3A4纸或(规格为
佛山科学技术学院(用四号宋体)实验报告(用小二号黑体)
课程名称数据结构实验
实验项目实现DFS和BFS算法
专业班级姓名学号
指导教师成绩日期
(用小四号宋体)
一、目的与要求
1、通过本实验,掌握图,无向图的基本概念,掌握图的遍历。
2、掌握图的深度优先搜索(DFS)与广度优先搜索(BFS)算法。
二、实验原理
图的遍历是图的算法中一种非常重要的算法,通过建立图的存储结构,采用深度优先搜索与广度优先搜索算法可以进行图的遍历。
广度优先遍历与深度优先遍历的区别在于:
广度优先遍历是以层为顺序,将某一层上的所有节点都搜索到了之后才向下一层搜索;而深度优先遍历是将某一条枝桠上的所有节点都搜索到了之后,才转向搜索另一条枝桠上的所有节点。
三、实验步骤
1.建立图的存储结构。
2.输入图的基本接点与信息,完成初始化图的工作。
3.完成图的深度优先搜索(DFS)和广度优先搜索算法,可以采用菜单形式进行显示与选择。
(可以在键盘输入边的信息以构建一个无向图。
以(a,b)的形式输入边的信息;对此无向图进行深度优先搜索,并输出正确的序列。
)
四、源代码
#include
#include
#defineMax20
intvisited[Max];
structqueue//队列的结构体
{
int*head;//指向所申请得到的空间的首地址
int*front;//头指针,若队列不为空,指向队列头元素
int*rear;//尾指针,若队列不空,指向队列尾元素的下一个位置
intstacksize;//当前已分配的存储空间
}s;
//------------图的数组存储表示-------------
structMgraph
{
charvexs[Max];
intarcs[Max][Max];
'.
.
intvexnum,arcnum;
}G;
G中的位置intLocatevex(charv)//确定v在{
inti,t;
for(i=0;i if(G.vexs[i]==v)t=i; return(t); } G-------------//-----------采用数组表示法,构造无向图voidCreateUDG() { inti,j,k; charv1,v2; );请输入顶点数和弧数: 牰湩晴尨scanf(%d,%d,&G.vexnum,&G.arcnum); fflush(stdin); \n,G.vexnum);个顶点牰湩晴尨请输入%d for(i=0;i { %d: i);请输入顶点牰湩晴尨 scanf(%c,&G.vexs[i]); fflush(stdin); } for(i=0;i for(j=0;j \n,G.arcnum);%d条弧牰湩晴尨请输入for(k=0;k { %d: k);请输入弧牰湩晴尨scanf(%c,%c,&v1,&v2); fflush(stdin); i=Locatevex(v1); j=Locatevex(v2); G.arcs[i][j]=1; G.arcs[j][i]=1; } } -------------------v返回的第一个邻接顶点//--------------intFirstadjvex(intv) { inti; for(i=0;i if(G.arcs[v][i]==1)return(i); i=-1; return(i); '. . } ----------------------w的)下一个邻接顶点的(相对于//----------返回vintNextadjvex(intv,intw) { inti; for(i=0;i if(G.arcs[v][i]==1&&i>w)return(i); i=-1; return(i); } G---------------个顶点出发递归地深度优先遍历图//--------从第vvoidDFS(intv) { intw; visited[v]=1; printf(%c,G.vexs[v]); for(w=Firstadjvex(v);w>=0;w=Nextadjvex(v,w)) if(! visited[w])DFS(w); } --------------作深度优先遍历对图G//-----------------voidDfstraverse() { inti; for(i=0;i );牰湩晴尨深度优先遍历: for(i=0;i if(! visited[i])DFS(i); printf(\ ); } s构造一个空队列voidInitqueue()//{ s.head=(int*)malloc(Max*sizeof(int)); 存储分配失败if(! s.head)exit(0);//s.front=s.rear=s.head; s.stacksize=Max; } s的新的队尾元素voidEnqueue(inte)//插入元素e为{ if(s.rear-s.head+1>=s.stacksize) 队列满,追加存储空间{//s.head=(int*)realloc(s.head,(s.stacksize+10)*sizeof(int)); if(! s.head)exit(0);//存储分配失败 s.stacksize+=10; } *s.rear=e; s.rear+=1; '. . } 的队头元素若队列不空,则删除svoidDequeue(intu)//{ u=*s.front; s.front+=1; } G------------------按广度优先非递归遍历图//---------------voidBfstraverse() { intv,u=0,w; for(v=0;v Initqueue(); );牰湩晴尨广度优先遍历: for(v=0;v if(! visited[v]) { visited[v]=1; printf(%c,G.vexs[v]); Enqueue(v); while(s.front! =s.rear) { Dequeue(u); for(w=Firstadjvex(u);w>=0;w=Nextadjvex(u,w)) if(! visited[w]) { visited[w]=1; printf(%c,G.vexs[w]); Enqueue(w); } } } printf(\ ); } voidmain() { inti; *******************************************\n);(printf\n);退出广度优先搜索深度优先搜索\n3.\n4.创图printf(.\n2.printf(*******************************************\n); );请选择要操作的选项: 牰湩晴尨scanf(%d,&i); switch(i) { case1: CreateUDG();break; case2: Dfstraverse();break; case3: Bfstraverse();break; '. . case4: exit(0); } main(); } 五、实验结果 '. . 六、思考题.图的存储方式有几种? 本实验中你会采用什么样的存储方式? 1种常用存储方式。 十字链表、邻接多重表等4答: 图的存储方式有数组表示法、邻接表、本实验中我采用了数组表示法存储。 ,E(G)={(v1v8},,v6,v7,,G如下: V(G)={v1,v2,v3,v4v52、给出一幅无向图})(v2,v8(v1,v8),,v5),(v3,v6),(v3,v7),v2),(vl,v3)(v2,v4),(v2,)请画出示意图;1)请根据你采用的存储方式画出存储图示;2的基础上,请给出图的深度优先搜索序列;)在题目23的基础上,请给出图的广度优先搜索序列。 )在题目24)(1解: v4 v1v2v6 v5 v3 v8 v7 (2) 7 5623401 100000v1011 101v21 010010101010v32 0 000v4100003 0v500004 0010005 0v60001 0000006 0v71 0 0010007 1v8 abdehcfg (3)深度优先搜索序列: abchdefg 广度优先搜索序列: (4) : 一、实验目的;二、实验原理;三、实验步骤;四、实验结果;五、讨论分析、实验报告的内容注: 1(完成指定的思考题和作业题);六、改进实验建议。 '. . 2、各专业可在满足学校对实验教学基本要求的前提下,根据专业特点自行设计实验报告的格式,所设 计的实验报告在使用前需交实践教学管理科备案。 '.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 试验报告 DFS BFS 算法