关于二叉树的创建,不太明白
本帖最后由 x838749920 于 2015-3-8 12:30 编辑为什么是BiTree *T
而不能用BiTree T
BiTree T不就是指针么,为什么要用指针的指针。。
本帖最后由 lightninng 于 2015-3-11 16:11 编辑
我是初入论坛的,只看了几次甲鱼的python视频,c方面的视频我还没看过,楼主问的这个问题涉及到函数编写的时候的一个重要问题:形参和实参,这个不知道甲鱼有木有讲过
楼主如果没有接触过形参数和实参的问题我就简单举个例子:
void exchange(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void main()
{
int a = 1,b = 2;
exchange(a,b);
printf("%d,%d",a,b);
}
这段代码的输出是1,2也就是a,b并没有交换,原因是函数运行的时候,在函数体里用的都是形式参数,也就是说函数exchange内的a,b并不代表main函数里的a,b,只是在调用函数的时候将main里的a,b的值赋于了exchange函数里的a,b,所以改变exchange函数内a,b的值,并不会改变main函数里a,b的什,如果我们把exchange函数改为
void exchange(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
效果一样,也就是exchange函数里这两个参数叫什么并不重要,他们在函数中是形式参数,他们的改变对main函数里的变量没有影响,那么问题来了,如果我用想在调用函数时改变main函数中的变量怎么办呢,解决办法是用指针,指针是什么,在c语言里说白了就是一个地址,如果我们传入一个指针*p,传入的是指针p的地址,虽然是形式参数,但是没有关系,因我们想改变的不是指针p,而是p所指向的内容,那么通过*操作符就可以改变p指向的内容,那么对于上面那个例子如果我们想让a,b的值交换,我们可以将代码写成如下这样
void exchange(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void main()
{
int a = 1,b = 2;
exchange(&a,&b);
printf("%d,%d",a,b);
}
这时可以看到输出的是2,1因为我们传入exchange函数的是&a,&b,也就是a和b的地址(所谓指针保存的正是一个地址),那么当在函数内进行*操作时便改变了main函数中a,b 的内容。到此形参和实参的问题应该说清楚了
那么回到楼主的问题:
首先,二叉树的定义,应该是一个指向根节点的指针,那么在创建二叉树时,我们要得到的是一个创建好的树T(它是一个指针),但是如果直接传入一个T,它会把T直接赋于一个形参这个形参可以取任何名字,可以叫T,也可以叫X,Y什么的都可以,于是在函数中对于形参做的任何改动和你传入的T指针没有任何关系,函数运行完时,你发现你的T还是你创建的那个指针,而没有成为你想要的一颗二叉树,那么我们想创建二叉树该怎么办呢,参照上面的做法,我们只要传入一个指向T指针的指针就可以了,换句话说,我们只要传入T指针的地址就可以了,然后在函数里通过*操作来完成对main函数中T的改动
另外我们来看看main函数中对CreateBiTree的调用情况一定是这样的
void main()
{
....
BiTree T;
CreateBiTree(&T)
....
}
至于下面的SearchBST函数为什么用BiTree T而不是BiTree *T楼主可以好好想一想,稍微做一个小小的提示,是否用指针传入其实就是看你是否要改变传入参数的值,如果要改,那么就要传入指针而不是参数本身,则谁愿意传入指针呢,在函数里还要加上*操作符
PS:楼主如果真的对二叉树感兴趣可以上网下一本严蔚敏版的《数据结构(C语言版)》,里面讲的很清楚,当然甲鱼讲的肯定是简单易懂,不过这本书里就讲的更正规和全面,另外,这本书网上是有配套的源程序的,这种问题你看一下源代码,研究一下,可能自己都能解决,祝楼主学习顺利啦
纯手打。。累死我了
BiTree T你这里应该是结构体,而应该创建的是指针,所以加 * 大黑鱼 发表于 2015-3-7 14:50
BiTree T你这里应该是结构体,而应该创建的是指针,所以加 *
BiTree T不是结构体呃,在定义的时候是 *BITtree的,在这里BiTree *T是指针的指针。。。所以有点不明白,为什么不用指针,而用指针的指针。 要在一个函数里面申请空间的方法就要是传递双重指针,不然申请的空间会丢失。要不然就用return。
如果想完全搞懂就看看汇编代码。 需要修改的就用*T,不需要修改的就直接用T.
这里面创建一棵树,肯定要修改的,所以是*T; :sad 我也不太明白
页:
[1]