实验五图的基本操作.docx
《实验五图的基本操作.docx》由会员分享,可在线阅读,更多相关《实验五图的基本操作.docx(12页珍藏版)》请在冰豆网上搜索。
![实验五图的基本操作.docx](https://file1.bdocx.com/fileroot1/2023-1/9/db57b4dd-f85b-49de-8720-b9f2f4132542/db57b4dd-f85b-49de-8720-b9f2f41325421.gif)
实验五图的基本操作
实验五图的基本操作
一、实验目的
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;icin>>G.ver[i].data;
G.ver[i].first=NULL;
}
cout<<"输入弧相关信息:
\n";
for(intj=0;jfor(intk=0;kintflag;
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;ivisited[i]=false;
for(i=0;iif(!
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<adjver].data;
visited[p->adjver]=true;
EnQueue(Q,p->adjver);
}
p=p->next;
}
}
}
voidBroadTraval(Graph&G){
inti;
for(i=0;ivisited[i]=false;
for(i=0;iif(!
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;icin>>G.ver[i].data;
G.ver[i].first=NULL;
}
cout<<"输入弧相关信息:
\n";
for(intj=0;jfor(intk=0;kintflag;
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;ivisited[i]=false;
for(i=0;iif(!
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<adjver].data;
visited[p->adjver]=true;
EnQueue(Q,p->adjver);
}
p=p->next;
}
}
}
voidBroadTraval(Graph&G){
inti;
for(i=0;ivisited[i]=false;
for(i=0;iif(!
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;
}
流程图