void ImprimeCaminho(TipoValorVertice Origem, TipoValorVertice v,
TipoGrafo *Grafo, int * Dist, TipoCor *Cor,
int *Antecessor)
{ if (Origem == v) { printf("%d ", Origem); return; }
if (Antecessor[v] == -1)
printf("Nao existe caminho de %d ate %d", Origem, v);
else { ImprimeCaminho(Origem,Antecessor[v],
Grafo, Dist, Cor, Antecessor);
printf("%d ", v);
}
}
答案 0 :(得分:1)
您显示的功能需要某种堆栈,您可以使用数组实现。这是一个使用固定大小数组的示例,其中assert()
它永远不会溢出 - 这大致相当于原始的递归算法,因为本身没有错误检查也没有过多的递归,但是你显然可以用一些更强大的错误处理(甚至是调整大小的动态分配)来代替它。
void ImprimeCaminho(TipoValorVertice Origem, TipoValorVertice v,
TipoGrafo *Grafo, int * Dist, TipoCor *Cor,
int *Antecessor)
{
int Vertices[MAX_VERTEX];
int n = 0;
while (1)
{
if (Origem == v)
{
printf("%d ", Origem);
break;
}
if (Antecessor[v] == -1)
{
printf("Nao existe caminho de %d ate %d", Origem, v);
break;
}
assert(n < sizeof Vertices);
Vertices[n++] = v;
}
while (n > 0)
printf("%d ", Vertices[--n]);
}