我正在尝试为我的数据结构讲座实现skewheap。无论algotihm是否有效,我对代码本身存在问题。在VS 2012上运行代码但返回意外结果。在调试期间,全局变量(root
)的值意外更改。在进入Insert(1)
功能(第72行)之前,root
的值是我期望的值(key=5
,right=NULL
,left=NULL
)。但是,当踩到Insert()
时,root
值字段会随机变化。接下来,到达第45行时:
node *p = &input;
root
将值更改为(input->key
,null
,null
)。在Dev C ++中,程序以SIGSEV
关闭。通常,sistuation看起来类似,但在Print()
中,指向left
和right
的指针会将值更改为某些意外值。这是什么原因?
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
int key;
node* right;
node* left;
node(int _key, node* _right, node* _left)
{
key = _key;
right = _right;
left = _left;
}
};
node* root = NULL;
node* Union(node* p1, node* p2)
{
node* p;
if (!p1)
return p2;
if (!p2)
return p1;
if (p1->key > p2->key) {
p = p1;
Union(p1->right, p2);
} else {
p = p2;
Union(p1, p2->right);
}
swap(p->left, p->right);
return p;
}
void Insert(int v)
{
node input = node(v, NULL, NULL);
node* p = &input;
root = Union(root, p);
}
void Print(node* v)
{
if (!v) {
return;
}
if (v->right) {
Print(v->right);
}
cout << v->key << endl;
if (v->left) {
Print(v->left);
}
}
int main()
{
Insert(5);
Insert(1);
cout << root->key;
system("pause");
return 0;
}
答案 0 :(得分:0)
input
在Insert()
范围内是本地的,因为它被声明为体内的自动变量。它没有动态存储持续时间,就像用new
声明的对象一样。如果您的Union()
方法返回p2
(即,如果它从input
返回一个节点),那么root
仍将指向一个仍然被销毁的对象Insert()
功能结束。这称为悬空指针。
动态声明您的对象以防止这种情况发生:
node* input = new node(v, NULL, NULL);
node* p = input;
root = Union(root, p);