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. }