C ++指针麻烦

时间:2012-09-30 19:49:18

标签: c++ pointers

我遇到以下代码时遇到问题。我是一名java开发人员,试图自学c ++。主要是我在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);
}

3 个答案:

答案 0 :(得分:6)

您按值sr传递并分配给它。这不会改变您root。通过引用传递它:

void pinsert( Node*& sr, int e)

答案 1 :(得分:3)

插入的问题是当您以空列表开头时。当您将Node *传递给pinsert函数时,参数会按值传递,因此您的函数会以指针的副本结束。当指针为NULL时,您将指针更改为指向新节点。由于您只在pinsert中有指针的副本,因此这只会更改指针的副本。当函数返回时,指针和列表不变。

引用传递给指针以解决此问题:

void pinsert(Node *&sr, int e)

现在你的代码的其余部分不需要改变,你的函数可以改变指针。

此问题类似于在java中传递对象引用:您可以通过设置字段和调用方法来更改对象的内容,但是您无法将参数更改为新对象,或null

答案 2 :(得分:2)

问题是root始终为NULL,您从不为其分配任何内容。

当您致电pinsert(root, e)然后执行此操作时:

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

您发送root副本并分配给该副本,而不是保留为NULL的root。您需要通过引用(void pinsert(Node** sr, int e))发送指针 - 注意2'星'或void pinsert(Node*& sr, int e)