C语言 vs建立二叉树后,按回车没有返回菜单,而是换行了,但是代码没有问题。在其他电脑的vs上可以运行,请问是vs出问题了吗?如果出了怎么调?
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
#include<malloc.h>
#define MAX 100
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
typedef BiTree SElemType;
typedef struct
{
SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}SqStack; // 顺序栈
typedef struct
{
BiTree link;
int flag;
}StackType;
Status InitStack(SqStack &S)
{ // 构造一个空栈S
S.base=(SElemType *)malloc(sizeof(SElemType));
if(!S.base)
return ERROR;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//栈的初使化
int StackEmpty(SqStack S)
{
if(S.top==S.base)return TRUE;
else return FALSE;
}//判断栈空操作
Status Push(SqStack &S,SElemType e)
{ // 插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//入栈操作
Status Pop(SqStack &S,SElemType &e)
{ // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(StackEmpty(S)==1)
return ERROR;
e=*--S.top;
return OK;
}//出栈操作
BiTNode* CreateBiTree()
//以先序遍历方式创建一颗二叉树
{
BiTree T=NULL;
char c1;
scanf("%c",&c1);
if(c1=='#')T=NULL;
else{
if(!(T=(BiTree)malloc(sizeof(BiTNode))))exit(OVERFLOW);
T->data=c1;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return T;
}
//带参数的创建过程,与上面的方法二者可选其一
Status CreateBiTreee(BiTree &T)
{
T=NULL;
char c1;
scanf("%c",&c1);
if(c1=='#')T=NULL;
else{
if(!(T=(BiTree)malloc(sizeof(BiTNode))))exit(OVERFLOW);
T->data=c1;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return OK;
}//二叉树的创建
void visit(BiTree T)
{
printf("%3c",T->data);
}//定义访问函数
void Preorder (BiTree T)
{
if (T) {
visit(T);
Preorder(T->lchild);
Preorder(T->rchild);
}
}//二叉树的先序遍历递归算法
void InOrder(BiTree T)
{
if(T){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}//二叉树的中序遍历递归算法
void PostOrder(BiTree T)
{
if (T==NULL) return;
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
} //二叉树的后序遍历递归算法
Status Preorder_2(BiTree T)
{
SqStack S;
InitStack(S);
BiTree p=T;
if(T==NULL){return ERROR;printf("二叉树为空\n");}
while(p!=NULL||StackEmpty(S)!=1){
if(p!=NULL){
visit(p);
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);
p=p->rchild;
}
}
return OK;
}//二叉树的先序遍历非递归算法
Status InOrder_2(BiTree T)
{
SqStack S;
InitStack(S);
BiTree p=T;
if(T==NULL){return ERROR;printf("二叉树为空\n");}
while(p||StackEmpty(S)!=1){
if(p){
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);
visit(p);
p=p->rchild;
}
}
return OK;
}//二叉树的中序遍历非递归算法
Status PostOrder_2(BiTree T)
{
StackType S[MAX];
BiTree p=T;
int top=-1;
if(T==NULL)
{return ERROR;printf("二叉树为空\n");}
while(p||top!=-1){
if(p){
S[++top].link=p;
S[top].flag=1;
p=p->lchild;
}
else{
if(S[top].flag==1){
p=S[top].link->rchild;
S[top].flag=2;
}
else
visit(S[top--].link);
}
if(top==-1)break;
}
return OK;
}//二叉树的后序遍历非递归算法
void menu1()
{
printf("|============================|\n");
printf("|****---- 选择式菜单 ----****|\n");
printf("|============================|\n");
printf("| |\n");
printf("| 1:二叉树的创建 |\n");
printf("| |\n");
printf("| 2:二叉树的递归遍历 |\n");
printf("| |\n");
printf("| 3:二叉树的非递归遍历 |\n");
printf("| |\n");
printf("| 0:退出菜单 |\n");
printf("| |\n");
printf("|============================|\n");
}//menu1
void menu2()
{
printf("|============================|\n");
printf("| ****--- 选择式菜单 ---**** |\n");
printf("|============================|\n");
printf("| |\n");
printf("| 1:先序遍历(递归) |\n");
printf("| |\n");
printf("| 2:中序遍历(递归) |\n");
printf("| |\n");
printf("| 3:后序遍历(递归) |\n");
printf("| |\n");
printf("| 0:返回主菜单 |\n");
printf("| |\n");
printf("|============================|\n");
}//menu2
void menu3()
{
printf("|============================|\n");
printf("|****---- 选择式菜单 ----****|\n");
printf("|============================|\n");
printf("| |\n");
printf("| 1:先序遍历(非递归) |\n");
printf("| |\n");
printf("| 2:中序遍历(非递归) |\n");
printf("| |\n");
printf("| 3:后序遍历(非递归) |\n");
printf("| |\n");
printf("| 0:返回主菜单 |\n");
printf("| |\n");
printf("|============================|\n");
}//menu3
int main()
{
BiTNode *T;
int i,j,k;
int exitflag=0,exitflag1,exitflag2;
while(!exitflag)
{
menu1();
scanf("%d",&i);
switch(i){
case 0: exitflag=1; break;
case 1:
system("cls");
fflush(stdin);
/*fflush(stdin)是用来清空输入缓冲区,通常是为了确保不影响后面的数据读取,
例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin)。*/
printf("以先序序列创建二叉树(空用#):");
T=CreateBiTree();
system("cls");
break;
case 2: system("cls");
exitflag1=0;
while(!exitflag1)
{
menu2();
scanf("%d",&j);
switch(j)
{
case 0: exitflag1=1;system("cls");break;
case 1:
system("cls");
printf("以递归方式进行的树的先序遍历序列为:\n");
Preorder(T);
printf("\n");
break;
case 2:
system("cls");
printf("以递归方式进行的树的中序遍历序列为:\n");
InOrder(T);
printf("\n");
break;
case 3:
system("cls");
printf("以递归方式进行的树的后序遍历序列为:\n");
PostOrder(T);
printf("\n");
break;
default:system("cls");
printf("警告!你给的选项号非法,请重新输入!\n");
break;
}
}
break;
case 3:system("cls");
exitflag2=0;
while(!exitflag2)
{
menu3();
scanf("%d",&k);
switch(k)
{
case 0: exitflag2=1;system("cls");break;
case 1:
system("cls");
printf("以非递归方式进行的树的先序遍历序列为:\n");
Preorder_2(T);
printf("\n");
break;
case 2:
system("cls");
printf("以非递归方式进行的树的中序遍历序列为:\n");
InOrder_2(T);
printf("\n");
break;
case 3:
system("cls");
printf("以非递归方式进行的树的后序遍历序列为:\n");
PostOrder_2(T);
printf("\n");
break;
default:system("cls");
printf("警告!你给的选项号非法,请重新输入!\n");
break;
}
}
default:system("cls");
printf("警告!你给的选项号非法,请重新输入!\n");
break;
}
}
return 0;
}
具体要看你的代码。
你怎么判断的返回菜单。
加上一个 getchar(); 把多余的回车吸收下看看。