0
点赞
收藏
分享

微信扫一扫

图的邻接矩阵实现(深度优先遍历,广度优先遍历)

爱写作的小土豆 2022-04-01 阅读 84
数据结构

图可以由非常多的形式构成,但是一定有两个要素,就是顶点(Vertex)和变(Edge/Arc)

下面给出图的邻接矩阵实现的代码示例

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status;

typedef char VertexType; //顶点的类型,由用户定义
typedef int EdgeType; //边的权值类型,由用户定义

#define MAXVEX 9 //邻接矩阵的最大顶点数
#define MAXSIZE 9
//定义图:顶点集合+边集合
typedef struct {
VertexType vexs[MAXVEX]; //顶点表
EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵,相当于边表
int numVertexes;
int numEdges;
}MGraph;

/********定义一个队列************/
typedef struct {
int data[MAXSIZE];
int front;
int rear;
}Queue;

Status InitQueue(Queue* Q) {
Q->front = 0;
Q->rear = 0;
return OK;
}

Status QueueEmpty(Queue Q) {
if (Q.front == Q.rear) {
return TRUE;
} else {
return FALSE;
}
}

Status EnQueue(Queue *Q,int e) {
if ((Q->rear + 1)%MAXSIZE == Q->rear) {
printf("EnQueue fail:full!\n");
return FALSE;
}
Q->data[Q->rear] = e;
Q->rear++;
return OK;
}

Status DeQueue(Queue *Q,int *e) {
if (Q->front == Q->rear) {
printf("DeQueue fail:empty!\n");
return FALSE;
}
*e = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return OK;
}

void CreateMGraph(MGraph* G)
{
int i, j;

G->numEdges = 15;
G->numVertexes = 9;

/* 读入顶点信息,建立顶点表 */
G->vexs[0] = 'A';
G->vexs[1] = 'B';
G->vexs[2] = 'C';
G->vexs[3] = 'D';
G->vexs[4] = 'E';
G->vexs[5] = 'F';
G->vexs[6] = 'G';
G->vexs[7] = 'H';
G->vexs[8] = 'I';


for (i = 0; i < G->numVertexes; i++)/* 初始化图 */
{
for (j = 0; j < G->numVertexes; j++)
{
G->arc[i][j] = 0;
}
}

G->arc[0][1] = 1;
G->arc[0][5] = 1;

G->arc[1][2] = 1;
G->arc[1][8] = 1;
G->arc[1][6] = 1;

G->arc[2][3] = 1;
G->arc[2][8] = 1;

G->arc[3][4] = 1;
G->arc[3][7] = 1;
G->arc[3][6] = 1;
G->arc[3][8] = 1;

G->arc[4][5] = 1;
G->arc[4][7] = 1;

G->arc[5][6] = 1;

G->arc[6][7] = 1;


for (i = 0; i < G->numVertexes; i++)
{
for (j = i; j < G->numVertexes; j++)
{
G->arc[j][i] = G->arc[i][j];
}
}

}

bool visited[MAXVEX]; //顶点的访问标志数组

//邻接矩阵的深度优先递归算法
void DFS(MGraph G, int i) {
visited[i] = TRUE;
printf("%c\n",G.vexs[i]);
for (int j = 0; j < G.numVertexes; j++){
if (G.arc[i][i] == 1 && !visited[j]) {
DFS(G,j);
}
}
}

//邻接矩阵的深度遍历操作
void DFSTraverse(MGraph G) {
for (int i = 0; i < MAXVEX; i++) {
visited[i] = FALSE;
}
for (int j = 0; j < G.numVertexes; j++) {
if (!visited[j]) {
DFS(G, j);
}
}
}

//邻接矩阵的广度遍历算法
void BFSTraverse(MGraph G) {
int i, j;
for (i = 0; i < MAXVEX; i++) {
visited[i] = FALSE;
}
Queue Q;
InitQueue(
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) {
//未被处理
visited[i] = TRUE;
printf("%c\n", G.vexs[i]);
EnQueue(
while (!QueueEmpty(Q)) {
DeQueue(
for (j = 0; j < G.numVertexes; j++){
//判断其它顶点若与当前顶点存在边且未访问过
if (G.arc[i][j] == 1 && !visited[j]) {
visited[j] = TRUE;
printf("%c\n", G.vexs[j]);
EnQueue(
}
}
}
}
}
}

/********队列定义结束************/
int main()
{
MGraph G;
CreateMGraph(
printf("\n深度遍历:");
DFSTraverse(G);
printf("\n广度遍历:");
BFSTraverse(G);
return 0;
}

举报

相关推荐

0 条评论