意外的全局变量值; c ++中的skewheap实现

时间:2014-12-02 04:28:39

标签: c++ algorithm struct heap

我正在尝试为我的数据结构讲座实现skewheap。无论algotihm是否有效,我对代码本身存在问题。在VS 2012上运行代码但返回意外结果。在调试期间,全局变量(root)的值意外更改。在进入Insert(1)功能(第72行)之前,root的值是我期望的值(key=5right=NULLleft=NULL)。但是,当踩到Insert()时,root值字段会随机变化。接下来,到达第45行时:

node *p = &input;

root将值更改为(input->keynullnull)。在Dev C ++中,程序以SIGSEV关闭。通常,sistuation看起来类似,但在Print()中,指向leftright的指针会将值更改为某些意外值。这是什么原因?

#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;
}

1 个答案:

答案 0 :(得分:0)

inputInsert()范围内是本地的,因为它被声明为体内的自动变量。它没有动态存储持续时间,就像用new声明的对象一样。如果您的Union()方法返回p2(即,如果它从input返回一个节点),那么root仍将指向一个仍然被销毁的对象Insert()功能结束。这称为悬空指针

动态声明您的对象以防止这种情况发生:

node* input = new node(v, NULL, NULL);
node* p = input;
root = Union(root, p);