0

这是我的代码:

#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(); 

当编译器到达该行时它崩溃,为什么?

4

3 回答 3

3

您的构造函数访问 Raiz->HijoDerecho->Padre,但您从未为 HijoDerecho 分配变量。Nodo 的构造函数将其分配给 NULL。所以你取消引用一个空值

于 2013-04-14T23:33:21.507 回答
2

的构造函数Arbol创建一个新Nodo对象:

Raiz=new Nodo();

Nodo这使用将其成员设置为的默认构造函数NULL。然后,您尝试取消引用这些成员,例如:

Raiz->HijoDerecho->/* ... */;

取消引用空指针会导致未定义的行为。

于 2013-04-14T23:33:27.877 回答
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;

现在,即使您尝试解决该问题并HijoIzquierdo为此分配空间

Nodo *HijoIzquierdo = new Nodo ();

这将为 newNodo中的每个分配HijoIzquierdo新的Nodo。很快你就会耗尽内存。

所以问题不仅仅是语义上的。这基本上是一个设计问题。

于 2013-04-14T23:34:16.187 回答