指针问题

时间:2011-09-24 00:08:28

标签: c++ pointers

我正在制作二进制搜索树,我按如下方式实现了插入节点代码:

BSTNode * BST::Insert(const std::string & v){
    BSTNode * node = new BSTNode(v);
    if (root == NULL){
        root = node;
    } else if (root->value.compare(v) > 0) {
        Insert(root->left, node);
        //recursive insert the method
    } else if (root->value.compare(v) < 0) {
        Insert(root->right, node);
    } else {
        delete node;
        return NULL;
    }
    size++;
    return node;
}

我的头文件中的递归插入方法(它具有私有访问权限):

void Insert(BSTNode* current, BSTNode* node){
    if (current == NULL){
        current = node;
    } else if (current->value == node->value){
        delete node;
    } else if (current->value < node->value) {
        Insert(current->left, node);
    } else if (current->value > node->value){//if (parent->value < node->value) {
        Insert(current->right, node);
    }
}

当递归函数设置指针然后返回时,我对指针的更改不会停留。

2 个答案:

答案 0 :(得分:3)

这里的问题是current是一个局部变量,带有指针值的副本。它与您传入的变量不同。如果要在适当的位置修改指针,您的方法应接受指向指针的指针或指针的引用。最简单的方法是将current修改为对指针的引用。结果代码如下所示:

void Insert(BSTNode* &current, BSTNode* node){
    if (current == NULL){
        current = node;
    } else if (current->value == node->value){
        delete node;
    } else if (current->value < node->value) {
        Insert(current->left, node);
    } else if (current->value > node->value){//if (parent->value < node->value) {
        Insert(current->right, node);
    }
}

一般来说,你应该记住,指针只是告诉你某些内存位置的值。所以他们真的只是数字。当它们被传递给函数时,除非有引用,否则它们会被值传递。所以你的函数只看到数字,而不是包含数字的变量。

答案 1 :(得分:1)

void Insert(BSTNode*& current, BSTNode* node)

是给定函数的正确原型。没有别的东西需要改变。 Keith很好地描述了这是必要的原因。

我还要补充一点,一般情况下你应该警惕有条件地删除作为函数参数传递的指针 - 你要对该函数外部的代码施加负担,以确定它所引用的内存地址是否仍然有效或不。请考虑使用boost的shared_ptr。