`
luotuoass
  • 浏览: 642011 次
文章分类
社区版块
存档分类
最新评论

再一次认识到C函数中参数传递:传值。

 
阅读更多

一般是以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)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics