鱼C论坛

 找回密码
 立即注册
查看: 4169|回复: 7

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

[复制链接]
发表于 2015-3-6 21:52:24 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 x838749920 于 2015-3-8 12:30 编辑

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


QQ截图20150306215011.png
QQ图片20150308122909.jpg

最佳答案

查看完整内容

我是初入论坛的,只看了几次甲鱼的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); print ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

评分

参与人数 1鱼币 +5 收起 理由
痴痴痴 + 5 正好遇见这个问题,感谢解决

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-7 14:50:48 | 显示全部楼层
BiTree T你这里应该是结构体,而应该创建的是指针,所以加 *
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-7 15:20:38 | 显示全部楼层
大黑鱼 发表于 2015-3-7 14:50
BiTree T你这里应该是结构体,而应该创建的是指针,所以加 *

BiTree T不是结构体呃,在定义的时候是 *BITtree的,在这里BiTree *T是指针的指针。。。所以有点不明白,为什么不用指针,而用指针的指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-11 17:33:46 | 显示全部楼层
要在一个函数里面申请空间的方法就要是传递双重指针,不然申请的空间会丢失。要不然就用return。
如果想完全搞懂就看看汇编代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-28 19:30:30 | 显示全部楼层
需要修改的就用*T,不需要修改的就直接用T.
这里面创建一棵树,肯定要修改的,所以是*T;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-5 17:00:29 | 显示全部楼层
:sad
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-3 19:51:31 | 显示全部楼层
我也不太明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 16:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表