广度优先搜索.cpp
#include<stdio.h>
#include<stdio.h>
#include<malloc.h>
#define MAX 30
typedef enum{DG,DN,UDG,UDN} Graphkind;
typedef struct arccell //定义表示弧的邻接矩阵
{
int adj;
int *info; //弧的相关信息
}arccell,adjmatrix[MAX][MAX];
typedef struct //定义一个图类型
{
int vexs[MAX];
adjmatrix arcs;
int vexnum,arcnum;
Graphkind kind;
}mgraph;
int visited[MAX]={0};
typedef struct queue //队列的存储结构
{
int *front; //队头
int *rear;
int queuesize;
}squeue;
void initqueue(squeue &q)//初始化队列
{
q.rear=q.front=(int *)malloc(MAX*sizeof(int));
q.queuesize=0;
}
void inqueue(squeue &q,int e)//入队
{
*(q.front)=e;
q.front++;
q.queuesize++;
}
void outqueue(squeue &q,int &e)//出队
{
e=*(q.rear);
q.rear++;
q.queuesize--;
}
void BFS(mgraph &g)
{
int j,i=0;
squeue q;
initqueue(q);
printf("广度优先访问:%d/n",g.vexs[i]);
visited[i]=1;
inqueue(q,i);
while(q.queuesize!=0)
{
outqueue(q,i);
for(j=0;j<g.vexnum;++j)
if(g.arcs[i][j].adj==1&&!visited[j])
{
printf("广度优先访问:%d/n",g.vexs[j]);
inqueue(q,j);
visited[j]=1;
}
}
}
//找出值为v的顶点在图的存储数组中的索引
int locatevex(mgraph g,int v)
{
for(int i=0;i<g.vexnum;++i)
if(g.vexs[i]==v)return i;
}
int createUDG(mgraph &G) //构造无向图
{
int i,j,k;
int v1,v2;
printf("输入无向图的顶点个数和边的个数:/n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入无向图的各顶点的值:/n");
for(i=0;i<G.vexnum;++i)
scanf("%d",&G.vexs[i]);
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
{G.arcs[i][j].adj=0;G.arcs[i][j].info=0;}
for(k=0;k<G.arcnum;++k)
{
printf("输入无向图边的两个关联顶点:/n");
scanf("%d%d",&v1,&v2);
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arcs[i][j].adj=1;
G.arcs[j][i].adj=G.arcs[i][j].adj; //注意:不能写成G.arcs[i][j].adj=G.arcs[j][i].adj;
}
return 1;
}
void main()
{
mgraph g1;
createUDG(g1);
BFS(g1);
}