[新手程序员]Avl树旋转代码问题

bool BiNode::LR_Balance(BiNode** T)
{
BiNode* tempNode = (*T)->lchild->rchild;
BiNode* p = (*T)->lchild;
if (tempNode == NULL)
return false;
/* 处理tempNode的子树 /
(*T)->lchild->rchild = tempNode->lchild;
(*T)->lchild = tempNode->rchild;
/
将子树根节点和根节点的有节点连接掉tempNode */
tempNode->lchild = p;
tempNode->rchild = (*T);

(*T) = tempNode;//改变了T的父节点的孩子指针的指向,从指向T变成指向tempNode
return true;

}
(*T) = tempNode;

逐行运行时发现这一行代码使T的父节点指T的指针变成了指向tempNode当前节点。

然后我又写了下面的程序,结果并没有改变。
int main()
{
BiNode* BST1= new BiNode();
BiNode* BST2 = new BiNode();
BiNode* BST3 = new BiNode();
bool change(BiNode** T);

BST1->data = 59;
BST2->data = 33;
BST3->data = 13;
BST1->lchild = BST2;

change(&BST2);
BST1->PreOrderTraverse(BST);
cout << endl;

}
bool change(BiNode** T)
{
BiNode* BST3 = new BiNode();
BST3->data = 13;
(*T) = BST3;
return true;
}
二级指针能不能这么用?如果可以,后面那个为什么不行?
如果不行,二级指针是用来做什么的 。

如果二级指针能这么用,该怎么理解?
一般说指针指向地址,可以理解为指向一个固定的内存单元吗,这个内存单元的地址也是固定的。只有这样假设我才能想明白第一个程序为什么有效果

1个回答

你在函数里new了一个结构体,还不是静态的,函数调用完它就“消失”(实际上是程序不会将这个变量的值保持住,可能又变成别的值)了

你应该了解一下函数调用的过程

局部变量是保存在栈上的,函数调用返回时会移动栈指针,然后这片区域可能随后又保存了别的东西,原来的数据是不会保存下来的

CSDN4006600
csdn4006600 完全没有想过是这里的问题,一直在查二级指针的用法。谢谢
大约 2 年之前 回复
Debug_dodge
Debug_dodge 搜索一下变量的作用域,以及static/dynamic关键字
大约 2 年之前 回复
Debug_dodge
Debug_dodge 最怕的就是自己在这里猜想程序是怎么运行的,你上网搜索一下花不了多少时间的
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问