C++:我的新节点在哪里
C++: where are my new nodes?
我正在尝试使用二进制树在集合中添加元素:
bool TreeSet::add(const string &str)
{
if (treesize == 0)
{
TreeNode->data = str;
treesize++;
return true;
}
else
{
if (str < TreeNode->data)
return insert(TreeNode->left, str);
else if (str > TreeNode->data)
return insert(TreeNode->right, str);
else
return false;
}
return false;
}
bool TreeSet::insert(TREE *node, const string &str) //private
{
if (node == NULL)
{
node = new TREE;
node->data=str;
node->left = NULL;
node->right = NULL;
treesize++;
return true;
}
else
{
if (str < node->data)
return insert(node->left, str);
else if (str > node->data)
return insert(node->right, str);
else
return false;
}
return false;
}
正如你所看到的,我想在insert内部初始化一个TREE结构,当我完成这项工作时,我想将它与树的左节点或右节点链接。
但是当我gdb这个时,只能构造一个级别的树(顶层),无论我试图添加多少字符串,*left
和*right
节点都是NULL
。为什么?
我的树是:
typedef struct tree
{
string data;
tree *left;
tree *right;
} TREE;
bool TreeSet::insert(TREE *node
应该是
bool TreeSet::insert(TREE *&node
指针也可以通过引用传递,如果您打算直接修改它们,则应该通过引用传递。否则,您通过副本,现在有两个指针指向同一位置。当您将复制的指针用于new
以获得一些数据时,它现在指向一个新的内存位置,使您的原始指针仍为NULL
(C++11中的nullptr
)
附带说明一下,当构建树时,您可能应该将left
和right
初始化为NULL
(C++11中的nullptr
):
typedef struct tree
{
string data;
tree *left;
tree *right;
tree():left(NULL),right(NULL){}
} TREE;
小时>当您在函数insert
中传递指针作为参数时,如下所示:
bool TreeSet::insert(TREE* node, const string& str);
则指针被复制到参数CCD_ 12中。将node
指向其他对象只会指向指针的本地副本。从调用站点传递到函数的指针是未更改的。
node = new TREE; // Points local variable 'node' to newly allocated data.
// When the function goes out of scope 'node' will be destroyed
// and the memory will be leaked.
要更改原始调用站点指针指向的位置,请通过引用获取参数(或添加另一个间接级别):
bool TreeSet::insert(TREE*& node, const string& str);
通过引用参数,可以确保访问的是调用站点变量,而不是本地副本。
相关文章:
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 为什么我的节点在我设置后被设置为 nullptr = 新节点?
- 在哪里声明结构运算符重载
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- C++泛型类错误,问题出在哪里?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 将类作为主要参数的语法在哪里需要?
- 在下面的函数中,我想反转链表,但我想知道在哪里可以删除节点
- C++:我的新节点在哪里