0

次のコードに問題があります。私は独学で C++ を学ぼうとしている Java 開発者です。主に main() の私のコードは、ルート ノードに何も挿入していません。誰でも私を助けることができますか?私のポインターには何か問題があると確信しています。

class Node{
    public:
        Node* left;
        Node* right;
        int data;

    Node(int n){
        data = n;
        right = NULL;
        left = NULL;
    }
};

class BST{

    Node* root;

    public:

    BST(){
        root = NULL;
    }

    void insert(int e){
        pinsert(root, e);
    }

    void pinsert(Node* sr, int e){
        if(sr == NULL){
            sr = new Node(e);
        }
        else{
            if((sr->data) > e ){
                pinsert(sr->left, e);
            }
            else{
                pinsert(sr->right, e);
            }
        }
    }
};


int main(){
    BST tree;
    tree.insert(6);
    tree.insert(7);
}
4

3 に答える 3

6

値で渡しsr、それに代入します。これはあなたを変えませんroot。代わりに参照渡しします。

void pinsert( Node*& sr, int e)
于 2012-09-30T19:52:42.973 に答える
3

挿入の問題は、空のリストから始める場合です。関数にaNode *を渡すpinsertと、引数はvalueで渡されるため、関数はポインターのコピーになります。ポインターがNULLの場合、ポインターを新しいノードを指すように変更します。にはポインターのコピーしかないためpinsert、これはポインターのコピーのみを変更します。関数が戻るとき、ポインターとリストは変更されていません。

これを回避するには、ポインターへの参照を渡します。

void pinsert(Node *&sr, int e)

これで、コードの残りの部分を変更する必要がなくなり、関数でポインターを変更できます。

この問題は、Java でオブジェクト参照を渡すことに似ています。フィールドを設定してメソッドを呼び出すことによって、オブジェクトの内容を変更できますが、引数を新しいオブジェクトまたは に変更することはできませんnull

于 2012-09-30T19:56:54.570 に答える
2

問題は、root常に NULL であり、何も割り当てないことです。

電話pinsert(root, e)してからこれを行うと:

void pinsert(Node* sr, int e){
    if(sr == NULL){
        sr = new Node(e);
    }

rootroot のコピーを送信し、 NULL のままではなく、そのコピーに割り当てます。ポインターを参照 ( ) で送信する必要がありますvoid pinsert(Node** sr, int e)- 2 つの「星」またはvoid pinsert(Node*& sr, int e).

于 2012-09-30T19:55:05.697 に答える