请问,这个程序的二叉树遍历为什么有错


#include <stdio.h>
#include <malloc.h>
typedef struct btnode
{
int data;
struct btnode *lchild,*rchild;
}BTONDE;
void createbintree(BTONDE *t)
{
int data;
scanf("%d",&data);
if(data==0)
{
t=NULL;
}
else
{
t=(BTONDE *)malloc(sizeof(BTONDE));
t->data=data;
createbintree(t->lchild);
createbintree(t->rchild);
}
}
void prerodrdet(BTONDE *t)
{
if(t)
{
printf("%d",t->data);
prerodrdet(t->lchild);
prerodrdet(t->rchild);
}
}
int main(void)
{
BTONDE t1;
BTONDE *t=&t1;
createbintree(t);
printf("the is\n");
prerodrdet(t);
return 0;

7 个解决方案

#1


t1未初始化,后面的指针好像就没什么意义啊(个人意见,不知道对不对)

先给t1初始化,再
t->lchild=(BTONDE *)malloc(sizeof(BTONDE));
t->rchild=(BTONDE *)malloc(sizeof(BTONDE));

#2


函数传参方式不对,malloc后的内存如法传给实参。可以使用二级指针,C++的话可以使用指针的引用!

#3


引用 2 楼  的回复:
函数传参方式不对,malloc后的内存如法传给实参。可以使用二级指针,C++的话可以使用指针的引用!


写错了,应该是:
函数传参方式不对,malloc后的内存 无法传给实参。可以使用二级指针,C++的话可以使用指针的引用!

#4


#include <stdio.h>
#include <malloc.h>
typedef struct btnode
{
    int data;
    struct btnode *lchild,*rchild;
}BTONDE;
void createbintree(BTONDE **t)
{
    int data;
    scanf("%d",&data);
    if(data==0)
    {
        *t=NULL;
    }
    else
    {
        *t=(BTONDE *)malloc(sizeof(BTONDE));
        (*t)->data=data;
        createbintree(&((*t)->lchild));
        createbintree(&((*t)->rchild));
    }
}
void prerodrdet(BTONDE *t)
{
    if(t != NULL)
    {
        printf("%d",t->data);
        prerodrdet(t->lchild);
        prerodrdet(t->rchild);
    }
}
int main(void)
{
    BTONDE t1;
    BTONDE *t=&t1;
    createbintree(&t);
    printf("the is\n");
    prerodrdet(t);
    return 0;
}

#5


引用 4 楼  的回复:
#include <stdio.h>
#include <malloc.h>
typedef struct btnode
{
    int data;
    struct btnode *lchild,*rchild;
}BTONDE;
void createbintree(BTONDE **t)
{
    int data;
    scanf("%d",&amp;d……


为什么需要使用二级指针?

#6


引用 3 楼  的回复:
引用 2 楼  的回复:

函数传参方式不对,malloc后的内存如法传给实参。可以使用二级指针,C++的话可以使用指针的引用!


写错了,应该是:
函数传参方式不对,malloc后的内存无法传给实参。可以使用二级指针,C++的话可以使用指针的引用!


为什么需要使用二级指针?
为什么无法传递?动态空间不是跨函数使用吗?这个函数调用 完他还在!

#7


在主函数里的t假设t指向的是0x18这个地址,那么t既然能存0x18说明它分配到了4个字节的内存空间,这个内存空间存的是0x18这个地址,那么自然这个内存空间也是有地址的 假设是0x50;而当你调用子函数的时候传过去的其实是0x18这个值,那么这个值也是存在一快4个字节的内存上的,而你子函数里那个新定义的指针t 为0x18,但是这个0x18也是存在内存里的,而它的内存地址肯定不是0x50,假设是0x60。所以当你给t重新赋值为开辟空间的那个地址的时候,其实是0x60这个地址的内存空间里由0x18变成了那块开辟的空间的地址,而主函数里的0x50这内存空间里的0x18没有改变。但是当你用二级指针传参的时候传的是0x50,然后取*后就是找到了那块内存空间,然后把那块内存空间上的0x18改成了新开辟空间的地址,达到了效果。不知道这么说你是否能明白,希望对你有所帮助。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



二叉树中序非递归遍历问题,请问错在哪里 链式二叉树遍历具体程序 二叉树的基本遍历程序 二叉树的遍历 二叉树的遍历 二叉树的遍历 二叉树的遍历 二叉树的遍历 二叉树的遍历 二叉树的遍历
 
粤ICP备14056181号  © 2014-2021 ITdaan.com