源程序:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 9 /* 存儲空間初始分配量 */
const int vnum = 20;
typedef struct gp
{
char vexs[vnum]; /* 頂點表 */
int arc[vnum][vnum];/* 鄰接矩陣,可看作邊表 */
int vexnum, arcnum; /* 圖中當前的頂點數和邊數 */
}Graph;
/* 循環隊列的順序存儲結構 */
typedef struct
{
int data[MAXSIZE];
int front; /* 頭指針 */
int rear; /* 尾指針,若隊列不空,指向隊列尾元素的下一個位置 */
}Queue;
/* 初始化一個空隊列Q */
int InitQueue(Queue *Q)
{
Q->front = 0;
Q->rear = 0;
return 1;
}
/* 若隊列Q為空隊列,則返回TRUE,否則返回FALSE */
int QueueEmpty(Queue Q)
{
if (Q.front == Q.rear) /* 隊列空的標志 */
return 1;
else
return 0;
}
/* 若隊列未滿,則插入元素e為Q新的隊尾元素 */
int EnQueue(Queue *Q, int e)
{
if ((Q->rear + 1) % MAXSIZE == Q->front) /* 隊列滿的判斷 */
return 0;
Q->data[Q->rear] = e; /* 將元素e賦值給隊尾 */
Q->rear = (Q->rear + 1) % MAXSIZE;/* rear指針向后移一位置, */
/* 若到最后則轉到數組頭部 */
return 1;
}
/* 若隊列不空,則刪除Q中隊頭元素,用e返回其值 */
int OutQueue(Queue *Q, int *e)
{
if (Q->front == Q->rear) /* 隊列空的判斷 */
return 0;
*e = Q->data[Q->front]; /* 將隊頭元素賦值給e */
Q->front = (Q->front + 1) % MAXSIZE; /* front指針向后移一位置, */
/* 若到最后則轉到數組頭部 */
return 1;
}
void CreateGraph(Graph *G)
{
int i, j;
G->arcnum = 6;
G->vexnum = 5;
/* 讀入頂點信息,建立頂點表 */
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->vexnum; i++)/* 初始化圖 */
{
for (j = 0; j < G->vexnum; j++)
{
G->arc[i][j] = 0;
}
}
G->arc[0][1] = 1;
G->arc[0][3] = 1;
G->arc[0][4] = 1;
G->arc[1][0] = 1;
G->arc[1][2] = 1;
G->arc[2][1] = 1;
G->arc[2][3] = 1;
G->arc[2][4] = 1;
G->arc[3][0] = 1;
G->arc[3][2] = 1;
G->arc[4][0] = 1;
G->arc[4][2] = 1;
for (i = 0; i < G->vexnum; i++)
{
for (j = i; j < G->vexnum; j++)
{
G->arc[j][i] = G->arc[i][j];
}
}
}
int visited[vnum]; /* 訪問標志的數組 */
/* 鄰接矩陣的廣度遍歷算法 */
void BFS(Graph G)
{
int i, j;
Queue Q;
for (i = 0; i < G.vexnum; i++)
visited[i] = 0;
InitQueue(&Q); /* 初始化一輔助用的隊列 */
for (i = 0; i < G.vexnum; i++) /* 如果是連通圖則只有一次循環,因為一次循環下來后visit都為TRUE*/
{
if (!visited[i]) /* 若是未訪問過就處理 */
{
visited[i] = 1; /* 設置當前頂點訪問過 */
printf("%c ", G.vexs[i]);/* 打印頂點,也可以其它操作 */
EnQueue(&Q, i); /* 將此頂點入隊列 */
while (!QueueEmpty(Q)) /* 若當前隊列不為空 */
{
OutQueue(&Q, &i); /* 將隊對元素出隊列,賦值給i */
for (j = 0; j<G.vexnum; j++)
{
/* 判斷其它頂點若與當前頂點存在邊且未訪問過 */
if (G.arc[i][j] == 1 && !visited[j])
{
visited[j] = 1; /* 將找到的此頂點標記為已訪問 */
printf("%c ", G.vexs[j]); /* 打印頂點 */
EnQueue(&Q, j); /* 將找到的此頂點入隊列 */
}
}
}
}
}
}
int main(void)
{
Graph g;
Graph *pg = &g;
CreateGraph(pg);
//printf("\n深度遍歷:");
//DFSTraverse(G);
printf("\n廣度遍歷:");
BFS(g);
system("pause");
return 0;
}
運行結果: