图的遍历演示.docx

上传人:b****6 文档编号:4686384 上传时间:2022-12-07 格式:DOCX 页数:6 大小:15.77KB
下载 相关 举报
图的遍历演示.docx_第1页
第1页 / 共6页
图的遍历演示.docx_第2页
第2页 / 共6页
图的遍历演示.docx_第3页
第3页 / 共6页
图的遍历演示.docx_第4页
第4页 / 共6页
图的遍历演示.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

图的遍历演示.docx

《图的遍历演示.docx》由会员分享,可在线阅读,更多相关《图的遍历演示.docx(6页珍藏版)》请在冰豆网上搜索。

图的遍历演示.docx

图的遍历演示

图的遍历演示

【设计目的】理解图的基本概念,熟悉图的各种存储结构及其构造算法。

掌握图的遍历方法。

【设计内容】实现图的深度优先、广度优先遍历算法,并输出原图结构及遍历结果

【设计要求】两种遍历方法必须都要实现,写出画图的思路。

函数功能要划分合理。

总体设计应画一流程图。

程序要加必要的注释。

提供程序测试方案。

 

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

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

printf("输入顶点%d:

",i);

scanf("%c",&G.vexs[i]);

temp=getchar();//接收回车

}

for(i=0;i

for(j=0;j

G.arcs[i][j]=INFINITY;

printf("输入%d条弧.\n",G.arcnum);

for(i=0;i

printf("输入弧%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&&k

for(inti=0;i

if(G.arcs[k][i]!

=INFINITY)returni;

}

return-1;

}

//图G中顶点i的第j个邻接顶点的下一个邻接顶点

intNextVex(GraphG,inti,intj){

if(i>=0&&i=0&&j

for(intk=j+1;k

if(G.arcs[i][k]!

=INFINITY)returnk;

}

return-1;

}

//深度优先遍历

voidDFS(GraphG,intk){

inti;

if(k==-1){//第一次执行DFS时,k为-1

for(i=0;i

if(!

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

if(!

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

visited[i]=false;

DFS(G,-1);

printf("\n深度优先遍历:

");

for(i=0;i

visited[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

程序结束.

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

当前位置:首页 > 高中教育 > 理化生

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

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