实现图的基本操作

要求:建立图(邻接矩阵、邻近表任选其一)的存储结构、实现图的深度优先遍历和广度优先遍历。

话不多说,代码贴上:

  1 #include <stdio.h>
  2 
  3 #include<iostream>
  4 
  5 using namespace std;
  6 
  7 #define MAX_Point 26           // 最大顶点数
  8 
  9 int visited[MAX_Point];    // 遍历标志数组
 10 
 11 struct Graph
 12 
 13 {    
 14 
 15 char vexs[MAX_Point];           // 顶点表    
 16 
 17 int arc[MAX_Point][MAX_Point];      // 邻接矩阵    
 18 
 19 int numVertexs, numEdges;            // 图中当前的顶点数和边数 };
 20 
 21 void CreateGraph(Graph *graph)
 22 
 23 {    
 24 
 25 int i, j,k,io;
 26 
 27 //printf("输入顶点数:");    
 28 
 29 scanf("%d", &(graph->numVertexs));          // 接收输入的顶点数和边数,  
 30 
 31   // printf("输入顶点信息:");    
 32 
 33 for(i = 0; i < graph->numVertexs; i++)                             // 读入顶点信息,建立顶点表  
 34 
 35    {
 36 
 37         getchar();                                                 // 清空键盘输入缓冲区        
 38 
 39        scanf("%c", &(graph->vexs[i]));    
 40 
 41    }
 42 
 43 for(i = 0; i < graph->numVertexs; i++)    
 44 
 45 {        
 46 
 47        for(j = 0; j < graph->numVertexs; j++)  
 48 
 49        {           
 50 
 51           graph->arc[i][j] = 0;                            // 邻接矩阵初始化       
 52 
 53        }    
 54 
 55 }   
 56 
 57 // printf("输入边数:");    
 58 
 59 scanf("%d", &(graph->numEdges));
 60 
 61     //printf("输入边上的顶点,分别用空格分隔:");  
 62 
 63    for(k = 0; k < graph->numEdges; k++)                               // 读入numEdges条边,建立邻接矩阵  
 64 
 65    {
 66 
 67         getchar();                                                 // 清空键盘输入缓冲区        
 68 
 69        scanf("%d %d %d", &i, &j,&io);        
 70 
 71        graph->arc[i][j] =  io;        
 72 
 73        graph->arc[j][i] = graph->arc[i][j];                           // 因为是无向图,矩阵对称   
 74 
 75     }
 76 
 77 }
 78 
 79 void DFS(Graph graph, int i)
 80 
 81 {    
 82 
 83    int j;    
 84 
 85    visited[i] = 1;                   // 标志已经被遍历过了    
 86 
 87    printf("%c ", graph.vexs[i]);
 88 
 89     for(j = 0; j < graph.numVertexs; j++)   
 90 
 91   {         // 如果与第i个顶点相邻接且该顶点还没有被遍历过,则对邻接顶点递归调用       
 92 
 93       if(graph.arc[i][j]!=0 && !visited[j])        
 94 
 95        {            
 96 
 97          DFS(graph, j);       
 98 
 99          }    
100 
101    }
102 
103 }
104 
105 void DFSTraverse(Graph graph)
106 
107 {    
108 
109     cout<<"DFS:";   
110 
111     int i;    
112 
113    for(i = 0; i < graph.numVertexs; i++)  
114 
115    {         // 初始所有顶点都是未被遍历过的状态     
116 
117        visited[i] = 0;   
118 
119     }   
120 
121   for(i = 0; i < graph.numVertexs; i++)   
122 
123   {         // 对未访问过的顶点调用DFS,若是连通图,只会执行一次     
124 
125        if(!visited[i])      
126 
127        {           
128 
129           DFS(graph, i);  
130 
131        }    
132 
133    }   
134 
135   cout<<endl; }
136 
137 //广度遍历
138 
139 void BFS(Graph graph, int i)
140 
141 {    
142 
143     int j;    
144 
145     visited[i] = 1;                   // 标志已经被遍历过了    
146 
147     printf("%c ", graph.vexs[i]);
148 
149     for(j = 0; j < graph.numVertexs; j++)
150 
151    {         // 如果与第i个顶点相邻接且该顶点还没有被遍历过,则对邻接顶点递归调用      
152 
153         if(graph.arc[i][j] !=0 && !visited[j])       
154 
155    {             //BFS(graph, j);            
156 
157         visited[j] = 1;                   // 标志已经被遍历过了          
158 
159          printf("%c ", graph.vexs[j]);
160 
161         }    
162 
163    }
164 
165 }
166 
167 void BFSTraverse(Graph graph)
168 
169 {    
170 
171       cout<<"BFS:";    
172 
173       int i;    
174 
175       for(i = 0; i < graph.numVertexs; i++)    
176 
177      {         // 初始所有顶点都是未被遍历过的状态    
178 
179          visited[i] = 0;   
180 
181       }    
182 
183     for(i = 0; i < graph.numVertexs; i++)   
184 
185      {         // 对未访问过的顶点调用BFS,若是连通图,只会执行一次      
186 
187           if(!visited[i])        
188 
189           {            
190 
191             BFS(graph, i);      
192 
193            }    
194 
195      }    
196 
197       cout<<endl;
198 
199 }
200 
201 char change(int i)
202 
203 {    
204 
205     char chng;  
206 
207     switch(i)    
208 
209    {    
210 
211    case 0:         chng='a';         break;    
212 
213    case 1:         chng='b';         break;    
214 
215    case 2:         chng='c';         break;    
216 
217    case 3:          chng='d';         break;    
218 
219    case 4:         chng='e';         break;    
220 
221    case 5:         chng='f';         break;    
222 
223    case 6:         chng='g';         break;    
224 
225    case 7:         chng='h';         break;    
226 
227    case 8:         chng='i';         break;    
228 
229    case 9:         chng='j';         break;    
230 
231    }   
232 
233   return chng;
234 
235 }
236 
237 void show(Graph graph) {  
238 
239    cout<<"edges are:"<<endl;  
240 
241    for(int i = 0; i < graph.numVertexs; i++)   
242 
243    {        
244 
245          for(int j = i+1; j < graph.numVertexs; j++)      
246 
247         {   
248 
249               if(graph.arc[i][j]!=0)
250 
251              {
252 
253                 cout<<change(i)<<"-"<<change(j)<<":"<<graph.arc[i][j]<<endl;           
254 
255               }    
256 
257         }    
258 
259     }
260 
261 }
262 
263  
264 
265 int main()
266 
267 {    
268 
269      Graph graph;    
270 
271     CreateGraph(&graph);  
272 
273     DFSTraverse(graph);    
274 
275     BFSTraverse(graph);    
276 
277     show(graph);    
278 
279     return 0;
280 
281 }
原文地址:https://www.cnblogs.com/jiangnanyanyuchen/p/5661659.html