关于数的遍历问题

为什么我的这个程序总是失败呢?
程序如下:

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct BiTree
{
char data;
struct BiTree *Lchild, *Rchild ;
}BiTNode ;


void creat_tree(BiTNode *);
void preTaverse(BiTNode *);
void inTraverse(BiTNode *);
void postTaverse(BiTNode *);

char *pstr="abc de g f ";

int main(void)
{
BiTNode BT ;

// gets(pstr);
// printf("%s",pstr);

creat_tree(&BT);
// printf("OK");

preTaverse(&BT);
inTraverse(&BT);
postTaverse(&BT);

return 0;
}

void creat_tree(BiTNode *BT)
{
if( *pstr == ' ' || !(*pstr) )
{
BT = NULL ;
pstr++;
}
else
{
BT = (BiTNode *) malloc(sizeof(BiTNode));

if(NULL == BT)
{
printf("动态内存分配失败!\n");
exit(-1);
}

BT->data = *(pstr++);;

creat_tree(BT->Lchild) ;
creat_tree(BT->Rchild) ;
}

}

void preTaverse(BiTNode *BT)
{
if(NULL != BT)
{
printf("%c ",BT->data);

if(NULL != BT->Lchild )
preTaverse(BT->Lchild);

if(NULL != BT->Rchild )
preTaverse(BT->Rchild);
}

}

void inTraverse(BiTNode *BT)
{
if(NULL != BT)
{
if(NULL != BT->Lchild )
inTraverse(BT->Lchild);

printf("%c ",BT->data);

if(NULL != BT->Rchild )
inTraverse(BT->Rchild);
}
}

void postTaverse(BiTNode * BT)
{
if(NULL != BT)
{
if(NULL != BT->Lchild )
postTaverse(BT->Lchild);

if(NULL != BT->Rchild )
postTaverse(BT->Rchild);

printf("%c ",BT->data);
}
}

程序终止,不知怎么了,
小弟不才,捉摸半天搞不出来,希望各位大侠指点。
...全文
92 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvjing_CSDN 2011-09-11
  • 打赏
  • 举报
回复
楼主创建树的函数create_tree有问题,在create_tree函数中递归最重要的是递归结束条件有问题,

if( *pstr == ' ' || !(*pstr) )
{
BT = NULL ;
pstr++;
}

这个理当*pstr ==‘0’时,pstr++会使pstr不再指向字符串,在下一次递归时应该直接返回,但楼主代码中并没有返回,显然这是错误的。还有就是你的函数参数问题

BT = (BiTNode *) malloc(sizeof(BiTNode));

这个赋值会使传来的参数被覆盖掉。下面是我修改的程序,仅供楼主参考,你没有说明你给的字符串的意思,我就按那个字符串是一个二叉树先根遍历的来的,然后按此还原,这里主要修改的是create_tree函数,其他的没变

# include <stdio.h>
# include <stdlib.h>

typedef struct BiTree
{
char data;
struct BiTree *Lchild, *Rchild ;
}BiTNode ;


void creat_tree(BiTNode **);
void preTaverse(BiTNode *);
void inTraverse(BiTNode *);
void postTaverse(BiTNode *);

char *pstr="abc de g f ";

int main(void)
{
BiTNode *ptrBT ;

// gets(pstr);
// printf("%s",pstr);

creat_tree(&ptrBT);
// printf("OK");

preTaverse(ptrBT);
putchar('\n');
inTraverse(ptrBT);
putchar('\n');
postTaverse(ptrBT);

return 0;
}

void creat_tree(BiTNode **ptr)
{
if(!*pstr)
{
*ptr = NULL ;
return;
}
if( *pstr == ' ' )
{
*ptr = NULL ;
pstr++;
}
else
{
*ptr = (BiTNode *) malloc(sizeof(BiTNode));

if(NULL == *ptr)
{
printf("动态内存分配失败!\n");
exit(-1);
}

(*ptr) ->data = *pstr++;
creat_tree(&(*ptr)->Lchild) ;
creat_tree(&(*ptr)->Rchild) ;
}
}

void preTaverse(BiTNode *BT)
{
if(NULL != BT)
{
printf("%c ",BT->data);

if(NULL != BT->Lchild )
preTaverse(BT->Lchild);

if(NULL != BT->Rchild )
preTaverse(BT->Rchild);
}

}

void inTraverse(BiTNode *BT)
{
if(NULL != BT)
{
if(NULL != BT->Lchild )
inTraverse(BT->Lchild);

printf("%c ",BT->data);

if(NULL != BT->Rchild )
inTraverse(BT->Rchild);
}
}

void postTaverse(BiTNode * BT)
{
if(NULL != BT)
{
if(NULL != BT->Lchild )
postTaverse(BT->Lchild);

if(NULL != BT->Rchild )
postTaverse(BT->Rchild);

printf("%c ",BT->data);
}
}



quwei197874 2011-09-11
  • 打赏
  • 举报
回复
楼主create_tree()中先判断if( *pstr == ' ' || !(*pstr) )导致数据进不到树中,树一直是空的
Marzo_C 2011-09-11
  • 打赏
  • 举报
回复
简单的说:&BT是指针本身的地址,函数形参是BiTNode的地址,不匹配。

繁琐的说:
LZ你向函数中传递的参数是&BT,这是一个指针的地址,确切的说是一个“指向BiTNode的指针”的地址。那么接受这个参数的函数,它的形参就应该是能容纳这一“指针的地址*”的类型,既指向指针的指针。函数中写的参数类型是“指向BiTNode的指针”,它只能接收一个BiTNode变量的地址;程序中需要函数能够接收一个“指向BiTNode的指针变量”的地址,所以函数的形参类型必须是一个指向(“指向BiTNode的指针变量”)的指针(如#3所示)。

*“指针的地址”——不是指针装载的地址,而是指针变量存在(占据)的地址。
qq120848369 2011-09-11
  • 打赏
  • 举报
回复
void creat_tree(BiTNode **BT)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧