永发信息网

啊啊啊!!!!!紧急求助啊!!!!C语言getchar()函数和C++里面的cin函数。。。

答案:1  悬赏:10  手机版
解决时间 2021-04-13 09:23

简单来说就是两个问题:

1.为什么明明原来对的程序加入了switch选择语句就会错呢。

2.为什么scanf和getchar都不对,cin就对呢。。。。

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <iostream.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void mainmenu()
{
printf("\n");
printf("*******************欢迎进入作系统,请选择操作*********************\n");
printf("1.输入字符序列,建立二叉链表\n");
printf("2.先序、中序、后序遍历二叉树:递归算法\n");
printf("8.结束操作退出系统\n");
printf("*****************************************************************\n");
}
int creat(BiTree &t)
{
char ch;
while(ch!='$')
{
scanf("%c",&ch);
if(ch=='#')
t=NULL;
else
{
if(!(t=( BiTNode*)malloc(sizeof(BiTNode))))
{
printf("Error!");
exit(0);
}
t->data=ch;
creat(t->lchild);
creat(t->rchild);
}
}
return 0;
}
void xianxu(BiTNode *t)
{
if(t!=NULL)
{
printf("%3c ",t->data);
xianxu(t->lchild);
xianxu(t->rchild);
}

}
void zhongxu(BiTNode *t)//中序遍历二叉树
{
if(t!=NULL)
{

zhongxu(t->lchild);
printf("%3c ",t->data);
zhongxu(t->rchild);
}
}
void houxu(BiTNode *t)//后序遍历二叉树
{
if(t!=NULL)
{
houxu(t->lchild);
houxu(t->rchild);
printf("%3c",t->data);
}
}
void main()
{
BiTree t=NULL;
int a=0,flag=0;
while(a!=8)
{
mainmenu();
scanf("%d",&a);
switch(a)
{
case 1:
printf("请按先序输入二叉树的结点元素,用空格表示空,以#号结束:\n");
creat(t);
flag=1;
break;
case 2:
if(flag==1)
{
printf("先序序列为:\n");
xianxu(t);
printf("\n\n");
printf("中序序列为:\n");
zhongxu(t);
printf("\n\n");
printf("后序序列为:\n");
houxu(t);
printf("\n");
}
else
{printf("请先执行1操作!");}
break;
case 3:

case 8:exit(0);break;
default:printf("输入错误!\n");break;
}

}
}

这个函数。原本没有加入mainmenu函数用switch语句选择功能实现的时候,是非常正确的。然后因为要求必须要有菜单,于是乎我就加上了功能选择。于是。。就错了。

按1之后创建树,如果creat函数是void型的话,我设定结束符,例如以#号结束,可是明明填满二叉树之后,又输入#字符,但是就是永远不结束。如果creat是int型,让它遇到结束符return,倒是可以结束。可是执行case 2的时候先序遍历之后程序出错,不知道为什么。

以上是在creat函数是scanf循环输入(while语句,也是,永远停不下来)或者用getchar函数输入的情况下。

如果换成cin函数的话,就可以。。而且是只要填满二叉树,都不用标结束符,就自动运行,而且遍历也全都对。

可是这是C语言不是C++啊汗。。。求高人求助。就最上方那两个问题。

最佳答案

switch 那好像没错吧。。


你的意思是3-8之间输入一个数就退出


如果是那样则改成


case 3:
case 4:
case 5:
case 6:
case 7:
case 8:exit(0);break;


否则他只会认为你输入8时才退出



char ch;
while(ch != '#')
{
cin>>ch;
if(ch == '#')
t=NULL;
else
{
if(!(t=( BiTNode*)malloc(sizeof(BiTNode))))
{
printf("Error!");
exit(0);
}
t->data=ch;
creat(t->lchild);
creat(t->rchild);
}
}
return 0;



这里不能终止循环。。。。原因是你这里不停的执行了 creat(t->lchild);就算你输入了N个#也不能停止。。。



兄弟。。你可以在while前下个断点。。。去跟踪下。。。





我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
电脑 点击开始没有反应 经常自动蓝屏 是种病
迈克尔的《未来的未来》什么时候上映?
硬盘读取速度慢怎么办,怎么提升硬盘读写速度
谁知道怎么自己做百度空间模块?
网络侵权和传统侵权案件有什么区别?有专门处
苹果ibook G4可以安装什么系统
一个人要几名字
近视眼的矫正就是要配带一副近视眼镜,近视眼
我是应届毕业生处于离校实习阶段,招聘主管在
离婚后,前妻突然变成他的顶头上司,还故意毁
喝葡萄酒有什么忌讳呢?怎样喝葡萄酒才能更健
中国古代史上十位草根出身的皇帝都有谁?
人分成哪几种?
粥行天下古田店我想知道这个在什么地方
家庭唱歌设备多少钱,家庭唱歌需要哪些设备,大
推荐资讯
对中国女排的寄语
氧化铝与氢氧化铝既能与________溶液反应,又
易语言网页填表
在山东省武城县给新生儿落户直接落到母亲的户
为什么我空间设置了将跟新显示在QQ上 为什么Q
超级QQ黄金等级怎么才升得更快啊?
单选题科学家成功地把人和抗病毒干扰素基因连
谁会C#题???
一道关于牛三定律的高一物理题
有专利高考会加分吗,还是有什么优惠?
12月13日至18日到青岛出差,请问那里冷么,应
看物体时总感觉眼前有小黑点,这是什么原因引
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?