图的遍历演示.docx
《图的遍历演示.docx》由会员分享,可在线阅读,更多相关《图的遍历演示.docx(6页珍藏版)》请在冰豆网上搜索。
图的遍历演示
图的遍历演示
【设计目的】理解图的基本概念,熟悉图的各种存储结构及其构造算法。
掌握图的遍历方法。
【设计内容】实现图的深度优先、广度优先遍历算法,并输出原图结构及遍历结果
。
【设计要求】两种遍历方法必须都要实现,写出画图的思路。
函数功能要划分合理。
总体设计应画一流程图。
程序要加必要的注释。
提供程序测试方案。
#include
//#include
#defineINFINITY32767
#defineMAX_VEX20//最大顶点个数
#defineQUEUE_SIZE(MAX_VEX+1)//队列长度
usingnamespacestd;
bool*visited;//访问标志数组
//图的邻接矩阵存储结构
typedefstruct{
char*vexs;//顶点向量
intarcs[MAX_VEX][MAX_VEX];//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧数
}Graph;
//队列类
classQueue{
public:
voidInitQueue(){
base=(int*)malloc(QUEUE_SIZE*sizeof(int));
front=rear=0;
}
voidEnQueue(inte){
base[rear]=e;
rear=(rear+1)%QUEUE_SIZE;
}
voidDeQueue(int&e){
e=base[front];
front=(front+1)%QUEUE_SIZE;
}
public:
int*base;
intfront;
intrear;
};
//图G中查找元素c的位置
intLocate(GraphG,charc){
for(inti=0;iif(G.vexs[i]==c)returni;
return-1;
}
//创建无向网
voidCreateUDN(Graph&G){
inti,j,w,s1,s2;
chara,b,temp;
printf("输入顶点数和弧数:
");
scanf("%d%d",&G.vexnum,&G.arcnum);
temp=getchar();//接收回车
G.vexs=(char*)malloc(G.vexnum*sizeof(char));//分配顶点数目
printf("输入%d个顶点.\n",G.vexnum);
for(i=0;iprintf("输入顶点%d:
",i);
scanf("%c",&G.vexs[i]);
temp=getchar();//接收回车
}
for(i=0;ifor(j=0;jG.arcs[i][j]=INFINITY;
printf("输入%d条弧.\n",G.arcnum);
for(i=0;iprintf("输入弧%d:
",i);
scanf("%c%c%d",&a,&b,&w);//输入一条边依附的顶点和权值
temp=getchar();//接收回车
s1=Locate(G,a);
s2=Locate(G,b);
G.arcs[s1][s2]=G.arcs[s2][s1]=w;
}
}
//图G中顶点k的第一个邻接顶点
intFirstVex(GraphG,intk){
if(k>=0&&kfor(inti=0;iif(G.arcs[k][i]!
=INFINITY)returni;
}
return-1;
}
//图G中顶点i的第j个邻接顶点的下一个邻接顶点
intNextVex(GraphG,inti,intj){
if(i>=0&&i=0&&jfor(intk=j+1;kif(G.arcs[i][k]!
=INFINITY)returnk;
}
return-1;
}
//深度优先遍历
voidDFS(GraphG,intk){
inti;
if(k==-1){//第一次执行DFS时,k为-1
for(i=0;iif(!
visited[i])DFS(G,i);//对尚未访问的顶点调用DFS
}
else{
visited[k]=true;
printf("%c",G.vexs[k]);//访问第k个顶点
for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))
if(!
visited[i])DFS(G,i);//对k的尚未访问的邻接顶点i递归调用DFS
}
}
//广度优先遍历
voidBFS(GraphG){
intk;
QueueQ;//辅助队列Q
Q.InitQueue();
for(inti=0;iif(!
visited[i]){//i尚未访问
visited[i]=true;
printf("%c",G.vexs[i]);
Q.EnQueue(i);//i入列
while(Q.front!
=Q.rear){
Q.DeQueue(k);//队头元素出列并置为k
for(intw=FirstVex(G,k);w>=0;w=NextVex(G,k,w))
if(!
visited[w]){//w为k的尚未访问的邻接顶点
visited[w]=true;
printf("%c",G.vexs[w]);
Q.EnQueue(w);
}
}
}
}
//主函数
voidmain(){
inti;
GraphG;
CreateUDN(G);
visited=(bool*)malloc(G.vexnum*sizeof(bool));
printf("\n广度优先遍历:
");
for(i=0;ivisited[i]=false;
DFS(G,-1);
printf("\n深度优先遍历:
");
for(i=0;ivisited[i]=false;
BFS(G);
printf("\n程序结束.\n");
}
输出结果为(红色为键盘输入的数据,权值都置为1):
输入顶点数和弧数:
89
输入8个顶点.
输入顶点0:
a
输入顶点1:
b
输入顶点2:
c
输入顶点3:
d
输入顶点4:
e
输入顶点5:
f
输入顶点6:
g
输入顶点7:
h
输入9条弧.
输入弧0:
ab1
输入弧1:
bd1
输入弧2:
be1
输入弧3:
dh1
输入弧4:
eh1
输入弧5:
ac1
输入弧6:
cf1
输入弧7:
cg1
输入弧8:
fg1
广度优先遍历:
abdhecfg
深度优先遍历:
abcdefgh
程序结束.