图可以由非常多的形式构成,但是一定有两个要素,就是顶点(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(&Q);
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) {
int temp;
//未被处理
visited[i] = TRUE;
printf("%c\n", G.vexs[i]);
temp = i;
EnQueue(&Q,temp);
while (!QueueEmpty(Q)) {
DeQueue(&Q, &temp);
for (j = 0; j < G.numVertexes; j++){
//判断其它顶点若与当前顶点存在边且未访问过
if (G.arc[temp][j] == 1 && !visited[j]) {
visited[j] = TRUE;
printf("%c\n", G.vexs[j]);
EnQueue(&Q, j);
}
}
}
}
}
}
/********队列定义结束************/
int main()
{
MGraph G;
CreateMGraph(&G);
printf("\n深度遍历:");
DFSTraverse(G);
printf("\n广度遍历:");
BFSTraverse(G);
return 0;
}