圖的遍歷

 

  1. /*******************************************************************************/  
  2. bool visited[MAXVEX];//訪問標識數組  
  3. void DFS(MGraph MG,int i){//鄰接矩陣的深度優先遞歸算法  
  4.     int j; 
  5.     visited[i] = true;//修改i的訪問標識  
  6.     printf("%c ",MG.vexs[i]);//打印頂點,也可以換成其他操作  
  7.     for(j=0;j<numVertexes;j++){//對訪問的結點的鄰接點進行遞歸調用  
  8.        if(MG.arc[i][j]==1 && !visited[j]){//如果相關的邊存在,而且結點還沒有被訪問,就遞歸  
  9.            DFS(MG,j); 
  10.        } 
  11.     } 
  12. void DFSTraverse(MGraph MG){ 
  13.     int i; 
  14.     for(i=0;i<MG.numVertexes;i++){//初始化訪問標識數組,均設置成未訪問狀態  
  15.         visited[i] = false
  16.     } 
  17.     for(i=0;i<MG.numVertexes;i++){// 
  18.         if(!visited[i]){//如果是連通圖,只會執行一次  
  19.             DFS(MG,i); 
  20.         } 
  21.     } 
  22. /*******************************************************************************/ 
  23. void DFS(GraphAdjList GL,int i){//鄰接表的深度優先遞歸算法  
  24.     EdgeNode *p; 
  25.     visited[i] = true
  26.     printf("%c ",GL->adjList[i].data);//打印,也可以是其他操作  
  27.     p = GL->adjList[i].firstedge;//指向下一個鄰接點  
  28.     while(p){//如果不爲空  
  29.         if(!visited[p->adjvex])//如果還沒有被訪問過  
  30.             DFS(GL,p->adjvex);//遞歸調用  
  31.         } 
  32.         p = p->next; 
  33.     } 
  34. void DFS(GraphAdjList GL){ 
  35.     int i; 
  36.     for(i=0;i<GL->numVertexes;i++){//初始化所有都是未訪問狀態  
  37.         visited[i] = false
  38.     } 
  39.     for(i=0;i<GL->numVertexes;i++){ 
  40.         if(!visited[i]){//如果是連通圖,只會執行一次  
  41.             DFS(GL,i); 
  42.         } 
  43.     } 
  44. /*******************************************************************************/ 
  45. void BFSTraverse(MGraph MG){//鄰接矩陣的廣度優先遞歸算法  
  46.     int i,j; 
  47.     Queue Q;//廣度遍歷相當於層次遍歷,需要一個隊列  
  48.     for(i=0;i<MG.numVertexes;i++){ 
  49.         visited[i] = false
  50.     } 
  51.     initQueue(&Q); 
  52.     for(i=0;i<MG.numVertexes;i++){ 
  53.         if(!visited[i]){//如果是連通圖,僅執行一次這句話  
  54.             visited[i] = true;//先打印  
  55.             printf("%c",G.vexs[i]);// 
  56.             EnQueue(&Q,i);//後入隊  
  57.             while(!QueueEmpty(Q)){ 
  58.                 DeQueue(&Q,&i);//出隊  
  59.                 for(j=0;j<MG.numVertexes;j++){ 
  60.                     if(MG.arc[i][j] == 1 && !visited[j]){//相關的鄰接點如果還沒有訪問就入隊  
  61.                         visited[j] = true;//先打印  
  62.                         printf("%c",MG.vex[j]); 
  63.                         EnQueue(&Q,j);//後入隊  
  64.                     } 
  65.                 } 
  66.             } 
  67.         } 
  68.     } 
  69. /*******************************************************************************/ 
  70. void BFSTraverse(GraphAdjList GL){//鄰接表的廣度優先遞歸算法  
  71.     int i; 
  72.     EdgeNode *p; 
  73.     Queue Q; 
  74.     for(i=0;i<GL->numVertexes;i++){ 
  75.        visited[i] = false
  76.     } 
  77.     initQueue(&Q); 
  78.     for(i=0;i<GL->numVertexes;i++){ 
  79.         if(!visited[i]){ 
  80.             visited[i] = true
  81.             printf("%c",GL->adjList[i].data); 
  82.             EnQueue(&Q,i); 
  83.             while(!QueueEmpty(Q)){ 
  84.                 DeQueue(&Q,&i); 
  85.                 p = GL->adjList[i].firstedge;//找到當前結點指向邊表的頭指針  
  86.                 while(p){ 
  87.                     if(!visited[p->adjvex]){//如果沒有訪問,一次訪問併入棧  
  88.                         visited[p->adjvex] = true
  89.                         printf("%c",GL->adjList[p->adjvex].data); 
  90.                         EnQueue(&Q,p->adjvex); 
  91.                     } 
  92.                     p=p->next;//指針指向下一個鄰接點  
  93.                 } 
  94.             } 
  95.         } 
  96.     } 
  97. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章