#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define VERTEX_MAX 128/*最大顶点数*/
#define MAXVALUE 1024
typedef enum { False, True } boolean;
boolean visited[VERTEX_MAX];
typedef struct SeqQueue{
int data[VERTEX_MAX];
int front, rear;
}*PSeqQueue;
typedef struct {
char Vertexs[VERTEX_MAX];//顶点表 保存顶点信息
int arcs[VERTEX_MAX][VERTEX_MAX];
int VertexNum, EdgeNum;//顶点数和边数
bool GraphType;//图的类型 0为无向图,1为有向图
}MGraph;
PSeqQueue Init_SeqQueue();
int Empty_SeqQueue(PSeqQueue Q);
int In_SeqQueue(PSeqQueue Q, int x);
int Out_SeqQueue(PSeqQueue Q, int * x);
void Destroy_SeqQueue(PSeqQueue *Q);
void CreateGraph(MGraph *G);
void BFStraverse(MGraph G);
void BFS(MGraph G, int v);
void Visit(MGraph *G,int v);
int main()
{
int v=0;
MGraph G;
CreateGraph(&G);
BFStraverse(G);
BFS(G, v);
system("pause");
return 0;
}
/***********************************************FUNCTION*********************************************/
void CreateGraph(MGraph *G)
{
int i, j, k,l,count, weight;//weight为权值
char start, end;//边的起始定点
printf("请选择要要遍历的图的类型:1、有向图;2、无向图\n");
scanf("%d", &(G->GraphType));
printf("请输入顶点数和边数:\n");
scanf("%d %d", &(G->VertexNum), &(G->EdgeNum));
for ( l = 0; l < G->VertexNum; l++)
{
printf("请输入第%d个顶点的信息: ",l+1);
scanf(" %c", &(G->Vertexs[l]));//%c前面加个空格 取消前面输入的enter enter也算是%c
}
for ( i = 0; i < G->VertexNum; i++)
{
int w = MAXVALUE;
for (j= 0; j < G->VertexNum; j++)
{
G->arcs[i][j] = w;
}
}/*初始化邻接矩阵*/
for ( k = 0; k < G->EdgeNum; k++)
{
printf("这是第%d条边,请输入起点,终点和权值;\n",k+1);
scanf(" %c %c %d",&start,&end,&weight);
for (i = 0; start != G->Vertexs[i]; i++);//查找起点
for (j = 0; end != G->Vertexs[j]; j++); //查找终点
G->arcs[i][j] = weight;//保存权值
if (0 == G->GraphType)//如果是无向图
{
G->arcs[j][i] = weight;
for ( count = 0; count < G->VertexNum; count++)
{
G->arcs[count][count] = 0;
}
}
}
}
void BFStraverse(MGraph G)
{ /* 广度优先遍历图G */
int i,v;
for (v = 0; v < G.VertexNum; v++)
visited[v] = False; /* 标志向量初始化*/
for (i = 0; i < G.VertexNum; i++)
if (!visited[i])
BFS(G,i); /* vi未访问过,从vi开始BFS搜索*/
}
void BFS(MGraph G, int v)
{ /* 以v为出发点,对图G进行BFS搜索*/
int i, j;
PSeqQueue Q;
Q = Init_SeqQueue();
Visit(&G,v); /* 访问*/
visited[v] = True;
In_SeqQueue(Q,v); /* 原点入队列*/
while (!Empty_SeqQueue(Q))
{
Out_SeqQueue(Q, &i); /* vi出队列*/
for (j = 0; j < G.VertexNum; j++) /* 依次搜索vi的邻接点vj */
if (G.arcs[i][j] == 1 && !visited[j]) /* 若vj未访问*/
{
Visit(&G,j); /* 访问vj */
visited[j] = True;
In_SeqQueue(Q, j); /* 访问过的v j入队列*/
}
}
Destroy_SeqQueue(&Q);
}/*BFS*/
/*********************************************SEQ QUEUE*****************************************************/
PSeqQueue Init_SeqQueue()
{
PSeqQueue Q;
Q = (PSeqQueue)malloc(sizeof(struct SeqQueue));
if (Q) {
Q->front = 0;
Q->rear = 0;
}
return Q;
}
int Empty_SeqQueue(PSeqQueue Q)
{
if (Q&&Q->front == Q->rear)
return 1;
else
return 0;
}
int In_SeqQueue(PSeqQueue Q, int x)
{
if ((Q->rear + 1) % VERTEX_MAX == Q->front) {
printf("队满!!");
return -1;
}
else {
Q->rear = (Q->rear + 1) % VERTEX_MAX;
Q->data[Q->rear] = x;
return 1;
}
}
int Out_SeqQueue(PSeqQueue Q, int * x)
{
if (Empty_SeqQueue(Q)) {
printf("队空!");
return -1;
}
else {
Q->front = (Q->front + 1) % VERTEX_MAX;
*x = Q->data[Q->front];
return 1;
}
}
void Destroy_SeqQueue(PSeqQueue *Q)
{
if (*Q)
free(*Q);
*Q = NULL;
}
void Visit(MGraph *G,int v)
{
printf("%c \t", G->Vertexs[v-1]);
}