这个二叉树的遍历生成哪里错了?报错的地方已经标注。

奔跑的码农 发布于 2016/05/04 16:04
阅读 82
收藏 0
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;


typedef int Status;


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


typedef BiTree pElemType;
typedef struct Snode
{
 pElemType data;  
 struct Snode *next; 
}Snode,*LinkStack;






Status CreateBiTree(BiTNode *T)
{
int ch;
scanf("%d",&ch);
if(ch==' ') T=NULL;
else{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))exit(0);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 1;
}


 void Init_StackL(LinkStack *S)
{
 *S=NULL;
}
Status Push_L(LinkStack *S,pElemType x) 
{
 LinkStack p;
 p=(LinkStack)malloc(sizeof(Snode)); 
 p->data=x;        
 p->next=*S;        
 *S=p;
 return 1;
}
Status  Pop_L(LinkStack *S,pElemType *temp_) 
{
 LinkStack p;
 pElemType temp;
 if(*S==NULL) return 0;   
 temp=(*S)->data;      
 p=*S;         
 *S=p->next;
 free(p);        
 *temp_=temp;
 return 1;
}
Status  StackEmpty(LinkStack *S) 
{


 if(*S==NULL) return 0;     
else
 return 1;
}
Status InOrderTraverse(BiTNode *T)
{
   LinkStack S;
   Init_StackL(&S);
    BiTNode *p=T;/*这一行开始报错*/
 while(p||StackEmpty(&S)){
if(p){Push_L(&S,p);p=p->lchild;}
else{
Pop_L(&S,&p);
p=p->rchild;
}
 }
 return 1;
 }
void main()
{
BiTNode T;
CreateBiTree(&T);
InOrderTraverse(&T);
system("pause");
}
加载中
0
xpbob
xpbob
CreateBiTree(&T);这里就已经出错了,你传递的指针重新赋值了,所以根据你的函数最后获取的T压根没有值或者是随意的一个值,不信你可以打印试试,你要不传递BiTNode 的二级指针要不用引用,顺便说一句,别人起别名是为了好用,你起别名反而更难用了,干嘛要把类型和类型的指针分开命名,看一会我就乱了
xpbob
xpbob
回复 @奔跑的码农 : 这和环境什么的都有关系,而且不同的编译器对这些脏值的处理还都不一样,建议你用C++吧,这些问题出现的比较明显
奔跑的码农
奔跑的码农
Init_StackL(&S); BiTNode *p=T;/*这一行开始报错*/ 有个奇怪的问题,这两行交换位置在Turbo2.0下就不报错了 打印确实产生垃圾值。我在修改一下。
返回顶部
顶部