这是我的代码:
#include <iostream>
using namespace std;
class Nodo{
public:
int valor;
Nodo *Padre;
Nodo *HijoIzquierdo;
Nodo *HijoDerecho;
Nodo(){
Padre=HijoIzquierdo=HijoDerecho=NULL;
valor=0;
}
};
class Arbol{
public:
Nodo *Raiz;
Arbol(){
Raiz=new Nodo();
Raiz->valor=5;
Raiz->HijoDerecho->Padre=Raiz->HijoIzquierdo->Padre=Raiz;
Raiz->HijoIzquierdo->valor=7;
Raiz->HijoIzquierdo->HijoIzquierdo->valor=18;
Raiz->HijoIzquierdo->HijoIzquierdo->Padre=Raiz->HijoIzquierdo;
Raiz->HijoDerecho->valor=15;
Raiz->HijoDerecho->HijoIzquierdo->valor=30;
Raiz->HijoDerecho->HijoIzquierdo->Padre=Raiz->HijoDerecho->HijoDerecho>Padre=Raiz->HijoDerecho;
Raiz->HijoDerecho->HijoDerecho->valor=8;
}
void Arbol::CantidadNodos(Nodo *actual=new Nodo(),int cantNodos){;
if(actual->HijoDerecho==NULL && actual->HijoIzquierdo==NULL){
cout<<"El arbol tiene: "<<cantNodos<<" nodos"<<endl;
return;
}
return Arbol::CantidadNodos(actual=actual->HijoIzquierdo,cantNodos++);
}
};
int main() {
int opcion;
Nodo *nodo=new Nodo();
Arbol *ar = new Arbol();
cout<<"Ingrese la opcion que desea realizar"<<endl;
cin>>opcion;
if(opcion==1){
ar->CantidadNodos(ar->Raiz,0);
}
}
当我编译它时,构建成功,但它没有运行,我尝试放一些couts来查看问题所在,问题出在以下几行:
Arbol *ar = new Arbol();
当编译器到达该行时崩溃,为什么?
答案 0 :(得分:3)
你的构造函数访问Raiz-&gt; HijoDerecho-&gt; Padre,但你从未为HijoDerecho分配变量。 Nodo的构造函数将其赋值为NULL。所以你要取消引用空值
答案 1 :(得分:2)
Arbol
的构造函数创建了一个新的Nodo
对象:
Raiz=new Nodo();
这使用Nodo
的默认构造函数,将其成员设置为NULL
。然后,您尝试取消引用这些成员,例如:
Raiz->HijoDerecho->/* ... */;
取消引用空指针会导致未定义的行为。
答案 2 :(得分:1)
您需要修改要求。那就是说。
class Nodo{
public:
int valor;
Nodo *Padre;
Nodo *HijoIzquierdo;
Nodo *HijoDerecho;
Nodo(){
Padre=HijoIzquierdo=HijoDerecho=NULL;
valor=0;
}
};
这个课不是你想要的。首先,所有成员都是st到NULL。没有为他们分配任何东西。所以这一行及其之后的所有内容都不合法,因为HijoDerecho
是null ptr。
Raiz->HijoDerecho->Padre=Raiz->HijoIzquierdo->Padre=Raiz;
现在,即使您尝试修复此问题并为此{<1}}分配空间
HijoIzquierdo
这将为新Nodo *HijoIzquierdo = new Nodo ();
中的每个Nodo
分配新的HijoIzquierdo
。很快你就会失去记忆。
所以问题不只是语义问题。这基本上是一个设计问题。