【问题标题】:Member function returns the previous value of a variable成员函数返回变量的前一个值
【发布时间】:2015-10-13 13:40:07
【问题描述】:

我正在构建一个 AVL 树程序。我陷入了一个相当容易的情况,但很难理解哪里出了问题。我认为这是程序的错而不是我的原因是因为我在它之前有完全相同的类函数,“左”和“右”交换了,它工作得很好......

如您所见,该函数返回temproot 指针,如果root==temp 等于temp2。有趣的是,虽然当我在返回之前测试打印temproot 的值(在我的示例中为 15),但返回的实际值仍然是 20(temproot 的先前值) .我检查了一切。好像没有返回新获取的值……可能是什么问题?

更具体地说,确切的代码是这样的:

//structure
struct avlnode
{
    int data;
    avlnode * left;
    avlnode * right;
}* root;

//class function
avlnode * Tree::RL_rotation (avlnode * temp)
{
    avlnode * temproot = temp;
    avlnode * temp1= new avlnode;
    temp1=temp->right;
    avlnode * temp2= new avlnode;
    temp2=temp1->left;

    temp1->left=temp2->right;
    temp2->right=temp1;
    temp->right=temp2;

    temp->right=temp2->left;
    temp2->left=temp;

    if (root==temp)
    {
        root=temp2;
        temproot=temp2;
    }
    cout << "temproot= " << temproot->data << endl;
    return temproot;
}

【问题讨论】:

  • 如果你说的是真的,那可能是缓冲区溢出(内存损坏)问题。
  • 我不相信你。你是如何“检查”这些东西的? temproot=temp2; 真的会被执行吗?
  • “不相关”的代码可能并不是那么不相关...
  • 问题不在贴出的代码中。
  • 您分配的新节点会立即泄漏。

标签: c++ avl-tree


【解决方案1】:

我认为您看到的功能没有问题。

指针的工作方式与您的典型对象(值)不同,如果没有绘图板,很难解释,但让我试试。

当您“记住”最初传入节点的指针时,您就是在记住这一点。即使您将初始指针分配给不同的结构字段,“移动它”,您的“副本”仍将指向完全相同的元素,因为在分配/重新分配指针时实际内存不会移动。并且,正因为如此(在您的情况下),您正在执行的旋转不会由最初传入根的父元素反映,因为它仍将指向分配给 temp2- 的相同元素>left(与 temproot 一样,因为没有重新分配实际内存)。

如果您想更改(有权访问)实际元素的存储位置。正如我假设在您的情况下,您需要通过引用传递旋转的根元素(avlnode* Tree::RL_rotation (avlnode*& temp))。通过这样做,您不仅将要围绕其进行旋转的节点的内存位置传递给该函数,而且还将该位置的位置传递给该函数。这将允许在旋转之后更改根,这是您以前无法做到的。

注意:去掉这样的代码: avlnode * temp1=新的avlnode; temp1=temp->对;

您正在创建一个新的内存位置,您会立即忘记它,并且它永远不会被释放(本机 C++ 中没有垃圾收集器)。

改为这样写(因为您实际上并不需要创建新节点 - 您只是重新排列它们): avlnode * temp1= temp->right;

【讨论】:

  • 谢谢,我试试看!
猜你喜欢
  • 2018-05-25
  • 2020-08-26
  • 2011-11-12
  • 2012-02-23
  • 2016-02-09
  • 2014-08-30
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
相关资源
最近更新 更多