关于二叉树树的建立过程中的参数传递问题

来源:百度知道 编辑:UC知道 时间:2024/06/16 00:57:14
数据结构中二叉树的建立算法如下
void CreateTree(BTNode * &b) //b表示根节点指针
{
//scanf("%c",&c);
cin>>c;
if(c=='#')
b=NULL;
else
{
if(!(b=(BTNode *)malloc(sizeof(BTNode)))) exit(0);
b->data=c;
CreateTree(b->lchild);
CreateTree(b->rchild);
}

}

请问为什么“void CreateTree(BTNode * &b) ”这一行中b要加&号?

传递地址主要是考虑如下:
防止没有初始化的空指针的传递,虽然传递指针相当于传递地址,但是NULL指针就不起作用了.
比如,你第一次传递指针,它没有初始化,也就没有一个地址对应,你传递了它,其实没有什么用,当然如果你要它有作用也可以,就是返回值为它本身,用它来接收这个返回的指针.

我不知道说的对不对哦~这是我的理解,描述上不是太精确。

void CreateTree(BTNode * &b)其实是可以写做
void CreateTree(BTNode *b)的,

这里的CreateTree(BTNode *b)是指参数为指针型变量,若要在函数体中对调用的参数进行修改的话,需要加上“*”表示对其指向的地址数据进行修改(因为指针变量本身存放的数据是地址)如果不加“*”就是说要对这个指针指向的数据进行修改。

比如你提供的代码段中的b=NULL,目的是为了修改当前指针的指向,在这里(指函数体定义为CreateTree(BTNode *b)的时候)就得写作*b=NULL,这里的*b指的是指针b所存放的那个代表指向地址的数据。

函数定义为CreateTree(BTNode * &b),可以这样理解:我的参数是一个指针地址,我在函数体内对它的修改就是直接修改了实参所指向的地址。所以不需要再加上“*”,而可以直接写作b=NULL。其实此时的b就等于上面那种情况的“*b”;

这样写的好处,我个人理解是:使代码看上去更清晰。因为在这里只涉及到更改链表的指向。
至于有没有其他的原因,我不是很清楚。

你可以参看谭浩强的《c程》或者是《c++程》,指针一章,其实只要区分一下*p 和&p代表的含义就清楚了。

希望有所帮助。