#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include"myQueue.h"
#define MaxVerTexNum 100
#define elemType char
typedef struct MGraph {
elemType Vex[MaxVerTexNum];
int Edge[MaxVerTexNum][MaxVerTexNum];
int vexNum, arcNum;
}MGraph;
//对图进行初始化
void initGraph(MGraph* grah) {
for (int i = 0;i < MaxVerTexNum;i++) {
for (int j = 0;j < MaxVerTexNum;j++) {
grah->Edge[i][j] = INT_MAX;
}
grah->Vex[i] = 0;
}
grah->vexNum = 0;
grah->arcNum = 0;
}
//在图G中插入顶点x
bool InsertVertex(MGraph* G, elemType x) {
if (G->Vex[x - 'A'] != 0) {
return false;
}
G->Vex[x - 'A'] = x;
return true;
}
//在图G中删除顶点x
void DeleteVertex(MGraph* G, elemType x) {
G->Vex[x - 'A'] = 0;
}
//在图G中给x,y添加一条边
bool AddEdge(MGraph* G, elemType x, elemType y, int value) {
if (G->Edge[x - 'A'][y - 'A'] != INT_MAX) {
return false;
}
G->Edge[x - 'A'][y - 'A'] = value;
G->Edge[y - 'A'][x - 'A'] = value;
return true;
}
//删除图G中x到y这条边
void RemoveEdge(MGraph* G, elemType x, elemType y) {
G->Edge[x - 'A'][y - 'A'] = INT_MAX;
G->Edge[y - 'A'][x - 'A'] = INT_MAX;
}
//求图中顶点x的第一个邻接点
elemType FirstNeighbor(MGraph* G, elemType x) {
for (int i = 0;i < MaxVerTexNum;i++) {
if (G->Edge[x - 'A'][i] != INT_MAX) {
return 'A' + i;
}
}
return 0;
}
//假设y是x的邻接点,返回除y之外顶点x的下一个顶点号
int NextNeighbor(MGraph* G, elemType x, elemType y) {
for (int i = y-'A';i < MaxVerTexNum;i++) {
if (G->Edge[x - 'A'][i] != INT_MAX && y - 'A' != i) {
return 'A' + i;
}
}
return 0;
}
//获取图中x到y的权值
int getEdgeValue(MGraph* G, elemType x, elemType y) {
return G->Edge[x - 'A'][y - 'A'];
}
int visited[MaxVerTexNum] = { 0 };
void BFS(MGraph* G, elemType x) {
Queue Q;
initQueue(&Q);//初始化辅助队列
pushInQueue(&Q, x);//从x开始遍历,将x压入队列
visited[x - 'A'] = 1;//该节点已经被访问
elemType temp;
while (!isEmptyQueue(&Q)) {
popQueue(&Q, &temp);//出队并访问该节点
printf("%c ", temp);
for (elemType w = FirstNeighbor(G, temp);w != 0;w = NextNeighbor(G, temp, w)) {//将该节点的邻接点都入队
if (visited[w - 'A'] == 0) {//确保其没有被访问,避免出现回路
pushInQueue(&Q, w);//入队
visited[w - 'A'] = 1;//并标记为已访问
}
}
}
destory(&Q);
}
int main() {
MGraph G;
initGraph(&G);
InsertVertex(&G, 'A');
InsertVertex(&G, 'B');
InsertVertex(&G, 'C');
InsertVertex(&G, 'D');
InsertVertex(&G, 'E');
InsertVertex(&G, 'F');
AddEdge(&G, 'A', 'B', 1);
AddEdge(&G, 'A', 'D', 1);
AddEdge(&G, 'A', 'E', 1);
AddEdge(&G, 'B', 'C', 1);
AddEdge(&G, 'B', 'D', 1);
AddEdge(&G, 'C', 'F', 1);
BFS(&G, 'A');
return 0;
}