广度优先遍历
#include<stdio.h>
#include<stdlib.h>
#define MAX 10
#define INFINITY 65535
#define TRUE 1
#define FALSE 0
typedef char VertexType;
typedef int EdgeType;
typedef int Boole;
Boole visited[MAX];
typedef int QElemType;
typedef int Status;
typedef struct
{
VertexType vexs[MAX];
EdgeType arc[MAX][MAX];
int numVertexes,numEdges;
}MGraph;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
}LinkQueue;
void create(MGraph *G)
{
int i,j,k,w;
printf("请输入顶点数和边数:\n");
scanf("%d%d",&G->numVertexes,&G->numEdges);
fflush(stdin);
for(i=0;i<G->numVertexes;i++)
{
printf("\n第%d个顶点",i+1);
scanf("%c",&G->vexs[i]);
getchar();
}
for(i=0;i<G->numVertexes;i++)
for(j=0;j<G->numVertexes;j++)
G->arc[i][j]=INFINITY;
for(k=0;k<G->numEdges;k++)
{
printf("输入边(Vi,Vj)的上下标i,j和权w(空格隔开):");
scanf("%d%d%d",&i,&j,&w);
G->arc[i][j]=w;
G->arc[j][i]=G->arc[i][j];
}
}
void Output(MGraph *G)
{
int i,j,count=0;
for(i=0;i<G->numVertexes;i++)
printf("\t%c",G->vexs[i]);
printf("\n");
for(i=0;i<G->numVertexes;i++)
{
printf("%4c",G->vexs[i]);
for(j=0;j<G->numVertexes;j++)
{
printf("\t%d",G->arc[i][j]);
count++;
if(count%G->numVertexes==0)
printf("\n");
}
}
}
Status InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
exit(0);
Q.front->next=NULL;
return 1;
}
Status EnQueue(LinkQueue &Q,int i)
{
QueuePtr s;
s=(QueuePtr)malloc(sizeof(QNode));
if(!s)
exit(0);
s->data=i;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
return 1;
}
Status QueueEmpty(LinkQueue Q)
{
if(Q.front->next==NULL)
return 0;
else
return 1;
}
Status DeQueue(LinkQueue *Q,int *i)
{
QueuePtr p;
if(Q->front==Q->rear)
return 0;
p=Q->front->next;
*i=p->data;
Q->front->next=p->next;
if(p==Q->rear)
Q->rear==Q->front;
free(p);
return 1;
}
void BFSTraverse(MGraph G)
{
int i,j;
LinkQueue Q;
for(i=0;i<G.numVertexes;i++)
visited[i]=FALSE;
InitQueue(Q);
for(i=0;i<G.numVertexes;i++)
{
if(!visited[i])
{
visited[i]=TRUE;
printf("%c->",G.vexs[i]);
EnQueue(Q,i);
while(!QueueEmpty(Q))
{
DeQueue(&Q,&i);
for(j=0;j<G.numVertexes;j++)
{
if(G.arc[i][j]==1&&!visited[j])
{
visited[j]=TRUE;
printf("%c",G.vexs[j]);
EnQueue(Q,j);
}
}
}
}
}
}
int main()
{
MGraph G;
create(&G);
printf("邻接矩阵数据如下:\n");
Output(&G);
printf("\n");
BFSTraverse(G);
printf("\n图遍历完毕");
return 0;
}