C++ Can';我的二进制搜索树实现没有发现指针错误? root; 节点*prev; 节点新节点(i); 如果(cur==0) { 此->根=&新节点; cout value left=&new_节点; cout值 { cur=cur->right; 如果(cur==0) { 上一个->右=&新建节点; cout值(左); cout value
当我插入5时,我得到了正确的输出,但当我插入2时,它表示:C++ Can';我的二进制搜索树实现没有发现指针错误? root; 节点*prev; 节点新节点(i); 如果(cur==0) { 此->根=&新节点; cout value left=&new_节点; cout值 { cur=cur->right; 如果(cur==0) { 上一个->右=&新建节点; cout值(左); cout value,c++,pointers,C++,Pointers,当我插入5时,我得到了正确的输出,但当我插入2时,它表示: 在2的左侧插入2。 节点类: class Node { // Let BST directly access members. friend class BST; public: // Constructor Node(int i); int getValue(); protected: int value; Node *left; Node *right; }; // Construc
在2的左侧插入2。
节点类:
class Node
{
// Let BST directly access members.
friend class BST;
public:
// Constructor
Node(int i);
int getValue();
protected:
int value;
Node *left;
Node *right;
};
// Constructor
Node::Node(int i)
{
value = i;
left = 0;
right = 0;
}
int Node::getValue()
{
return value;
}
BST等级:
class BST
{
public:
BST();
void insert(int i);
void print();
void print(Node *n);
private:
// root of the tree
Node *root;
};
BST::BST()
{
root = 0;
}
void BST::insert(int i)
{
Node *cur = this->root;
Node *prev;
Node new_node(i);
if(cur == 0)
{
this->root = &new_node;
cout << "Root is empty, insert " << this->root->value << " as root." << endl;
return;
}
while(cur != 0)
{
prev = cur;
if(i <= cur->value)
{
cur = cur->left;
if(cur == 0)
{
prev->left = &new_node;
cout << "Inserted " << prev->left->value << " to the left of " << prev->value << endl;
return;
}
}
else if(i > cur->value)
{
cur = cur->right;
if(cur == 0)
{
prev->right = &new_node;
cout << "Inserted " << prev->right->value << " to the right of " << prev->value << endl;
return;
}
}
}
}
void BST::print()
{
print(this->root);
}
void BST::print(Node *n)
{
if(n == 0)
{
return;
}
print(n->left);
cout << n->value << " " << endl;
print(n->right);
}
BST类
{
公众:
BST();
无效插入(int i);
作废打印();
作废打印(节点*n);
私人:
//树根
节点*根;
};
BST::BST()
{
根=0;
}
void BST::insert(int i)
{
节点*cur=this->root;
节点*prev;
节点新节点(i);
如果(cur==0)
{
此->根=&新节点;
cout value left=&new_节点;
cout值
{
cur=cur->right;
如果(cur==0)
{
上一个->右=&新建节点;
cout值(左);
cout value您正在存储本地对象的地址:
Node new_node(i);
当本地对象超出范围时,进一步使用该地址是未定义的行为
你想要:
Node* new_node = new Node(i);
等等。您正在存储本地对象的地址:
Node new_node(i);
当本地对象超出范围时,进一步使用该地址是未定义的行为
你想要:
Node* new_node = new Node(i);
等等。节点新节点(i)
这将创建一个局部变量。稍后您将其地址分配给根
。请注意,使用在其作用域之外的局部变量地址写入的数据将调用未定义的行为。您需要分配动态内存,然后注意将其释放。节点新节点(i)
这将创建一个局部变量。稍后您将其地址分配给根
。请注意,使用在其作用域之外的局部变量地址处写入的数据将调用未定义的行为。您需要分配动态内存,然后注意取消分配它。您在执行过程中是否逐行执行了操作使用调试器执行ng?听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看它与预期的偏差。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:您是否注意到您没有这样做分配你的节点?你通过insert
方法中的值创建它们,一旦你的代码退出,它们就会被删除。这可能与你的问题无关,但以后它会咬到你。@maddening:我想这正是问题所在。症状适合。@maddening啊,对了,所以我甚至没有正确创建节点……我想t节点新节点(i)在C++中创建对象是足够的。谢谢。你在使用调试器的执行过程中逐行地执行了吗?听起来你可能需要学习如何使用调试器来完成代码。用一个好的调试器,你可以逐行执行程序,看看它偏离了你所期望的地方。这是一个基本的问题。进一步阅读:你注意到你没有分配你的节点吗?你通过insert
方法中的值创建它们,一旦你的代码退出,它们就会被删除。这可能与你的问题无关,但它会在以后咬你。@maddening:我想这正是专业的这些症状很适合。@我真的没有创建我的节点……我认为节点NeXiNoLead(I)< /C> >在C++中创建对象是足够的。谢谢。是的,这是。树中的地址可能是完全相同的,因此OP在“未定义”时看到的“替换值”行为。解除对它们的引用。是的,这是。树中的地址可能都是相同的,因此OP在[undefinedly]时看到的“替换值”行为解除对它们的引用。谢谢。我只是想创建一个节点,然后将根指向该节点,而不必创建另一个指针。有没有办法这样做?谢谢。@BelegNeurion:没有,你需要“创建另一个指针”。如果没有“创建另一个指针”,你怎么能在树中有多个不同的指针?这就像问如何拥有十辆车,但实际上只买了一辆。目前,你租了一辆车十次,还没开过一次就把车还给了租赁公司,更不用说十次了。:)请停止向人们推荐新T
。现在是2015年。@KonradRudolph,如果你的车里还隐藏着一些洞察力的话这个注释,你需要一些链接或解释。@JSF我希望它是不言自明的:不要在你的代码中使用new
,这是不好的。使用合适的智能指针和生成器函数(例如make_unique
)或者其他一些内存管理结构。现在几乎没有理由再使用new
,当然也没有了。谢谢。我正试图创建一个节点,然后将根指向该节点,而不必创建另一个指针。有什么方法可以这样做吗?谢谢。@BelegNeurion:不,你需要这样做“创建另一个指针”。如果不“创建另一个指针”,你怎么能在树中有多个不同的指针"?这就像问如何拥有十辆车,但实际上只买了一辆。目前,你租了一辆车十次,还没开过一次就把车还给了租赁公司,更不用说十次了。:)请停止向人们推荐新T
。现在是2015年。@KonradRudolph,如果你的车里还隐藏着一些洞察力的话这个注释,你需要一些链接或解释。@JSF我希望它是不言自明的:不要在你的代码中使用new
,这是不好的。使用合适的智能指针和生成器函数(例如make_uniqu