#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 顶点数目的最大值
#define TRUE true
#define FALSE false
bool visited[MAX_VERTEX_NUM];
typedef int ElemType;
typedef int VertexType; // 顶点的数据类型
typedef int EdgeType; // 带权图中边上权值的数据类型
typedef struct LinkNode {
ElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct {
LinkNode* front, * rear;
}LinkQueue;
typedef struct {
VertexType Vex[MAX_VERTEX_NUM]; // 顶点表
EdgeType Edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵, 边表
int vexnum, arcnum; // 图的当前顶点数和边数/弧数
}MGraph;
LinkQueue Q; // 声明辅助队列
// 广度优先遍历——BFS算法
void BFSTraverse(MGraph G) { // 对图G进行广度优先遍历
int i;
for (i = 0; i < G.vexnum; ++i)
visited[i] = FALSE; // 访问标记数组初始化
InitQueue(Q); // 初始化辅助队列
for (i = 0; i < G.vexnum; ++i) // 从0号顶点开始遍历
if (!visited[i]) // 对每个连通分量调用一次BFS
BFS(G, i); // vi为访问过,从vi开始访问BFS
}
void BFS(MGraph G, int v) {
printf("%c ", G.Vex[v]); // 访问初始顶点v
visited[v] = TRUE; // 对v做已访问标记
EnQueue(Q, v);
int w;
while (!IsEmpty(Q)){
DeQueue(Q, v);
for (w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w)) {
if (!visited[w]) {
printf("%c ", G.Vex[w]);
visited[w] = TRUE;
EnQueue(Q, w);
}
}
}
}
// 深度优先遍历——DFS遍历
void DFSTraverse(MGraph G) {
int v;
for (v = 0; v < G.vexnum; v++)
visited[v] = FALSE;
for (v = 0; v < G.vexnum; v++)
if (!visited[v]) {
DFS(G, v);
}
}
void DFS(MGraph G, int v) {
printf("%c ", G.Vex[v]); // 访问顶点v
visited[v] = TRUE; // 设已访问标记
int w;
for (w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w)) {
if (!visited[w]) {
DFS(G,w);
}
}
}
// 初始化队列
void InitQueue(LinkQueue& Q) {
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
Q.front = Q.rear = NULL;
}
// 判空
bool IsEmpty(LinkQueue Q) {
if (Q.front == Q.rear) return true;
else return false;
}
// 入队
void EnQueue(LinkQueue& Q, ElemType x) {
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x; s->next = NULL;
Q.rear->next = s;
Q.rear = s;
}
//出队
bool DeQueue(LinkQueue& Q, ElemType& x) {
if (Q.front == Q.rear) return false;
LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
x = p->data;
Q.front->next = p->next;
if (Q.rear == p) {
Q.rear = Q.front;
}
free(p);
return true;
}
// 求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1.
int FirstNeighbor(MGraph G, int v) {
int i;
if (v<0 || v>G.vexnum - 1) return -1;
for (i = 0; i < G.vexnum; i++) {
if (G.Edge[v][i] == 1) {
return i;
}
else
return -1;
}
}
// 求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1.
int NextNeighbor(MGraph G, int v, int w) {
int i;
if (v<0 || v>G.vexnum - 1 || w<0 || w>G.vexnum - 1) return -1;
for (i = w + 1; i < G.vexnum; i++) {
if (G.Edge[v][i] == 1) {
return i;
}
}
return -1;
}
int main() {
return 0;
}
c语言图的广度优先遍历(BFS遍历)和深度优先遍历(DFS遍历)示例代码
最新推荐文章于 2024-03-18 13:47:29 发布