结构推理 编写一个实现连通图G的深度优先周游(从顶点V出发)的非递归函数。
【正确答案】(1)数据结构
   #define MAXVEX 20
   #define MAXNUM 100
   typedef struct{
       char vexs[MAXVEX];
       int mark[MAXVEX];
       int arcs[MAXVEX][MAXVEX];
       int n;
   }GraphMatrix;
   typedef GraphMatrix*PGraphMatrix;
   struct Parameters{
       PGrapbMatrix g;
       int v;
       int r;
   };
   typedef struct Parameters Para;
   struct Stack{
       Para s[MAXNUM];
       int t;
   };
   typedef struct Stack*PStack;
   (2)思路
   由于递归算法非常好写,先写出如下算法:
   void dfs(Graph g,Vertex v){
       Vertexv1;
       v.mark=TRUE;
       for(v1=firstAdjacent(g,v);v1!=NULL;v1=nextAdjacent(g,v,v1))
           if(v1.mark==FALSE)dfs(g,v1);
   }
   然后将其改造成用栈的非递归的算法即可。
   (3)算法
   int dfs_non_recursive(PGraphMatrix g,int v){
       PStack st;
       Parax;
       int v1:
       if((st=create())==NULL){
           printf("Not enough memory!\n");
           return 1;
       }
       x.g=g;
       x.v=v;
       x.r=1:
       push(st,x);
   Entry:
       x=top(st);
       pop(st);
       x.g->mark[x.v].=1;
       printf("/%c\n",x.g->vexs[x.v]);
       v1=firstAdjacent(x.g,x.v);
       if(v1!=-1){
           goto circle;
       }
   circle:
       if(x.g->mark[v1]==0){
         push(st,x);
           x.g=x·g
           x.v=v1:
           x.r=2;
           push(st,x);
           goto Entry;
       }
       else{
           v1=nextAdjacent(x.g,x.v,v1);
           if(v1!=-1){
               goto circle;
           }
         }
         push(st,x);
         goto Exit;
     Exit:
         x=top(st);
         pop(st);
         switch(x.r){
         case 1;
           free(st);
           return 0:
           break;
         case 2;
           goto L2;
           break;
         default;
           return 1;
           break;}
       L2:
         x=top(st);
         pop(st);
         v1=nextAdjacent(x.g,x.v,v1);
         if(v1!=-1){
           goto circle;
         }
       else{
           push(st,x);
           goto Exit;
       }
   }
【答案解析】从这个例子可以看出,递归过程实现的原理和从递归函数到非递归函数的转换方法类似。