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);
    }
}

そして、それをコンパイルすると、ビルドは成功しますが、実行されません。問題がどこにあるかを確認するためにいくつかのカウントを入れてみました。問題は次の行にあります。

Arbol *ar = new Arbol(); 

コンパイラがその行に到達すると、クラッシュします。なぜですか?

4

3 に答える 3

3

あなたのコンストラクターは Raiz->HijoDerecho->Padre にアクセスしますが、HijoDerecho に変数を割り当てたことはありません。Nodo のコンストラクターは、それを NULL に割り当てました。したがって、null値を逆参照しています

于 2013-04-14T23:33:21.507 に答える
2

のコンストラクターはArbol、新しいNodoオブジェクトを作成します。

Raiz=new Nodo();

Nodoこれは、メンバーを に設定するデフォルトのコンストラクターを使用しますNULL。次に、これらのメンバーの逆参照を試みます。たとえば、次のようにします。

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

null ポインターを逆参照すると、未定義の動作が発生します。

于 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のそれぞれに対して新しい割り当てが維持されます。そしてすぐにメモリ不足になります。HijoIzquierdoNodo

したがって、問題はセマンティックだけではありません。基本的に設計上の問題です。

于 2013-04-14T23:34:16.187 に答える