图的深度遍历与广度遍历
- 格式:docx
- 大小:31.88 KB
- 文档页数:5
图的深度遍历和广度遍历程序源代码如下:
#include"stdio.h"
#include"stdlib.h"
#define MAXQSIZE 100
#define MVNum 100
int visited[100];
typedef struct
{
char *base;
int front;
int rear;
}SqQueue;
int InitQueue(SqQueue &Q) //初始化队列
{
Q.base=new char[MAXQSIZE];
if(!Q.base)
exit(-1); //存储失败
Q.front=Q.rear=0; //队列为空
return 1;
}
int QueueEmpty(SqQueue &Q) //判断队非空
{
if(Q.front==Q.rear)
return 0;
return 1;
}
int EnQueue(SqQueue &Q,char e) //入队
{
if((Q.rear+1)%MAXQSIZE==Q.front) //队满
return 0;
Q.base[Q.rear]=e; //新元素插入队尾
Q.rear=(Q.rear+1)%MAXQSIZE; //队尾指针加1
return 1;
}
int DeQueue(SqQueue &Q,char &e) //出队
{
if(Q.front==Q.rear)
return 0; //队空
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return 1;
}
int GetHead(SqQueue Q) //取队头元素{
if(Q.front!=Q.rear)
return Q.base[Q.front];
}
typedef struct //定义图
{
char vexs[MVNum];
int arcs[MVNum][MVNum];
int vexnum,arcnum;
}AMGraph;
int LocateVex(AMGraph G,char u)
{
int i;
for(i=0;i<G.vexnum;++i)
if(u==G.vexs[i])
return i;
return -1;
}
int CreateUDN(AMGraph &G) //创建图{
int i,j,k;
char v1,v2;
printf("输入顶点个数和边的个数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
getchar();
printf("请输入图:\n");
for(i=0;i<G.vexnum;++i)
scanf("%c",&G.vexs[i]);
getchar();
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
G.arcs[i][j]=0;
for(k=0;k<G.arcnum;++k)
{
scanf("%c%c",&v1,&v2);
getchar();
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j]=1;
G.arcs[j][i]=G.arcs[i][j];
}
return 1;
}
void DFS(AMGraph G,int v) //深度遍历图{
int w;
printf("%c",G.vexs[v]);
visited[v]=1;
for(w=0;w<G.vexnum;w++)
if((G.arcs[v][w]!=0)&&(!visited[w]))
DFS(G,w);
}
void DFSTraverse(AMGraph G)
{
int v;
for(v=0;v<G.vexnum;++v)
visited[v]=0;
for(v=0;v<G.vexnum;++v)
if(!visited[v])
DFS(G,v);
}
void BFS(AMGraph G,int v) //广度遍历
{
int w;
SqQueue Q;
printf("%c",G.vexs[v]); //访问第v个顶点
visited[v]=1;
InitQueue(Q); //初始化队列,置空
EnQueue(Q,v); //v进队
char u=GetHead(Q);
while(!QueueEmpty(Q)) //队列非空
{
DeQueue(Q,u); //队头元素出队,置为u
for(w=0;w<G.vexs[v];w++)
if(visited[w])
{
scanf("%d",&w);
visited[w]=1;
EnQueue(Q,w); //w进队
}
}
}
void BFSTraverse(AMGraph G)
{
int v;
for(v=0;v<G.vexnum;++v)
visited[v]=0;
for(v=0;v<G.vexnum;++v)
if(!visited[v])
BFS(G,v);
}
main()
{
AMGraph G;
CreateUDN(G);
printf("深度遍历结果:\n");
DFSTraverse(G);
printf("\n广度遍历结果:\n");
BFSTraverse(G);
printf("\n");
}
深度遍历结果:abdecfg 广度遍历结果:abcdefg。