#define M 20
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
typedef struct{/*定义图*/
int V[M];
int R[M][M];
int vexnum;
}Graph;
void creatgraph(Graph *g,int n){/*创建图*/
int i,j,r1,r2;
g->vexnum=n;
for(i=1;i<=n;i++)/*顶点用i表示*/
{
g->V[i]=i;
}
for(i=1;i<=n;i++)/*初始化R*/
for(j=1;j<=n;j++)
{
g->R[i][j]=0;
}
printf("Please input R(0,0 END):\n");/*输入R*/ scanf("%d,%d",&r1,&r2);
while(r1!=0&&r2!=0)
{
g->R[r1][r2]=1;
g->R[r2][r1]=1;
scanf("%d,%d",&r1,&r2);
}
}
void printgraph(Graph *g){/*打印图的邻接矩阵*/
int i,j;
for(i=1;i<=g->vexnum;i++)
{ for(j=1;j<=g->vexnum;j++)
{
printf("%2d ",g->R[i][j]);
}
printf("\n");
}
}
int visited[M];/*全局变量:访问标志数组*/
void visitvex(Graph *g,int vex){/*访问顶点*/
printf("%d ",g->V[vex]);
}
int firstadjvex(Graph *g,int vex){/*获取第一个未被访问的邻接节点*/ int w,i;
for(i=1;i<=g->vexnum;i++)
{
if(g->R[vex][i]==1&&visited[i]==0)
{
w=i;
break;
}
else
{
w=0;
}
}
return w;
}
int nextadjvex(Graph *g,int vex,int w){/*获取下一个未被访问的邻接节点*/
int t;
t=firstadjvex(g,w);
return t;
}
void DFS(Graph *g,int vex){/*深度递归遍历*/
int w;
visited[vex]=1;
visitvex(g,vex);
for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))
if(!visited[w])
{
DFS(g,w);
}
}
void DFSTraverse(Graph *g){/*深度遍历*/
int i;
for(i=1;i<=g->vexnum;i++)
visited[i]=0;
for(i=1;i<=g->vexnum;i++)
if(!visited[i])
{
DFS(g,i);
}
}
typedef struct{/*定义队列*/
int V[M];
int front;
int rear;
}queue;
void Initqueue(Queue *q){/*初始化队列*/
q->front=0;
q->rear=0;
}
int Quempty(Queue *q){/*判断队列是否为空*/ if(q->front==q->rear)
{
return 0;
}
else
{
return 1;
}
}
Enqueue(Queue *q,int e){/*入队操作*/
if((q->rear+1)%M==q->front)
{
printf("The queue is overflow!\n");
return 0;
}
else
{
q->V[q->rear]=e;
q->rear=(q->rear+1)%M;
return 1;
}
}
Dequeue(Queue *q){/*出队操作*/
int t;
if(q->front==q->rear)
{
printf("The queue is empty!\n");
return 0;
}
else
{
t=q->V[q->front];
q->front=(q->front+1)%M;
return t;
}
}
void BFSTraverse(Graph *g){/*广度遍历*/
int i;
queue *q=(Queue *)malloc(sizeof(Queue)); for(i=1;i<=g->vexnum;i++)
{
visited[i]=0;
}
Initqueue(q);
for(i=1;i<=g->vexnum;i++)
{
if(!visited[i])
{
visited[i]=1;
visitvex(g,g->V[i]);
Enqueue(q,g->V[i]);
while(!Quempty(q))
{
int u,w;
u=Dequeue(q);
for(w=firstadjvex(g,u);w>0;w=nextadjvex(g,u,w))
{
if(!visited[w])
{
visited[w]=1;
visitvex(g,w);
Enqueue(q,w);
}
}
}
}
}
}
int main()/*主程序*/
{
int n;
Graph *g=(Graph *)malloc(sizeof(Graph));
char menu;
printf("Please input the number of vertex:\n");
scanf("%d",&n);
creatgraph(g,n);
printf("This is the linjiejuzhen of graph:\n");
printgraph(g);
input:
printf("Please input B or D or Q ,Breadth_first: B Depth_first: D quit: Q\n");
while((menu=getchar())=='\n');
if(menu=='B')
{
printf("Breadth_first:\n");
BFSTraverse(g);
printf("\n");
goto input;
}
else if(menu=='D')
{
printf("Depth_first:\n");
DFSTraverse(g);
printf("\n");
goto input;
}
else if(menu=='Q')
{
exit(0);
}
else
{
printf("Input error!Please input B or D!\n"); }
return 0;
}
本文档为【无向图的深度优先和广度优先遍历】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。