语法规则与具体的IDE、编译器无关(除非使用一些特定编译器支持的不标准的特定操作,比如在TC2中可以不包含stdio.h而直接调用printf()等函数),如果你完全按照ANSI C标准写程序,就可以在任何一个现行的编译器上正确的编译,而完全无需考虑是否行的通的问题(除非有编程错误)。
TC3比TC2好是一定的,但是不建议现在还使用这两个工具,它们都是近20年前的东西了,所用的技术早已过时,而且也根本不能反映现在的硬件水平(例如,TC2只允许程序使用640KB的内存)!
强烈建议更换编程工具,不要再争论TC2与TC3谁更好的问题了!如果实在舍弃不下字符界面,就用GCC吧!
********************************************************
1.没有包含必要的头文件stdlib.h,用到了该文件中声明的一些函数,例如malloc()
2.在pre()函数中:
if(visit(t))
if(pre(t->lchild,visit(t->lchild)))
if(pre(t->rchild,visit(t->rchild)))
应改为:
if((*visit)(t))
if(pre(t->lchild,visit))
if(pre(t->rchild,visit))
3.建议将 bitnode *creat() 改为 bitnode *creat(void) 以避免部分编译器输出警告或者错误信息。
4.没有必要为NULL重新定义,请去掉相关的宏定义,如果保留,会在部分编译器中出错
第二点是导致错误的重点所在,另外如不做出第一点、第三点和第四点的更正,部分编译器可能还是会报错。
修改后的程序如下,在BCB2007中测试正常:
//---------------------------------------------------------------------------
#include
#include
#include
#define OK 1
#define OVERFLOW -2
#define ERROR -1
typedef struct bitnode
{
char data;
struct bitnode *lchild,*rchild;
}bitnode;
bitnode *creat(void) /*注意这里*/
{
bitnode *t;
char ch;
ch=getch();putch(ch);
if(ch=='0') t=NULL;
else
{
t=(bitnode *)malloc(sizeof(bitnode));
if(!t)
{
printf("先序建立二叉树失败!");
exit(OVERFLOW);
}
t->data=ch;
t->lchild=creat();
t->rchild=creat();
}
return(t);
}
int pre(bitnode *t,int (*visit)(bitnode *))
{
if(t)
{
if((*visit)(t)) /****重点!注意这里****/
if(pre(t->lchild,visit))
if(pre(t->rchild,visit))
return OK;
return ERROR;
}else
return OK;
}
int print(bitnode *t)
{
printf("\n%c",t->data);
return OK;
}
void main()
{
bitnode *t1;
t1=creat();
pre(t1,print);
}
//---------------------------------------------------------------------------