我正在编写一个模板 BST 类并注意到我需要像这样声明“插入”参数:
void BST<TYPE>::insert(TYPE iData, int line, node *&n)
代替:
void BST<TYPE>::insert(TYPE iData, int line, node *n)
唯一的区别是用于传递节点指针的“&”。该函数的完整代码是:
template <class TYPE>
void BST<TYPE>::insert(TYPE iData, int line, node *&n){
if(n == NULL){
n = new node(iData, line, NULL, NULL, NULL);
}
else if(iData < n->data){
insert(iData, line, n->leftChild);
}
else if(iData > n->data){
insert(iData, line, n->rightChild);
}
else if(iData == n->data){
while(n->head != NULL){ //traverse to end of list
n = n->head;
}
n->head = new node(iData, line, NULL, NULL, NULL); //add p to end of list
}
}
树包含重复项,这就是为什么有 else if(iData == n->data)
的原因。
我的想法是,如果我们将指针传递给子节点,那么最终当 NULL
被发现时,当我们创建一个新节点时,它将位于内存中由leftChild 或 rightChild 指针。相反,似乎如果我们不添加 &
运算符,新节点会创建但不会“连接”到树。
我想知道是否有人可以解释这里的语法。另外,对于任何违反礼节的行为,我深表歉意;这是我关于 SO 的第一篇文章。此 BST 用于家庭作业,但我问的问题不是。这只是我很好奇的事情。
谢谢。
最佳答案
当你有一个函数参数 int& i
时,函数内部对 i 的任何更改,也会更改传递给函数的变量。当参数为int i
时,在函数内部进行复制,对参数的任何更改都不会影响传递给函数的变量。
没有理由不能将相同的逻辑应用于指针参数。当你有 node *n
时,会制作指针的拷贝,如果函数内部的指针指向其他内容,则不会更改从外部传递给函数的指针.当参数为node *&n
时,如果参数指向函数内部的其他东西,传入的函数外部的指针变量也被更改为指向相同的东西。
我没有过多地查看该函数,但我假设逻辑也需要该函数在函数调用之外更新指针。
关于c++ - "&"c++ 模板函数定义中的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22748510/