在函数参数中通过引用传递 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 参数看起来在任何地方都是一致的...这将防止将来由于复制粘贴而发生事故。
我试图在下面的函数参数中包含一个布尔标志,以查看当前值的树结构中是否已经存在一个值。
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 参数看起来在任何地方都是一致的...这将防止将来由于复制粘贴而发生事故。