实验五图的基本操作.docx
- 文档编号:7014739
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:12
- 大小:56.73KB
实验五图的基本操作.docx
《实验五图的基本操作.docx》由会员分享,可在线阅读,更多相关《实验五图的基本操作.docx(12页珍藏版)》请在冰豆网上搜索。
实验五图的基本操作
实验五图的基本操作
一、实验目的
1、使学生可以巩固所学的有关图的基本知识。
2、熟练掌握图的存储结构。
3、熟练掌握图的两种遍历算法。
二、实验内容
本次实验提供4个题目,难度相当,学生可以根据自己的情况选做,其中题目一是必做题,其它选作!
√.题目一:
图的遍历(必做)
[问题描述]
对给定图,实现图的深度优先遍历和广度优先遍历。
[基本要求]
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
【测试数据】
由学生依据软件工程的测试技术自己确定。
题目二:
在图G中求一条从顶点i到顶点s的简单路径
[测试数据]
自行设计
[题目三]:
在图G中求一条从顶点i到顶点s且长度为K的简单路径
[测试数据]
自行设计
三、实验前的准备工作
1、掌握图的相关概念。
2、掌握图的逻辑结构和存储结构。
3、掌握图的两种遍历算法的实现。
四、实验报告要求
1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
5、实验步骤
(1)、数据结构与核心算法的设计描述
//邻接表创建图
intCreateGraph(Graph&G){
ArcNode*s;
cout<<"输入顶点和弧个数:
";
cin>>G.vernum>>G.arcnum;
cout<<"输入各顶点信息:
\n";
for(inti=0;i cin>>G.ver[i].data; G.ver[i].first=NULL; } cout<<"输入弧相关信息: \n"; for(intj=0;j for(intk=0;k intflag; cout< (1-存在/0-不存在)"; cin>>flag; if(flag==1){ s=newArcNode; s->adjver=k; s->next=G.ver[j].first; G.ver[j].first=s; s=newArcNode; s->adjver=j; s->next=G.ver[k].first; G.ver[k].first=s; } } } return0; } //深度优先搜索遍历 voidDFS(Graph&G,inti){ cout< visited[i]=true; ArcNode*p; p=G.ver[i].first; while(p){ if(! visited[p->adjver]) DFS(G,p->adjver); p=p->next; } } voidLengthTraval(Graph&G){ inti; for(i=0;i visited[i]=false; for(i=0;i if(! visited[i]) DFS(G,i); } //广度优先搜索遍历 voidBFS(Graph&G,intk){ inti; QueueQ; ArcNode*p; InitQueue(Q); cout< visited[k]=true; EnQueue(Q,k); while(Q.rear! =Q.front){ i=DelQueue(Q); p=G.ver[k].first; while(p){ if(! visited[p->adjver]){ cout< visited[p->adjver]=true; EnQueue(Q,p->adjver); } p=p->next; } } } voidBroadTraval(Graph&G){ inti; for(i=0;i visited[i]=false; for(i=0;i if(! visited[i]) BFS(G,i); } ㈡、函数调用及主函数设计 intmain(){ GraphG; menu(); intflag=1; while(flag){ intn; cout<<"输入操作编号: "; cin>>n; switch(n){ case1: CreateGraph(G);break; case2: LengthTraval(G);break; case3: BroadTraval(G);break; } intk; cout<<"是否继续? (1-继续/0-退出)"; cin>>k; flag=k; } return0; } ㈢程序调试及运行结果分析(应包含多组测试数据) 6、实验总结 这次实验,我真的懂得了好多东西。 我感觉自己有好多东西要学,自己现在的知识还很浅。 所以,我会好好努力的,继续加油。 程序清单: #include usingnamespacestd; #defineVERTEX_NUM10 typedefcharVerType; voidmenu(); boolvisited[VERTEX_NUM]; typedefstructArcNode{ intadjver;//弧指向顶点的位置 structArcNode*next;//指向下一条弧的指针 intinfo;//弧的相关信息指针 }ArcNode; typedefstructVerNode{ VerTypedata;//顶点元素 structArcNode*first;//指向第一条依附该顶点的弧 }VerNode,AdjList[VERTEX_NUM]; typedefstruct{ intvernum,arcnum;//顶点、弧数量 AdjListver;//顶点集合 intkind;//图的种类 }Graph; voidmenu(){ cout<<"|-------------------------------------------------|\n"; cout<<"|---****图的基本操作****---|\n"; cout<<"|---****1-创建图****---|\n"; cout<<"|---****2-深度优先遍历****---|\n"; cout<<"|---****3-广度优先遍历****---|\n"; cout<<"|-------------------------------------------------|\n"; } //邻接表创建图 intCreateGraph(Graph&G){ ArcNode*s; cout<<"输入顶点和弧个数: "; cin>>G.vernum>>G.arcnum; cout<<"输入各顶点信息: \n"; for(inti=0;i cin>>G.ver[i].data; G.ver[i].first=NULL; } cout<<"输入弧相关信息: \n"; for(intj=0;j for(intk=0;k intflag; cout< (1-存在/0-不存在)"; cin>>flag; if(flag==1){ s=newArcNode; s->adjver=k; s->next=G.ver[j].first; G.ver[j].first=s; s=newArcNode; s->adjver=j; s->next=G.ver[k].first; G.ver[k].first=s; } } } return0; } //深度优先搜索遍历 voidDFS(Graph&G,inti){ cout< visited[i]=true; ArcNode*p; p=G.ver[i].first; while(p){ if(! visited[p->adjver]) DFS(G,p->adjver); p=p->next;} } voidLengthTraval(Graph&G){ inti; for(i=0;i visited[i]=false; for(i=0;i if(! visited[i]) DFS(G,i); } //广度优先搜索遍历 typedefstruct{ intfront; intrear; intdata[VERTEX_NUM]; }Queue; //初始化 intInitQueue(Queue&Q){ Q.rear=Q.front=0; return0; } intEnQueue(Queue&Q,inte){ if((Q.rear-Q.front)<=VERTEX_NUM){ Q.data[Q.rear]=e; Q.rear=(Q.rear+1)%VERTEX_NUM; } return0; } intDelQueue(Queue&Q){ intt; if(Q.rear==Q.front)return0; else{ t=Q.data[Q.front]; Q.front=(Q.front+1)%VERTEX_NUM; returnt; } } voidBFS(Graph&G,intk){ inti; QueueQ; ArcNode*p; InitQueue(Q); cout< visited[k]=true; EnQueue(Q,k); while(Q.rear! =Q.front){ i=DelQueue(Q); p=G.ver[k].first; while(p){ if(! visited[p->adjver]){ cout< visited[p->adjver]=true; EnQueue(Q,p->adjver); } p=p->next; } } } voidBroadTraval(Graph&G){ inti; for(i=0;i visited[i]=false; for(i=0;i if(! visited[i]) BFS(G,i); } intmain(){ GraphG; menu(); intflag=1; while(flag){ intn; cout<<"输入操作编号: "; cin>>n; switch(n){ case1: CreateGraph(G);break; case2: { cout<<"深度优先遍历结果: \n"; LengthTraval(G);}break; case3: { cout<<"广度优先遍历结果: \n"; BroadTraval(G);}break; } intk; cout<<"是否继续? (1-继续/0-退出)"; cin>>k; flag=k; } return0; } 流程图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验五 图的基本操作 实验 基本 操作