1 /** 2 無向圖的鄰接表存儲 3 深度優先遍歷遞歸 4 廣度優先遍歷遞歸+非遞歸 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #include <malloc.h> 9 #define N 5 10 #define MAX 50 11 typedef struct A{ 12 int adjvex; 13 struct A* nextArc; 14 }Arc; 15 typedef struct node{ 16 char data[N]; 17 Arc* firstArc; 18 }Node; 19 typedef struct graph{ 20 Node vex[MAX]; 21 int numv; 22 int nume; 23 }Graph; 24 25 int getIndex(Graph G,char s[]){ 26 for(int i = 0; i < G.numv; i++){ 27 if(strcmp(G.vex[i].data,s) == 0) 28 return i; 29 } 30 return -1; 31 } 32 33 void create(Graph& G){ 34 printf("輸入頂點和弧的個數:\n"); 35 scanf("%d%d",&G.numv,&G.nume); 36 printf("輸入頂點信息:\n"); 37 for(int i = 0; i < G.numv; i++) 38 scanf("%s",G.vex[i].data); 39 ///初始化頂點數組 40 for(int i = 0; i < G.numv; i++) 41 G.vex[i].firstArc = NULL; 42 printf("輸入邊的信息:\n"); 43 char s[N],e[N]; 44 int u,v; 45 for(int i = 0; i < G.nume; i++){ 46 scanf("%s%s",s,e); 47 u = getIndex(G,s); 48 v = getIndex(G,e); 49 Arc* p = (Arc*)malloc(sizeof(Arc)); 50 p->adjvex = v; 51 p->nextArc = NULL; 52 p->nextArc = G.vex[u].firstArc; 53 G.vex[u].firstArc = p; 54 Arc* t = (Arc*)malloc(sizeof(Arc)); 55 t->nextArc = NULL; 56 t->adjvex = u; 57 t->nextArc = G.vex[v].firstArc; 58 G.vex[v].firstArc = t; 59 } 60 } 61 62 void output(Graph G){ 63 Arc* p; 64 for(int i = 0; i < G.numv; i++){ 65 p = G.vex[i].firstArc; 66 printf("%4s",G.vex[i].data); 67 while(p != NULL){ 68 printf("%4s",G.vex[p->adjvex].data); 69 p = p->nextArc; 70 } 71 printf("\n"); 72 } 73 } 74 75 ///深度優先遍歷 (遞歸) 76 int visit[2*MAX]; 77 void dfs(Graph G,int s){ 78 Arc* p = G.vex[s].firstArc; 79 if(!visit[s]){ 80 printf("%4s",G.vex[s].data); 81 visit[s] = 1; 82 } 83 while(p != NULL){ 84 if(!visit[p->adjvex]) 85 dfs(G,p->adjvex); 86 p = p->nextArc; 87 } 88 } 89 90 ///廣度優先遍歷 (遞歸) 91 ///缺點遞歸最大為G.numv次 92 int q[2*MAX],f=0,r=0; 93 int visit_q[MAX]; 94 void bfs(Graph G,int s){ 95 if(!visit_q[s]){ 96 printf("%4s",G.vex[s].data); 97 visit_q[s] = 1; 98 Arc* p = G.vex[s].firstArc; 99 while(p != NULL){ 100 if(!visit_q[p->adjvex]) 101 q[r++] = p->adjvex; 102 p = p->nextArc; 103 } 104 } 105 while(f < r){ 106 bfs(G,q[f++]); 107 } 108 } 109 110 ///廣度優先遍歷 (非遞歸) 111 int Q[2*MAX],F=0,R=0; 112 int visit_Q[MAX]; 113 void bfs_1(Graph G,int s){ 114 printf("%4s",G.vex[s].data); 115 visit_Q[s] = 1; 116 Arc* p = G.vex[s].firstArc; 117 while(p != NULL){ 118 Q[R++] = p->adjvex; 119 p = p->nextArc; 120 } 121 while(F < R){ 122 int node = Q[F++]; 123 if(!visit_Q[node]){ 124 printf("%4s",G.vex[node].data); 125 visit_Q[node] = 1; 126 p = G.vex[node].firstArc; 127 while(p != NULL){ 128 if(!visit_Q[p->adjvex]) 129 Q[R++] = p->adjvex; 130 p = p->nextArc; 131 } 132 } 133 } 134 } 135 136 int main(void){ 137 Graph G; 138 create(G); printf("輸出鄰接矩陣:\n"); 139 output(G); 140 printf("深度優先遍歷(遞歸):\n"); 141 dfs(G,0); 142 printf("\n廣度優先遍歷(遞歸):\n"); 143 bfs(G,0); 144 printf("\n廣度優先遍歷(非遞歸):\n"); 145 bfs_1(G,0); 146 return 0; 147 }
測試用例:
8 9
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v2 v4
v2 v5
v3 v6
v3 v7
v4 v8
v5 v8
v7 v6
v1
圖(b)
8 7
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v2 v4
v3 v6
v4 v8
v6 v7
v8 v5
v1
圖(a)
8 10
1 2 3 4 5 6 7 8
1 2
1 3
2 4
2 5
3 6
3 7
4 8
5 8
6 8
7 8
1
圖(d)
6 7
A B C D E F
A B
A E
B F
B E
F C
F D
D C
圖(c)