【正确答案】(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;
}
}
【答案解析】从这个例子可以看出,递归过程实现的原理和从递归函数到非递归函数的转换方法类似。