我一直在尝试构建一个2-3节点。添加功能正常工作,到目前为止我已经确认。唯一的问题是find函数,它被调用来查找2-3节点内的元素。它似乎根本不起作用。其中的匹配指针根本不会从find_rec
方法获取返回的值,即使我已经分配了它。只要调用函数,它就会得到一个新的给定地址,我不知道为什么会这样做。谁能帮我吗 ?并告诉我我做错了什么?谢谢
**LValue and RValue**
E LValue() {return _first._value;}
E RValue() {return _second._value;}
**find function**
// Assuming this set contains an element y such that (x == y),
// return a reference to y. Such a y must exist; if it does not an
// assertion will fail.
E& find(E& x)
{
// the match pointer is supposed to take
// returned pointer from the find_rec function
// Yet, it is not doing that at all.
E* match = find_rec(x, _root);
assert(match != nullptr);
return *match;
}
**find_rec function**
// Helper function: find recursion
// function returns a pointer
E* find_rec(E& x, BNode<E>* root)
{
if(root == nullptr)
return nullptr;
else
{
// 2-node
if(!root->IsThree())
{
if(x == root->LValue())
return &root->LValue();
else if (x < root->LValue())
return find_rec(x, root->GetLeft());
else
return find_rec(x, root->GetRight());
}
// 3-node
else
{
if(x == root->LValue())
return &root->LValue();
else if(x == root->RValue())
return &root->RValue();
else if(x < root->LValue())
return find_rec(x, root->GetLeft());
else if(x < root->RValue())
return find_rec(x, root->GetMiddle());
else
return find_rec(x, root->GetRight());
}
}
}
答案 0 :(得分:1)
从代码中可以看出,您正在返回本地临时地址。
我无法确定,因为LValue()
方法声明不可见,但如果它按值返回节点内容而不是引用,则find_rec
函数将返回垃圾(地址为临时分配在堆栈上。)
顺便说一句,体面的编译器应该为此发出警告。
答案 1 :(得分:1)
当树中不存在所需的值时,代码显然能够返回nullptr。
当它进入那种情况时,断言将触发并且*match
返回将失败。我希望您需要更改函数签名以提供允许这种情况的返回类型。