【发布时间】:2018-08-20 02:49:18
【问题描述】:
我为带有堆栈的递归 ToH 算法编写了以下代码,但无法弄清楚它失败的原因。没有编译错误,但是一旦程序真正开始运行,它会“思考”一点然后崩溃。有什么想法吗?
相关代码:
void algoritmoDeTorres(int numDiscos, pila &origen, pila &aux, pila &meta)
{
GotoXY(0,0);
if(numDiscos==1)
{
int item;
item = origen.pop(); //crashes in this function
lista laux;
laux.insertaInicio(item);
meta.push(item);
return;
}
algoritmoDeTorres(numDiscos - 1, origen, aux, meta);
origen.imprimePila();
cout << endl;
aux.imprimePila();
cout << endl;
meta.imprimePila();
algoritmoDeTorres(numDiscos -1, aux, meta, origen);
}
class pila
{
private:
lista lisst;
public:
int pop()
{
int tam;
tam = lisst.regresaItem();
lisst.borraInicio();
return tam;
}
};
class lista
{
private:
nodo *cabeza;
public:
lista()
{
cabeza = NULL;
}
void borraInicio()
{
nodo * aux;
aux = cabeza->next;
delete cabeza;
cabeza = aux;
}
int regresaItem()
{
return cabeza->item; //crashes here specifically
}
};
class nodo
{
public:
int item;
nodo* next;
nodo(int a,nodo * siguiente)
{
item = a;
next = siguiente;
}
};
int main()
{
pila ORIGEN,AUX,META;
ORIGEN.push(3);
ORIGEN.push(2);
ORIGEN.push(1);
algoritmoDeTorres(ORIGEN.Size(),ORIGEN,AUX,META);
ORIGEN.destruirPila();
AUX.destruirPila();
META.destruirPila();
return 0;
}
PS:对不起,西班牙语,我的课是西班牙语,但许多想法仍然用英语提出,因此是时髦的语言。
必要时提供重要的翻译:
aloritmoDeTorres - 塔算法
迪斯科 - 磁盘
pila - 堆栈
起源 - 起源
元 - 目的地/目标
InsertaInicio - 插入(在)开始
印记 - 打印
Regresa - 返回
Borra - 擦除/删除
Nodo - 节点
Cabeza - 头
Siguiente - 下一个
【问题讨论】:
-
谢谢你,我对不恰当的帖子很不好,不知道,我现在知道了。
-
这段代码,确切地,正如所呈现的那样,不可能编译,更不用说运行到故障点了。缺少的成员函数个数、函数和类的顺序等
-
@WhozCraig 在调试手表之后我发现代码失败的地方(分段错误),它发生在提供的代码中,我没有包括其余部分,因为它与失败无关(我不认为)。 pop 函数在直接应用于 main 时实际上可以工作,所以我认为在提供的代码中从一个类传递到另一个类时会发生错误(我只是不确定为什么)。
-
aux->item = ...看看那个aux变量。aux指向 nothing 确定。事实上,它已在上面的行中声明,并且从未设置为指向 anything。你幸运它崩溃了,因为至少你可以看到问题出在哪里。仅供参考,这个问题至少在另一个地方重复出现。这是您需要检查指针如何工作的标志。
标签: c++ algorithm recursion stack towers-of-hanoi