一般是以swap(int a,int b)引入的 参数传递时传值得,在函数中对参数的修改不对外界产生影响。
于是就引入了传指针和引用。
swap(int *a,int *b)传过来的是指向整型值的指针,这样就可以对他指向的内容操作。
一向以为自己对这些东西掌握得很好,今天写了一个avl树的程序,关于root在构造函数里面定义为root=NULL,在插入节点时,使用的是递归方法,希望把root和普通节点一样进行处理,即插入第一个元素时,为root分配空间。结果每次运行完毕,root总是没有被分配空间。形不成树结构
部分代码:
template<typename Type>
int AVLTree<Type>::insertAVL(TreeNode* tree, Type data, bool &taller)
{
if(!tree)
{
tree = (TreeNode*)malloc(sizeof(TreeNode));
tree->data=data;
tree->lchild=NULL;
tree->rchild=NULL;
tree->bf=EH;
taller = true;
}
else
{
if(data == tree->data)
{taller=false; return 0;}
if(data < tree->data)//左子树
{
if(!insertAVL(tree->lchild,data,taller))
return 0;//未插入,有相同元素
.......................................................
经过考虑,发现自己还是对传递参数没有把握好。
insertAVL(TreeNode* tree, Type data, bool &taller)
root=NULL, 也就是root=0x00000000;
作为参数传递tree=root,分配空间后
tree=0x123445678。对*tree结构进行初始化
但是当程序结束时,root还是为0x00000000,不会指向其他内存空间。
因为是传值。能改变是只是root指向内存快的内容,比较向int *const tree,是一个指针常量,指针不可改变,但是指向的内容可以改变~
如果希望改变指针内容(指针指向的地址),应该传递** 或者*&,我采用了引用~
template<typename Type>
int AVLTree<Type>::insertAVL(TreeNode* *tree, Type data, bool &taller)
template<typename Type>
int AVLTree<Type>::insertAVL(TreeNode*& tree, Type data, bool &taller)