二叉树的线索化问题,程序第一次编译能运行,再次运行就出问题

求大神帮忙看一下下面的代码,,,,程序第一次编译能运行,再次运行就出问题,,为什么,苦恼了好几天
#include
#include
#include
#include
using namespace std;
typedef struct BiNode {
char data;
struct BiNode *left, *right; //左右孩子指针
int LTag, RTag;
}BiThrNode, * BiThtTree;

BiThtTree pre=NULL ;
void CreateBiThtTree(BiThtTree &T)
{//先序构建二叉树
char ch;
ch = getchar();
if (ch == '#')
T == NULL;
else
{
T = (BiThtTree)malloc(sizeof(BiThrNode));
T->data = ch;
T->LTag = 0;
T->RTag = 0;
CreateBiThtTree(T->left);//构建左子树
CreateBiThtTree(T->right);//构建右子树
}
}

void InThreading(BiThtTree &p)
{
if (p)
{
InThreading(p->left);
if (!p->left)
{
p->LTag = 1;
p->left = pre; //前继线索
}
if (!pre->right)
{
pre->RTag = 1;
pre->right = p; //后继线索
}
pre = p;
InThreading(p->right);
}
}
void InOrderThreading(BiThtTree &Thrt, BiThtTree &T)
{//有头结点的线索化

Thrt = (BiThtTree)malloc(sizeof(BiThrNode));///Thrt = new BiThrNode;//初始化头结点
Thrt->LTag = 0;//头结点左孩子为非空,右孩子空
Thrt->RTag = 1;//头结点右线索
Thrt->right = Thrt;//头结点右线索直指向自己
if (!T)
    Thrt->left = Thrt; //树为空
else {
    Thrt->left = T;  //左孩子指向树,
    pre = Thrt;       //初始化pre为指向头结点
    InThreading(T);    //中序遍历
    pre->right = Thrt; //遍历结束后pre指向最后的右节点,并将右节点右孩子指向头结点
    pre->RTag = 1;
    Thrt->right = pre;  //头结点右线索指向最后的右节点

}

}
void InOrderTraverse_Tht(BiThtTree &T)
{//T指向头结点,头结点的左链表lchild指向根节点,
BiThtTree p;
p = T->left;
//system("pause");
while (p != T) {
while (p->LTag == 0)
p = p->left;
cout << p->data << " ";
while (p->RTag == 1 && p->right != T) {
p = p->right;
cout << p->data << " ";

    }
    p = p->right;
}

}
void pre_order(BiThtTree T)
{
if (T != NULL)
{
cout <data << " ";
pre_order(T->left);
pre_order(T->right);
}
}

int main()
{
BiThtTree T, Thrt;
CreateBiThtTree(T);
pre_order(T);
InOrderThreading(Thrt,T);
InOrderTraverse_Tht(Thrt);
system("pause");
}

http://blog.csdn.net/algorithm_only/article/details/6991254/