骇客king 发表于 2015-8-25 12:18:02

二叉树的递归建立和遍历中的双指针的问题

本帖最后由 骇客king 于 2015-8-25 16:58 编辑

GreateBiTree(BiTree T)
{
        char c;
        scanf("%c",&c);
        if(c==' ')
        {
                T=NULL;
        }
        else
        {
                T=(BiTree)malloc(sizeof(BiTrNode));
                T->data=c;
                GreateBiTree(T->lc);
                GreateBiTree(T->rc);
        }
}
红色的没有理解啊,为什么这样做不行,为什么要用到双重指针呢?
个人理解为是因为需要改变指针的内容,单指针就不能改变内容了吗?

typedefchar ElemType;
typedef struct BiTrNode
{
        ElemType data;
        struct BiTrNode *lc ,*rc;
} BiTrNode,*BiTree;
结构在这里

ryxcaixia 发表于 2015-8-25 12:18:03

一句话 想通过函数的参数 动态申请内存
要么传递二级指针 要么传递一级指针的引用(引用底层也是利用指针实现 一个道理)

你传递一个一级指针进去 参数自动拷贝了一个指针的临时变量 内部是代为为这个临时变量申请了内存 不过等函数体结束 临时变量消失 外部的指针并没有获得内存 并且还造成了内存泄露

melttt 发表于 2015-8-25 18:43:12

lz你说的双重指针在哪?是T->lc吗
T->lc是单指针
双重指针是比如 int ** A;

骇客king 发表于 2015-8-26 09:50:56

本帖最后由 骇客king 于 2015-8-26 09:57 编辑

melttt 发表于 2015-8-25 18:43
lz你说的双重指针在哪?是T->lc吗
T->lc是单指针
双重指针是比如 int ** A;

是的,我用单指针不能达到预期的效果,只能用双重指针,单指针传入的值出函数后,就没用了,只能用指针的指针来改变指针的值,达到函数外指向的目的。

关键点在于,要想改变函数外的指针指向的内容,需要用到双重指针

ryxcaixia 发表于 2015-8-26 10:02:50

http://bbs.fishc.com/thread-61532-1-1.html

这是之前给别人解答的一个例子 楼主你看下
都是一个类型的 关于动态传递内存的问题

骇客king 发表于 2015-8-26 10:27:22

ryxcaixia 发表于 2015-8-25 12:18
一句话 想通过函数的参数 动态申请内存
要么传递二级指针 要么传递一级指针的引用(引用底层也是利用指针 ...

我应该理解了,就是说跟最开始学指针式一个意思了
int a=5,b=6;
int *p1=&a,*p2=&b;
要想在其他函数体里边改变a和b值,那么传进去的就得是a和b的地址,然后在函数体里*a取内容去改变他的内容,现在这个也是传进去一个地址,不过这个地址的内容是指针,所以需要接收的就是指针的指针,然后在函数里去,*传来的地址,这个就是函数体外要改变的内容了,我这么理解对吧,麻烦帮忙看看,写的有点乱,是按一步一步想出来的。

ryxcaixia 发表于 2015-8-26 11:03:20

骇客king 发表于 2015-8-26 10:27
我应该理解了,就是说跟最开始学指针式一个意思了
int a=5,b=6;
int *p1=&a,*p2=&b;


正解! 就是这个意思

对于指针 如果不传递二级指针或者指针的引用 那么申请到的地址 仅仅是给了临时变量 随着函数结束 临时变量消失 原来的指针并没有获得内存

ryxcaixia 发表于 2015-8-26 11:05:49

简单来说
// 这是个错误例子
void GetMemory(int * p)
{
    p = (int*)malloc(sizeof(int) * 10);
}

// 正确写法如下
void GetMemory(int** p) // p是指针胡地址
{
    *p = (int*)malloc(sizeof(int) * 10); // *p就是外部指针变量的真实地址
}

// 或者是
void GetMemory(int*& p)
{
    p = (int*)malloc(sizeof(int) * 10);
}

骇客king 发表于 2015-8-26 11:15:01

ryxcaixia 发表于 2015-8-26 11:05
简单来说
// 这是个错误例子
void GetMemory(int * p)


多谢,多谢,终于理解了~

y290176346 发表于 2015-9-16 21:55:37

还差3个鱼币

y290176346 发表于 2015-9-23 21:34:32

我是来领鱼币的

442860990 发表于 2015-9-25 19:55:19

领鱼币

442860990 发表于 2015-9-25 20:19:35

领鱼币

442860990 发表于 2015-9-25 20:20:16

领鱼币

442860990 发表于 2015-9-25 20:44:20

领鱼币

442860990 发表于 2015-9-25 20:58:18

领鱼币

快乐鱼 发表于 2016-2-28 14:00:07

页: [1]
查看完整版本: 二叉树的递归建立和遍历中的双指针的问题