最近学了图的广度和深度优先遍历,但是广度比深度要麻烦一些,用到了队列,我就完全的按自己的思路写了一段很长的代码,看了一些大神写的,但其实可以比较简单,其实图也有多种表示方式,所以各个代码会有不同,下面给出我的程序。
#include<stdio.h>
#include<stdlib.h>
#define maxn 100
#define maxsize 100
typedef struct qnode * Queue;
typedef struct node * Gragh;
int visited[maxn];
struct qnode
{
int data[maxsize];
int front;
int rear;
};
struct node
{
int Nv;
int Ne;
int G[maxn][maxn];
};
Queue Createqueue()
{
Queue Q=(Queue)malloc(sizeof(struct qnode));
Q->front=Q->rear=0;
return Q;
}
void Insertqueue(Queue Q,int x)
{
if((Q->rear+1)%maxsize==Q->front)
printf("Full!");
else
{
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%maxsize;
}
}
int Deletequeue(Queue Q)
{
int temp;
if(Q->front==Q->rear)
return 0;
else
{
temp=Q->data[Q->front];
Q->front=(Q->front+1)%maxsize;
}
return temp;
}
Gragh Creategragh()
{
int i,j,v,e,k,m;
Gragh T=(Gragh)malloc(sizeof(struct node));
printf("请输入顶点:");
scanf("%d",&v); //顶点
printf("请输入边:");
scanf("%d",&e); //边
T->Nv=v;
T->Ne=e;
for(i=0;i<T->Nv;i++)
for(j=0;j<T->Nv;j++)
T->G[i][j]=0;
for(i=0;i<T->Ne;i++)
{
scanf("%d %d",&k,&m); //无权重的边,且为无向图
T->G[k][m]=1;
T->G[m][k]=1;
}
return T;
}
void bfs(Gragh g,int x,Queue Q)
{
int i,temp;
visited[x]=1;
Insertqueue(Q,x);
while(Q->front!=Q->rear)
{
temp=Deletequeue(Q);
printf("正在遍历%d个顶点\n",temp);
for(i=0;i<g->Nv;i++)
{
if(g->G[i][temp]!=0&&visited[i]==0)
{
visited[i]=1;
Insertqueue(Q,i);
}
}
}
}
int main()
{
int i;
Queue Q=Createqueue();
Gragh gragh=Creategragh();
for(i=0;i<gragh->Nv;i++)
visited[i]=0;
bfs(gragh,0,Q);
return 0;
}
这是我自己画的一个图,然后输入进入,根据程序的结果,比较一下感受广度优先遍历的过程。(很抱歉上面的图中0到4还有个线段没画出。)下面的程序运行情况上面部分也没有显示完全。