在函数参数中通过引用传递 bool 变量

pass bool variable by reference in function argument

我试图在下面的函数参数中包含一个布尔标志,以查看当前值的树结构中是否已经存在一个值。

VLTreeNode *addNewNode(AVLTreeNode *currentNode, int k, int v, bool *ifExist)
{
    if (currentNode == NULL)
    {
        return newAVLTreeNode(k, v);
    }
    if (k == currentNode->key && v == currentNode->value)
    {
        *ifExist = true;
        return currentNode;
    }
    else if ((k == currentNode->key && v < currentNode->value) || k < currentNode->key)
    {
        currentNode->left = addNewNode(currentNode->left, k, v, &ifExist);
        currentNode->left->parent = currentNode;
    }
    else if ((k == currentNode->key && v > currentNode->value) || k > currentNode->key)
    {
        currentNode->right = addNewNode(currentNode->right, k, v, &ifExist);
        currentNode->right->parent = currentNode;
    }
}

这个函数的调用如下:

    bool ifExist = false;
    Tree->root = addNewNode(Tree->root, k, v, &ifExist);
    
    if (ifExist)
    {
        T->size++;
    }

它不起作用...有人可以给我一些提示代码中出了什么问题吗?非常感谢。

在 addNewNode 中,在最后两个 else if 块中,您将传入 &ifExist。但是 ifExist 已经是一个 bool* 了,应该直接传入 ifExist.

我不确定,但是 return 语句可能只在第一个 if 块中是可以的,只要它们涵盖了递归函数的所有可能的基本情况。 [我没有想清楚,return 语句在所有分支中都是绝对必要的 - 我的意思是仅在基本情况下才需要将 ifExist 设置为 true ...]

但是,在 addNewNode 中通过引用传递 ifExist(现在有效的 bool **)绝对是不正确的。

编辑:澄清一下,在你最外层的 addNewNode 调用中你有...

bool ifExist = false;
Tree->root = addNewNode(Tree->root, k, v, &ifExist);

...您确实需要通过引用传入。 但是在 addNewNode 中,你的最后两个 if else 块应该是

else if ((k == currentNode->key && v < currentNode->value) || k < currentNode->key)
{
    currentNode->left = addNewNode(currentNode->left, k, v, ifExist);
    currentNode->left->parent = currentNode;
}
else if ((k == currentNode->key && v > currentNode->value) || k > currentNode->key)
{
    currentNode->right = addNewNode(currentNode->right, k, v, ifExist);
    currentNode->right->parent = currentNode;
}

我建议改为:

bool exists = false;
bool * ifExist = &exists;
Tree->root = addNewNode(Tree->root, k, v, ifExist);

那样的话,addNewNode 参数看起来在任何地方都是一致的...这将防止将来由于复制粘贴而发生事故。