我正在编写模板BST类,并注意到我需要声明"插入"像这样的参数:
void BST<TYPE>::insert(TYPE iData, int line, node *&n)
而不是:
void BST<TYPE>::insert(TYPE iData, int line, node *n)
唯一的区别是&#34;&amp;&#34;用于传递节点指针。该函数的完整代码是:
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指向的内存中的地址指针。相反,似乎如果我们不添加&
运算符,则会创建新节点但不会连接&#34;到树上。
我想知道是否有人可以在这里解释语法。此外,我为任何违反礼仪的行为道歉;这是我关于SO的第一篇文章。这个BST用于家庭作业,但我问过的问题不是。这只是我很好奇的事情。
感谢。
答案 0 :(得分:1)
当你有一个函数参数int& i
时,函数内部对i的任何更改,也会改变传递给函数的变量。当参数为int i
时,在函数内部进行复制,对参数的任何更改都不会影响传递给函数的变量。
没有理由不能将相同的逻辑应用于指针参数。如果有node *n
,则会生成指针的副本,如果使函数内的指针指向其他内容,则不会更改从外部传递给函数的指针。当参数为node *&n
时,如果参数指向函数内部的其他内容,则传入函数外部的指针变量也会更改为指向同一事物。
我没有太多关注这个函数,但我认为逻辑需要这个函数来更新函数调用之外的指针。