我不太清楚如何描述问题 - 以及我的错误是否有任何名称。
当我运行程序时输入一些数字,例如5 tree.root-> pocz是第1个,后来是奇怪的数字。任何人都知道发生了什么以及如何修复它?
struct Node
{
int pocz;
int kon;
Node *left, *right, *up;
};
class AVL{
public:
Node *root;
void initiate(){
root = NULL;
}
bool insertNode(int poczPrz, int konPrz);
};
AVL tree;
//part of AVL insert function
bool AVL::insertNode(int poczPrz, int konPrz){
Node w;
w.pocz = poczPrz;
w.kon = konPrz;
Node *n = &w;
Node *x = tree.root;
Node *y, *z;
y = n->left = n->right = NULL;
while(x){
if(x->pocz == n->pocz){
delete n;
return false;
}
y = x;
x = (n->pocz < x->pocz) ? x->left : x->right;
}
if(!(n->up = y)){
cout << "We leave the function here\n";
tree.root = n;
return true;
}
if(n->pocz < y->pocz) y->left = n;
else y->right = n;
}
int main()
{
int n; cin >> n;
tree.initiate();
tree.insertNode(1,n);
cout <<"root->pocz: "<< tree.root->pocz <<endl; //prints 1
cout <<"root->pocz: "<< tree.root->pocz <<endl; //now prints sth like 2306050
return 0;
}
答案 0 :(得分:0)
在insertNode
中,w
对象具有自动存储空间,n
是指向它的指针。在对该函数的调用中,它将分配tree.root = n;
。函数返回后,对象被销毁,指针tree.root
悬空(指向解除分配的内存)。之后,取消引用诸如tree.root->pocz
之类的悬空指针将具有未定义的行为。您可以通过动态分配节点来解决这个问题。
答案 1 :(得分:0)
主要问题是n指向w,它是函数插入中的局部变量。在函数插入的末尾,w会自动删除。并且树中的指针指向空位置。在第一次cout指令中,偶然的事情没有覆盖w的先前内存位置。因此它打印1.那个内存位置被其他东西(来自cout调用)覆盖,因此它会打印垃圾。
现在的解决方案,使用Node * n = new Node;而不是将其设置为&amp; w。