#include<stdio.h> #define N 20 #define TRUE 1 #define FALSE 0 int visited[N]; typedef struct /*隊列的定義*/ { int data[N]; int front;//隊頭指針 int rear;//隊尾指針 } queue; typedef struct /*圖的鄰接矩陣*/ { int vexnum,arcnum; char vexs[N]; int arcs[N][N];///鄰接矩陣 } graph; void createGraph(graph *g); /*建立一個無向圖的鄰接矩陣*/ void dfs(int i,graph *g); /*從第i個頂點出發深度優先搜索*/ void tdfs(graph *g); /*深度優先搜索整個圖*/ void bfs(int k,graph *g); /*從第k個頂點廣度優先搜索*/ void tbfs(graph *g); /*廣度優先搜索整個圖*/ void init_visit(); /*初始化訪問標識數組*/ void createGraph(graph *g) /*建立一個無向圖的鄰接矩陣*/ { int i,j; char v; g->vexnum=0; g->arcnum=0; i=0; printf("輸入頂點序列(以#結束):\n"); while((v=getchar())!='#') { g->vexs[i]=v; /*讀入頂點信息*/ i++; } g->vexnum=i; /*頂點數目*/ for(i=0; i<g->vexnum; i++) /*鄰接矩陣初始化*/ { for(j=0; j<g->vexnum; j++) { g->arcs[i][j]=0; } } printf("輸入邊的信息:\n"); scanf("%d,%d",&i,&j); /*讀入邊i,j*/ while(i!=-1) /*讀入i,j為-1時結束*/ { g->arcs[i][j]=1; g->arcs[j][i]=1; scanf("%d,%d",&i,&j); } } void dfs(int i,graph *g) /*從第i個頂點出發深度優先搜索*/ { int j; printf("%c",g->vexs[i]); visited[i]=1; for(j=0; j<g->vexnum; j++) { if(visited[j]==0&&g->arcs[i][j]==1) { dfs(j,g); } } } void tdfs(graph *g) /*深度優先搜索整個圖*/ { int i; printf("\n從頂點%C開始深度優先搜索序列:",g->vexs[0]); for(i=0; i<g->vexnum; i++) { if(visited[i]!=1) { dfs(i,g); } } } void bfs(int k,graph *g) /*從第k個頂點廣度優先搜索*/ { int i,j; queue qlist,*q; q=&qlist; q->rear=0; q->front=0; printf("%c",g->vexs[k]); visited[k]=TRUE; q->data[q->rear]=k; q->rear=(q->rear+1)%N;//更新隊尾指針 while(q->rear!=q->front)//隊不空 { i=q->data[q->front];//去隊首元素 q->front=(q->front+1)%N; for(j=0; j<g->vexnum; j++)//便利所有的結點,找到與i相關聯的點 { if((g->arcs[i][j]==1)&&(!visited[j]))//找到未便利的點 { printf("%c",g->vexs[j]);//輸出 visited[j]=TRUE;//修改訪問標志 q->data[q->rear]=j;//入隊 q->rear=(q->rear+1)%N; } } } } void tbfs(graph *g) /*廣度優先搜索整個圖*/ { int i; printf("\n從頂點%C開始廣度優先搜索序列:",g->vexs[0]); for(i=0; i<g->vexnum; i++) if(visited[i]!=TRUE) bfs(i,g); } void init_visit() /*初始化訪問標識數組*/ { int i; for(i=0; i<N; i++) { visited[i]=FALSE; } } int main() { graph ga; int i,j; createGraph(&ga); printf("無向圖的鄰接矩陣:\n"); for(i=0; i<ga.vexnum; i++) { for(j=0; j<ga.vexnum; j++) printf("%3d",ga.arcs[i][j]); printf("\n"); } init_visit(); tbfs(&ga); return 0; }
