关于数据结构中递归建立二叉树时出现了问题
我自己写了一个二叉树的基本操作的程序,但是在用递归方法建立二叉树时出现了问题,就是建立二叉树时一直在不停的输入,不能跳出输入,我看了其他很多的建立二叉树的程序,算法都是那...
我自己写了一个二叉树的基本操作的程序,但是在用递归方法建立二叉树时出现了问题,就是建立二叉树时一直在不停的输入,不能跳出输入,我看了其他很多的建立二叉树的程序,算法都是那样的,为什么跳不出去呢?请大家帮我看看,源程序如下:
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef char TElemType;
typedef struct Btn{
TElemType data;
struct Btn *lchild , *rchild;
}BTN ,*BT;
BT CreateBT()
{ BT T;
char ch;
printf("请输入元素:");
ch=getchar();
getchar();
if((ch==' '))
T=NULL;
else
{
if(!(T=(BTN *)malloc(sizeof(BTN))))exit(0);
(T)->data=ch;
CreateBT(T->lchild);
CreateBT(T->rchild);
}
return T;
}
void PreOrderT(BT T )
{
if(T)
{
printf("%c",T->data);
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
}
}
void InOrderT(BT T)
{
if(T)
{
PreOrderT(T->lchild);
printf("%c",T->data);
PreOrderT(T->rchild) ;
}
}
void PostOrderT(BT T)
{
if(T)
{
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
printf("%c",T->data);
}
}
BT LocateElem(BT T , TElemType e)
{
BT p;
if(T==NULL)
return NULL;
else
if(T->data==e)return T;
else
{
p=LocateElem(T->lchild,e);
if(p) return p;
else return LocateElem(T->rchild,e);
}
}
int BTnum(BT T)
{
if(T==NULL)return 0;
else return(BTnum(T->lchild)+BTnum(T->rchild));
}
int BTdepth(BT T)
{
int h,lh,rh;
if(T==NULL)h=0;
else
{
lh=BTdepth(T->lchild);
rh=BTdepth(T->rchild);
if(lh>=rh)h=lh+1;
else h=rh+1;
}
return h;
}
void main()
{
BT T;
int a=0;
int flag=1;
char ch;
while(flag)
{
int i,j;
printf("请输入你想要执行的操作:\n");
printf("****** 1 按前序遍历创建一个二叉树\n");
printf("****** 2 前序遍历二叉树\n");
printf("****** 3 中序遍历二叉树\n");
printf("****** 4 后续遍历二叉树\n");
printf("****** 5 查找元e\n");
printf("****** 6 统计结点\n");
printf("****** 7 计算深度\n");
printf("****** 8 退出程序\n");
scanf("%d",&i);
getchar();
switch(i)
{
case 1: T=CreateBT();
case 2: PreOrderT(T);
case 3: InOrderT(T);
case 4: PostOrderT(T) ;
case 5: {printf("请输入你要查找的元素:");scanf("%c",&ch);LocateElem(T,ch);}
case 6: BTnum(T);
case 7: BTdepth(T);
case 8: {printf("程序退出:");exit(0);}
}
printf("是否继续操作?是请输入1,否请输入2:");
scanf("%c",&a);
if(a==1)flag=1;
else flag=0;
}
}
还是不行呢,它要不断地输入,不断的输入,这个语句怎么才能跳出来呢? 展开
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef char TElemType;
typedef struct Btn{
TElemType data;
struct Btn *lchild , *rchild;
}BTN ,*BT;
BT CreateBT()
{ BT T;
char ch;
printf("请输入元素:");
ch=getchar();
getchar();
if((ch==' '))
T=NULL;
else
{
if(!(T=(BTN *)malloc(sizeof(BTN))))exit(0);
(T)->data=ch;
CreateBT(T->lchild);
CreateBT(T->rchild);
}
return T;
}
void PreOrderT(BT T )
{
if(T)
{
printf("%c",T->data);
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
}
}
void InOrderT(BT T)
{
if(T)
{
PreOrderT(T->lchild);
printf("%c",T->data);
PreOrderT(T->rchild) ;
}
}
void PostOrderT(BT T)
{
if(T)
{
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
printf("%c",T->data);
}
}
BT LocateElem(BT T , TElemType e)
{
BT p;
if(T==NULL)
return NULL;
else
if(T->data==e)return T;
else
{
p=LocateElem(T->lchild,e);
if(p) return p;
else return LocateElem(T->rchild,e);
}
}
int BTnum(BT T)
{
if(T==NULL)return 0;
else return(BTnum(T->lchild)+BTnum(T->rchild));
}
int BTdepth(BT T)
{
int h,lh,rh;
if(T==NULL)h=0;
else
{
lh=BTdepth(T->lchild);
rh=BTdepth(T->rchild);
if(lh>=rh)h=lh+1;
else h=rh+1;
}
return h;
}
void main()
{
BT T;
int a=0;
int flag=1;
char ch;
while(flag)
{
int i,j;
printf("请输入你想要执行的操作:\n");
printf("****** 1 按前序遍历创建一个二叉树\n");
printf("****** 2 前序遍历二叉树\n");
printf("****** 3 中序遍历二叉树\n");
printf("****** 4 后续遍历二叉树\n");
printf("****** 5 查找元e\n");
printf("****** 6 统计结点\n");
printf("****** 7 计算深度\n");
printf("****** 8 退出程序\n");
scanf("%d",&i);
getchar();
switch(i)
{
case 1: T=CreateBT();
case 2: PreOrderT(T);
case 3: InOrderT(T);
case 4: PostOrderT(T) ;
case 5: {printf("请输入你要查找的元素:");scanf("%c",&ch);LocateElem(T,ch);}
case 6: BTnum(T);
case 7: BTdepth(T);
case 8: {printf("程序退出:");exit(0);}
}
printf("是否继续操作?是请输入1,否请输入2:");
scanf("%c",&a);
if(a==1)flag=1;
else flag=0;
}
}
还是不行呢,它要不断地输入,不断的输入,这个语句怎么才能跳出来呢? 展开
展开全部
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef char TElemType;
typedef struct Btn{
TElemType data;
struct Btn *lchild , *rchild;
}BTN ,*BT;
//已经跟你说过了,不能返回局部指针!而且你的原程序中CreateBT函数的参数和调用时不一致!
void CreateBT(BT &T)//为了方便,这里我用了引用类型
{
char ch;
ch=getchar();
if(ch!='/'){ //当输入"/"则表示数据域为空不执行,否则执行
T=(BT)malloc(sizeof(BTN));//为结点分配空间
if(T){
T->data=ch;
CreateBT(T->lchild);
CreateBT(T->rchild);
}else{
printf("分配空间失败!");
exit(0);
}
}else{
T=NULL;//将T置为空
}
}
void PreOrderT(BT T )
{
if(T)
{
printf("%c",T->data);
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
}
}
void InOrderT(BT T)
{
if(T)
{
PreOrderT(T->lchild);
printf("%c",T->data);
PreOrderT(T->rchild) ;
}
}
void PostOrderT(BT T)
{
if(T)
{
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
printf("%c",T->data);
}
}
BT LocateElem(BT T , TElemType e)
{
BT p;
if(T==NULL)
return NULL;
else
if(T->data==e)return T;
else
{
p=LocateElem(T->lchild,e);
if(p) return p;
else return LocateElem(T->rchild,e);
}
}
int BTnum(BT T)
{
if(T==NULL)return 0;
else return(BTnum(T->lchild)+BTnum(T->rchild));
}
int BTdepth(BT T)
{
int h,lh,rh;
if(T==NULL)h=0;
else
{
lh=BTdepth(T->lchild);
rh=BTdepth(T->rchild);
if(lh>=rh)h=lh+1;
else h=rh+1;
}
return h;
}
void main()
{
BT T;
int i,flag=1;
char ch;
do{
printf("请输入你想要执行的操作:\n");
printf("****** 1 按前序遍历创建一个二叉树\n");
printf("****** 2 前序遍历二叉树\n");
printf("****** 3 中序遍历二叉树\n");
printf("****** 4 后续遍历二叉树\n");
printf("****** 5 查找元e\n");
printf("****** 6 统计结点\n");
printf("****** 7 计算深度\n");
printf("****** 8 退出程序\n");
scanf("%d",&i);
getchar();
switch(i)
{
case 1: printf("请输入元素:");
CreateBT(T);
break;//case之后要用break跳出循环,有点粗心了!下面都是
case 2: PreOrderT(T);break;
case 3: InOrderT(T);break;
case 4: PostOrderT(T);break;
case 5: printf("请输入你要查找的元素:");
scanf("%c",&ch);
LocateElem(T,ch);
break;
case 6: BTnum(T);break;
case 7: BTdepth(T);break;
case 8: printf("程序退出:");
exit(0);
}
printf("是否继续操作?(y/n):");
scanf("%c",&ch);//这里的变量应该是字符类型,你的原程序中用的是整型!
getchar();
}while(ch!='y');
}
二叉树创建函数我已经验证了,没什么问题,其它的函数都没动。
#include "malloc.h"
#include "stdlib.h"
typedef char TElemType;
typedef struct Btn{
TElemType data;
struct Btn *lchild , *rchild;
}BTN ,*BT;
//已经跟你说过了,不能返回局部指针!而且你的原程序中CreateBT函数的参数和调用时不一致!
void CreateBT(BT &T)//为了方便,这里我用了引用类型
{
char ch;
ch=getchar();
if(ch!='/'){ //当输入"/"则表示数据域为空不执行,否则执行
T=(BT)malloc(sizeof(BTN));//为结点分配空间
if(T){
T->data=ch;
CreateBT(T->lchild);
CreateBT(T->rchild);
}else{
printf("分配空间失败!");
exit(0);
}
}else{
T=NULL;//将T置为空
}
}
void PreOrderT(BT T )
{
if(T)
{
printf("%c",T->data);
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
}
}
void InOrderT(BT T)
{
if(T)
{
PreOrderT(T->lchild);
printf("%c",T->data);
PreOrderT(T->rchild) ;
}
}
void PostOrderT(BT T)
{
if(T)
{
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
printf("%c",T->data);
}
}
BT LocateElem(BT T , TElemType e)
{
BT p;
if(T==NULL)
return NULL;
else
if(T->data==e)return T;
else
{
p=LocateElem(T->lchild,e);
if(p) return p;
else return LocateElem(T->rchild,e);
}
}
int BTnum(BT T)
{
if(T==NULL)return 0;
else return(BTnum(T->lchild)+BTnum(T->rchild));
}
int BTdepth(BT T)
{
int h,lh,rh;
if(T==NULL)h=0;
else
{
lh=BTdepth(T->lchild);
rh=BTdepth(T->rchild);
if(lh>=rh)h=lh+1;
else h=rh+1;
}
return h;
}
void main()
{
BT T;
int i,flag=1;
char ch;
do{
printf("请输入你想要执行的操作:\n");
printf("****** 1 按前序遍历创建一个二叉树\n");
printf("****** 2 前序遍历二叉树\n");
printf("****** 3 中序遍历二叉树\n");
printf("****** 4 后续遍历二叉树\n");
printf("****** 5 查找元e\n");
printf("****** 6 统计结点\n");
printf("****** 7 计算深度\n");
printf("****** 8 退出程序\n");
scanf("%d",&i);
getchar();
switch(i)
{
case 1: printf("请输入元素:");
CreateBT(T);
break;//case之后要用break跳出循环,有点粗心了!下面都是
case 2: PreOrderT(T);break;
case 3: InOrderT(T);break;
case 4: PostOrderT(T);break;
case 5: printf("请输入你要查找的元素:");
scanf("%c",&ch);
LocateElem(T,ch);
break;
case 6: BTnum(T);break;
case 7: BTdepth(T);break;
case 8: printf("程序退出:");
exit(0);
}
printf("是否继续操作?(y/n):");
scanf("%c",&ch);//这里的变量应该是字符类型,你的原程序中用的是整型!
getchar();
}while(ch!='y');
}
二叉树创建函数我已经验证了,没什么问题,其它的函数都没动。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询