0

我在以下代码中更新全局指针时遇到问题,

#include <iostream>

using namespace std;

struct RB{
    RB()=default;
    RB(int clr):color(clr) { }
    int color;
    RB *p,*left,*right;
    int key;
};

RB *Tnil=new RB(0);
RB *T=Tnil;
void insert(RB *T,RB *z)
{
    RB *y=Tnil;
    RB *x=T;
    while(x!=Tnil)
    {
        y=x;
        if(z->key<y->key)
          x=x->left;
        else
         x=x->right;
    }
    z->p=y;
    if(y==Tnil)
      T=z;
    else if(z->key<y->key)
      y->left==z;
    else
      y->right=z;
    z->right=Tnil;
    z->left=Tnil;
    z->color=1;
}

void print(RB *T)
{
    if(T==Tnil)
      return;
    print(T->left);
    cout<<T->key;
    print(T->right);
}

int main()
{
  for(int i=1;i<10;++i)
  {
    RB *x=new RB;
    x->key=i;
    insert(T,x);

  }
   print(T);
}

问题是,当我期望它为真时y==Tnil,我的insert函数中的比较结果为假。结束函数后,T再次变为 equal Tnil,因此没有插入任何内容。有什么帮助吗?

4

2 回答 2

2


您想更新全局 T。
因此,您应该将全局 T 的引用传递给插入:

代替

无效插入(RB *T,RB *z)

无效插入(RB * & T,RB *z)

(否则只会更新全局指针 T 的副本)

正如您的示例中的ComicSansMS所提到的

y->left==z 

应该替换为

y->left=z


最好的,

杰克

于 2013-07-16T07:40:48.687 回答
0

你的名字乱七八糟。

您有两个名为 的变量T,一个在全局范围内,另一个作为insert. 因此,赋值T=z;实际上insert并不作用于全局变量T,而是作用于参数,因此在函数之外没有副作用。

作为一般规则,尽量避免使用单字母变量名称,如T,zx. 它们使您的代码难以阅读,并且可以轻松隐藏像这样的错误。此外,避免从函数内部进行非本地化更新。从函数更新全局变量只是自找麻烦。更好的方法是insert返回一个指向新顶级节点的指针。

于 2013-07-16T07:42:08.977 回答