#include<stdio.h>
#include<stdlib.h>
#define INFINTY 65535 //最大值
#define MAX 20 //最大顶点个数
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
typedef int status;
typedef int EdgeType;//边
typedef int QElemType;
typedef char VertexType;//顶点类
//typedef enum{DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网
typedef struct
{
VertexType vexs[MAX];//顶点
EdgeType arcs[MAX][MAX]; //邻接矩阵
int vexnum,arcnum; //图当前的顶点数和弧数
// GraphKind kind; //图的种类
}MGraph;
/*队列结构*/
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear; //队头队尾指针
}LinkQueue;
int InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
exit(0);
Q.front->next=NULL;
return 1;
}
int EnQueue(LinkQueue &Q,int i)
{
QueuePtr s;printf(" i=%d",i);
s=(QueuePtr)malloc(sizeof(QNode));
if(!s)
exit(0);
s->data=i;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;printf(" s->data=%d\n",s->data);
return 1;
}
//出队列
int DeQueue(LinkQueue *Q,int *i)
{
QueuePtr p;
if(Q->front==Q->rear)
return 0;
p=Q->front->next; //相当于p储存第一个结点
*i=p->data;
Q->front->next=p->next;
if(p==Q->rear) //若队头是队尾 ,删除后将rear指向头结点
Q->rear=Q->front;
free(p);
return 1;
}
status LocateVex(MGraph *G,VertexType e)
{
int i;
for(i=0;i<G->vexnum;++i)
{
if(e==G->vexs[i])
return i;
}
return -1;
}
status CreatDG(MGraph *G)//有向图
{
scanf("%d %d",&G->vexnum,&G->arcnum);getchar();
int i,j,k;
VertexType v1,v2;
i=0;
while(i<G->vexnum)
{
scanf("%c",&G->vexs[i]);
i++;
}
getchar();
for(i=0;i<G->vexnum;i++)//初始化
for(j=0;j<G->vexnum;j++)
G->arcs[i][j]=INFINTY;
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[i][j]=G->arcs[j][i];
}
return OK;
}
/*
//输出邻接矩阵
void Output(MGraph *G)
{
int i,j,count=0;
for(i=0;i<G->vexnum;i++)
printf("\t%c",G->vexs[i]);
printf("\n");
for(i=0;i<G->vexnum;i++)
{
printf("%4c",G->vexs[i]);
for(j=0;j<G->vexnum;j++)
{
printf("\t%d",G->arcs[i][j]);
count++;
if(count%G->vexnum==0)
printf("\n");
}
}
} */
int visited[MAX];
void BFSTraverse(MGraph *G)
{
int i,j;
LinkQueue Q;
for(i=0;i<G->vexnum;++i)
visited[i]=FALSE;
InitQueue(Q);
for(i=0;i<G->vexnum;++i)
{
if(!visited[i])
{
visited[i]=TRUE;
printf("%c ",G->vexs[i]);
EnQueue(Q,i);
while(Q.front->next!=NULL)
{
DeQueue(&Q,&i); //将队中元素出队列,赋值给i
for(j=0;j<G->vexnum;j++)
{
if(G->arcs[i][j]==1&&!visited[j]) //其他顶点与该顶点存在边 且未访问过
{
visited[j]=TRUE;
printf("%c",G->vexs[j]);
EnQueue(Q,j); //入队列
}
}
}
}
}
}
void main()
{
MGraph *G=NULL;
G=(MGraph *)malloc(sizeof(MGraph));
CreatDG(G);
Output(G);
BFSTraverse(G);
}