x838749920 发表于 2015-3-6 21:52:24

关于二叉树的创建,不太明白

本帖最后由 x838749920 于 2015-3-8 12:30 编辑

为什么是BiTree *T
而不能用BiTree T
BiTree T不就是指针么,为什么要用指针的指针。。


lightninng 发表于 2015-3-6 21:52:25

本帖最后由 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语言版)》,里面讲的很清楚,当然甲鱼讲的肯定是简单易懂,不过这本书里就讲的更正规和全面,另外,这本书网上是有配套的源程序的,这种问题你看一下源代码,研究一下,可能自己都能解决,祝楼主学习顺利啦
纯手打。。累死我了

大黑鱼 发表于 2015-3-7 14:50:48

BiTree T你这里应该是结构体,而应该创建的是指针,所以加 *

x838749920 发表于 2015-3-7 15:20:38

大黑鱼 发表于 2015-3-7 14:50
BiTree T你这里应该是结构体,而应该创建的是指针,所以加 *

BiTree T不是结构体呃,在定义的时候是 *BITtree的,在这里BiTree *T是指针的指针。。。所以有点不明白,为什么不用指针,而用指针的指针。

885031918 发表于 2015-3-11 17:33:46

要在一个函数里面申请空间的方法就要是传递双重指针,不然申请的空间会丢失。要不然就用return。
如果想完全搞懂就看看汇编代码。

蓝色枫叶 发表于 2015-5-28 19:30:30

需要修改的就用*T,不需要修改的就直接用T.
这里面创建一棵树,肯定要修改的,所以是*T;

溯月0503 发表于 2015-6-5 17:00:29

:sad

tiandiweicheng1 发表于 2015-7-3 19:51:31

我也不太明白
页: [1]
查看完整版本: 关于二叉树的创建,不太明白