简单来说就是两个问题:
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++啊汗。。。求高人求助。就最上方那两个问题。