我无法在以下代码中更新我的全局指针
#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
的计算结果为false。结束函数后,T
再次变为等于Tnil
,因此不会插入任何内容。有什么帮助吗?
答案 0 :(得分:2)
您想要更新全球T. 因此,您应该传递全局T的引用来插入:
替换
void insert(RB * T,RB * z)
带
void insert(RB *&amp; T,RB * z)
(否则只更新全局指针T的副本)
正如您的示例中的ComicSansMS所述
y->left==z
应替换为
y->left=z
最佳,
杰克
答案 1 :(得分:0)
你的命名搞砸了。
您有两个名为T
的变量,一个在全局范围内,另一个作为insert
的参数。因此,T=z;
中的赋值insert
实际上不会对全局变量T
起作用,而是对参数起作用,因此在函数外部没有副作用。
作为一般规则,请尽量避免使用T
,z
和x
这样的单字母变量名称。它们使您的代码难以阅读,并且可以轻松隐藏此类错误。此外,避免从函数内部进行非本地化更新。从函数更新全局变量只是要求这样的麻烦。更好的方法是让insert
返回指向新顶级节点的指针。