这个程序如何错误?怎么办?
#include <stdio.h>
#include <malloc.h>
typedef struct btnode
{
int data;
struct btnode *lchild,*rchild;
}BTONDE;
void createbintree(BTONDE *t)
{
int data;
scanf("%d",&data);
if(data==0)
{
t=NULL;
}
else
{
t=(BTONDE *)malloc(sizeof(BTONDE));
t->data=data;
createbintree(t->lchild);
createbintree(t->rchild);
}
}
void prerodrdet(BTONDE *t)
{
if(t)
{
printf("%d",t->data);
prerodrdet(t->lchild);
prerodrdet(t->rchild);
}
}
int main(void)
{
BTONDE t1;
BTONDE *t=&t1;
createbintree(t);
printf("the is\n");
prerodrdet(t);
return 0;
}
[解决办法]
使用引用改变实参,或者返回节点指针
- C/C++ code
#include <stdio.h>#include <malloc.h>typedef struct btnode{ int data; struct btnode *lchild,*rchild;}BTONDE;void createbintree(BTONDE *&t) //如果是用C++的话,就用引用,函数返回是可以改变实参{ int data; scanf("%d",&data); if(data==0) { t=NULL; } else { t=(BTONDE *)malloc(sizeof(BTONDE)); t->data=data; createbintree(t->lchild); //否则t->lchild是不会复制为NULL的 createbintree(t->rchild); }}BTONDE * createbintree() //如果用C语言的话{ int data; scanf("%d",&data); BTONDE * t; if(data==0) { t=NULL; } else { t=(BTONDE *)malloc(sizeof(BTONDE)); t->data=data; t->lchild = createbintree(); t->rchild = createbintree(); } return t;}void prerodrdet(BTONDE *t){ if(t) { printf("%d",t->data); prerodrdet(t->lchild); prerodrdet(t->rchild); }}int main(void){ //BTONDE t1; //不必要 //BTONDE *t=&t1; BTONDE *t; //createbintree(t); // C++可以这样调用 t = createbintree(); printf("the is\n"); prerodrdet(t); return 0;}
[解决办法]
- C/C++ code
#include <stdio.h>#include<stdlib.h>#define Ok 1#define Error 0typedef int Status;typedef int TElemType ;typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTNode *CreatBiTree(BiTree &t){ char ch; ch=getchar(); getchar(); if(ch==' ') t=NULL; else{ t=(BiTNode*)malloc(sizeof(BiTNode)); if(!t) exit(1); t->data=ch; printf("请输入%c的左节点",t->data); t->lchild=CreatBiTree(t->lchild); printf("请输入%c的右节点",t->data); t->rchild=CreatBiTree(t->rchild); } return t;}Status printelement(TElemType e){ printf("%c",e); return Ok;}Status PreOrderTraverse(BiTree t,Status (*visit)(TElemType e)){ if(t) { if(visit(t->data)) if(PreOrderTraverse(t->lchild,visit)) if(PreOrderTraverse(t->rchild,visit) ) return Ok; return Error; } else return Ok;}void main(){ BiTree tree; CreatBiTree(tree); PreOrderTraverse(tree,printelement); getchar(); getchar();}