首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-10-17 
请问,这个程序的二叉树遍历为什么有错#include stdio.h#include malloc.htypedef struct btnode{int d

请问,这个程序的二叉树遍历为什么有错
#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;


[解决办法]

探讨

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

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

热点排行