邻接矩阵的图遍历
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0typedef int Status; /* Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */
typedef int Boolean; /* Boolean是布爾類型,其值是TRUE或FALSE */typedef char VertexType; /* 頂點(diǎn)類型應(yīng)由用戶定義 */
typedef int EdgeType; /* 邊上的權(quán)值類型應(yīng)由用戶定義 */#define MAXSIZE 9 /* 存儲(chǔ)空間初始分配量 */
#define MAXEDGE 15
#define MAXVEX 9
#define INFINITY 65535typedef struct
{VertexType vexs[MAXVEX]; /* 頂點(diǎn)表 */EdgeType arc[MAXVEX][MAXVEX];/* 鄰接矩陣,可看作邊表 */int numVertexes, numEdges; /* 圖中當(dāng)前的頂點(diǎn)數(shù)和邊數(shù) */
}MGraph;/* 用到的隊(duì)列結(jié)構(gòu)與函數(shù)********************************** *//* 循環(huán)隊(duì)列的順序存儲(chǔ)結(jié)構(gòu) */
typedef struct
{int data[MAXSIZE];int front; /* 頭指針 */int rear; /* 尾指針,若隊(duì)列不空,指向隊(duì)列尾元素的下一個(gè)位置 */
}Queue;/* 初始化一個(gè)空隊(duì)列Q */
Status InitQueue(Queue *Q)
{Q->front=0;Q->rear=0;return OK;
}/* 若隊(duì)列Q為空隊(duì)列,則返回TRUE,否則返回FALSE */
Status QueueEmpty(Queue Q)
{ if(Q.front==Q.rear) /* 隊(duì)列空的標(biāo)志 */return TRUE;elsereturn FALSE;
}/* 若隊(duì)列未滿,則插入元素e為Q新的隊(duì)尾元素 */
Status EnQueue(Queue *Q,int e)
{if ((Q->rear+1)%MAXSIZE == Q->front) /* 隊(duì)列滿的判斷 */return ERROR;Q->data[Q->rear]=e; /* 將元素e賦值給隊(duì)尾 */Q->rear=(Q->rear+1)%MAXSIZE;/* rear指針向后移一位置, *//* 若到最后則轉(zhuǎn)到數(shù)組頭部 */return OK;
}/* 若隊(duì)列不空,則刪除Q中隊(duì)頭元素,用e返回其值 */
Status DeQueue(Queue *Q,int *e)
{if (Q->front == Q->rear) /* 隊(duì)列空的判斷 */return ERROR;*e=Q->data[Q->front]; /* 將隊(duì)頭元素賦值給e */Q->front=(Q->front+1)%MAXSIZE; /* front指針向后移一位置, *//* 若到最后則轉(zhuǎn)到數(shù)組頭部 */return OK;
}
/* ****************************************************** */void CreateMGraph(MGraph *G)
{int i, j;G->numEdges=15;G->numVertexes=9;/* 讀入頂點(diǎn)信息,建立頂點(diǎn)表 */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];}}}Boolean visited[MAXVEX]; /* 訪問標(biāo)志的數(shù)組 *//* 鄰接矩陣的深度優(yōu)先遞歸算法 */
void DFS(MGraph G, int i)
{int j;visited[i] = TRUE;printf("%c ", G.vexs[i]);/* 打印頂點(diǎn),也可以其它操作 */for(j = 0; j < G.numVertexes; j++)if(G.arc[i][j] == 1 && !visited[j])DFS(G, j);/* 對(duì)為訪問的鄰接頂點(diǎn)遞歸調(diào)用 */
}/* 鄰接矩陣的深度遍歷操作 */
void DFSTraverse(MGraph G)
{int i;for(i = 0; i < G.numVertexes; i++)visited[i] = FALSE; /* 初始所有頂點(diǎn)狀態(tài)都是未訪問過狀態(tài) */for(i = 0; i < G.numVertexes; i++)if(!visited[i]) /* 對(duì)未訪問過的頂點(diǎn)調(diào)用DFS,若是連通圖,只會(huì)執(zhí)行一次 */ DFS(G, i);
}/* 鄰接矩陣的廣度遍歷算法 */
void BFSTraverse(MGraph G)
{int i, j;Queue Q;for(i = 0; i < G.numVertexes; i++)visited[i] = FALSE;InitQueue(&Q); /* 初始化一輔助用的隊(duì)列 */for(i = 0; i < G.numVertexes; i++) /* 對(duì)每一個(gè)頂點(diǎn)做循環(huán) */{if (!visited[i]) /* 若是未訪問過就處理 */{visited[i]=TRUE; /* 設(shè)置當(dāng)前頂點(diǎn)訪問過 */printf("%c ", G.vexs[i]);/* 打印頂點(diǎn),也可以其它操作 */EnQueue(&Q,i); /* 將此頂點(diǎn)入隊(duì)列 */while(!QueueEmpty(Q)) /* 若當(dāng)前隊(duì)列不為空 */{DeQueue(&Q,&i); /* 將隊(duì)對(duì)元素出隊(duì)列,賦值給i */for(j=0;j<G.numVertexes;j++) { /* 判斷其它頂點(diǎn)若與當(dāng)前頂點(diǎn)存在邊且未訪問過 */if(G.arc[i][j] == 1 && !visited[j]) { visited[j]=TRUE; /* 將找到的此頂點(diǎn)標(biāo)記為已訪問 */printf("%c ", G.vexs[j]); /* 打印頂點(diǎn) */EnQueue(&Q,j); /* 將找到的此頂點(diǎn)入隊(duì)列 */} } }}}
}int main(void)
{ MGraph G;CreateMGraph(&G);printf("\n深度遍歷:");DFSTraverse(G);printf("\n廣度遍歷:");BFSTraverse(G);return 0;
}
總結(jié)