美国 汽车金融租赁:C编程中树的问题

来源:百度文库 编辑:中科新闻网 时间:2024/04/29 07:06:19
我编了一个算法,但是运行以后,输值以后不能正确输出,是怎么回事,请高手指点一下。
#include "stdio.h"
typedef char TElemType;

#define TRUE 1
#define FALE 0
#define OK 1
#define ERROR 0
#define INFEAIBLE -1
#define OVERFLOW -2
typedef int Status;

typedef struct BiTNode { TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

int Visit(TElemType e)
{printf("%c",e);
return OK;
}

int CreateBiTree(BiTree T)
{/*按先序次序输入二叉树中节点的值(一个字符),空格字符表示空树,构造二叉链表表示的二叉树T。*/
char ch,c;
printf("Please Enter the number:");
scanf("%c",&ch);
c=getchar();
if (ch==' ') T='\0';
else {if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit (OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return T;
}

Status PreOrderT (BiTree T)
{ if(T)
{if(Visit(T->data))
if(PreOrderT(T->lchild))
if(PreOrderT(T->rchild)) return OK;
return ERROR;
}
else return OK;
}

Status PostOrderT (BiTree T)
{ if(T)
{if(PostOrderT(T->lchild))
if(PostOrderT(T->rchild))
if(Visit(T->data)) return OK;
return ERROR;
}
else return OK;
}

Status InOrderT (BiTree T)
{ if(T)
{if(InOrderT(T->lchild))
if(Visit(T->data))
if(InOrderT(T->rchild)) return OK;
return ERROR;
}
else return OK;
}

main()
{ int m,e;
BiTNode *T;
while(1)
{
printf("\n\n Welcome to use the progrome\n");
printf("--------------------------------------------\n");
printf("| 1 PreCreat Tree |\n");
printf("| 2 PreOrder Tree |\n");
printf("| 3 InOrder Tree |\n");
printf("| 4 PostOrder Tree |\n");
printf("| 5 Progrom exit |\n");
printf("--------------------------------------------\n");
printf("Please choose the function : ");
scanf("%d",&m);
getchar();
switch (m)
{ case 1:CreateBiTree(T); break;
case 2:printf("Pre Order the Tree is:");
PreOrderT (T); break;
case 3:printf("In Order the Tree is:");
InOrderT (T); break;
case 4:printf("Post Order the Tree is:");
PostOrderT (T); break;
case 5:exit(0);
}
}
}
我知道是创建函数有问题,而且是int CreateBiTree(BiTree T),还有
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);这几句有问题,但我不知道为啥选2。3.4输出时TC怎么会自动退出。
谢谢tanyuguo 的解释,我的确在那有错误,可是为什么输出时怎么会自动退出,很奇怪,就算没创建树,
case 2:printf("Pre Order the Tree is:");
case 3:printf("In Order the Tree is:");
case 4:printf("Post Order the Tree is:"); 这些语句应该执行啊,怎么会自动退出???????
而且我按你的方法做了修改以后还是没法正确输出,还是自动退出,怎么回事?

楼主犯了个初学者常犯的错误,就是没有牢记C语言中函数参数采用的是值传递方式。
在main中创建树是,传给CreateBiTree的其实是T的一个临时拷贝,CreateBiTree只是对这个拷贝进行操作,对T的值没有任何影响,最后结果只是在内存中创建了几个零散的子树,最后T的值仍为初始值。
建议将CreateBiTree的参数改为BiTree *T,函数内用到T的地方改为*T。