所以我已经设法解决了我的问题,但我无法理解究竟是什么问题。我之前的代码是:
BinaryTree removePrivate(int x, BinaryTree *node)
{
if ((*node).m_key < x)
*(*node).m_right = removePrivate(x, (*node).m_right);
else if ((*node).m_key > x)
*(*node).m_left = removePrivate(x, (*node).m_left);
else
node= NULL ;
return *node;
}
它编译得很好,但是当它被调用时,事情会变得很糟糕。返回*节点访问冲突;
我已将其更改为:
[*] = *已被添加,[] = *已被删除
BinaryTree [*]removePrivate(int x, BinaryTree *node)
{
if ((*node).m_key < x)
[ ](*node).m_right = removePrivate(x, (*node).m_right);
else if ((*node).m_key > x)
[ ](*node).m_left = removePrivate(x, (*node).m_left);
else
node= NULL ;
return [ ]node;
}
现在一切正常,但我真的不能100%确定为什么这样更好。
答案 0 :(得分:2)
当您编写(*node)
时,您将取消引用指针node
。如果您使用*(*node)
,就像您最初使用的那样,您将取消引用(*node)
,这是取消引用的node
。因此,您正在取消引用两次,这没有意义,因为node
因为指向BinaryTree
对象而不是另一个指针。
以更简单的形式:
*node = dereference node
*(*node) = dereference *node = dereference node twice