线索二叉树,问题出在哪里


#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef struct BiNode{
    struct BiNode *lchild,*rchild;
    int ltag,rtag;
    TElemType date;
}BiNode,*BiTree;
int InitBiTree(BiTree *t)
{
    (*t)=(BiNode*)malloc(sizeof(BiNode));
    if(!(*t)) return 0;
    (*t)->lchild=NULL;
    (*t)->rchild=NULL;
    (*t)->date='\0';
    (*t)->ltag=0;
    (*t)->rtag=0;
}
int CreatBiTree(BiTree *t)
{
    TElemType ch;
    scanf("%c",&ch);
    if(ch!='#'){
        (*t)=(BiNode*)malloc(sizeof(BiNode));
        (*t)->date=ch;
        (*t)->ltag=0;
        (*t)->rtag=0;
        CreatBiTree(&(*t)->lchild);
        CreatBiTree(&(*t)->rchild);
    }
    else (*t)=NULL;
}
int InOrderTraverse(BiTree *t,BiTree *pre)
{
    if((*t)){
        InOrderTraverse(&(*t)->lchild,&(*pre));
        if((*t)->lchild==NULL){
            (*t)->ltag=1;
            (*t)->lchild=*pre;
        }
        if((*pre)->rchild==NULL){
            (*pre)->rtag=1;
            (*pre)->rchild=*t;
        }
        pre=t;
        InOrderTraverse(&(*t)->rchild,&(*pre));
    }
    else return ;
} 
int Traverse(BiTree t)
{
    BiNode *p;
    p=t->lchild; 
    while(p!=NULL){
        printf("%c ",p->date);
        if(p->rtag==1) p=p->rchild;
        if(p->ltag==0) p=p->lchild;
    }
}
int main()
{
    BiTree T1,T=NULL,Pre=NULL;
    InitBiTree(&T1);
    Pre=T1;
    T1->lchild=T;
    CreatBiTree(&T);
    InOrderTraverse(&T,&Pre);
    Pre->rtag=1;
    Pre->rchild=T1;
    Traverse(T1);
    return 0;
} 

#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef struct BiNode{
    struct BiNode *lchild,*rchild;
    int ltag,rtag;
    TElemType date;
}BiNode,*BiTree;
int InitBiTree(BiTree *t)
{
    (*t)=(BiNode*)malloc(sizeof(BiNode));
    if(!(*t)) return 0;
    (*t)->lchild=NULL;
    (*t)->rchild=NULL;
    (*t)->date='\0';
    (*t)->ltag=0;
    (*t)->rtag=0;
}
int CreatBiTree(BiTree *t)
{
    TElemType ch;
    scanf("%c",&ch);
    if(ch!='#'){
        (*t)=(BiNode*)malloc(sizeof(BiNode));
        (*t)->date=ch;
        (*t)->ltag=0;
        (*t)->rtag=0;
        CreatBiTree(&(*t)->lchild);
        CreatBiTree(&(*t)->rchild);
    }
    else (*t)=NULL;
}
int InOrderTraverse(BiTree *t,BiTree *pre)
{
    if((*t)){
        InOrderTraverse(&(*t)->lchild,&(*pre));
        if((*t)->lchild==NULL){
            (*t)->ltag=1;
            (*t)->lchild=*pre;
        }
        if((*pre)->rchild==NULL){
            (*pre)->rtag=1;
            (*pre)->rchild=*t;
        }
        *pre=*t;
        InOrderTraverse(&(*t)->rchild,&(*pre));
    }
    else return ;
} 
int In(BiTree *t1,BiTree *t,BiTree *pre) 
{
    (*t1)->ltag=1;
    if(!(*t)) (*t1)->lchild=(*t1);
    else{
        (*t1)->lchild=(*t);
        (*pre)->rtag=1;
        (*pre)->rchild=(*t1);
    } 
}
int Traverse(BiTree t)
{
    BiNode *p;
    p=t->lchild; 
    while(p!=t){              //空树或遍历结束时,p==T
        while(p->ltag==0)      //沿左孩子向下
            p=p->lchild;     //访问其左子树为空的结点
        printf("%c ",p->date);
        while(p->rtag==1&&p->rchild!=t){
            p=p->rchild;    //沿右线索访问后继结点
            printf("%c ",p->date);
        }
        p=p->rchild;
    }
}
int main()
{
    BiTree T1,T=NULL,Pre=NULL;
    InitBiTree(&T1);
    Pre=T1;
    CreatBiTree(&T);
    InOrderTraverse(&T,&Pre);//中序线索二叉树的建立 
    In(&T1,&T,&Pre);//将首元节点加入 
    Traverse(T1);
    return 0;
} 

你现在测试有什么不正常现象啊?

把这个函数的前几行,改成这样的,你试试看


int CreatBiTree(BiTree *t)
{
    TElemType ch;
    scanf("%c",&ch);
    getchar();