BiTree&TとBitree TとBitNode*TとT->lchild


typedef struct BitNode{
    int data;
    BitNode *lchild,*rchild;
}BitNode,*BiTree;

typedefは別名を取る役割があるので、BitNodeの意味はstruct BitNode{...)、BiTreeの意味はstruct BitNode{...)*です.
BiTree&Tはポインタアドレスを取るという意味で、int&a、aを取るアドレスと同じです.
BitNode*TとBiTree Tは、構造ポインタ変数を定義します.
このような関数があります
       int insertBST(BiTree &T, int e) {
    BiTree p;
    if (!searchBST(T, e, NULL, p)) {
        BiTree s = (BiTree)malloc(sizeof(BitNode));
        s->data = e;
        s->lchild = s->rchild = NULL;
        if(!p)    
            T = s;
        else if LT(e, p->data)    p->lchild = s;
        else    p->rchild = s;
        return TRUE;
    }
    else    return FLASE;
}

そのパラメータはBiTree&Tで、これはポインタを修正するためで、1つの値を修正するには、そのアドレスを知らなければならないので、ポインタアドレスのアドレスを取るのはint aに似ていて、関数でaを修正するにはint local(int&a)が必要です.int insertBST(BitNode*(&T)、int e)と書くこともできますが、関数のT->lchild、T->rchild、T->dataは何をしていますか?それらはこのTポインタを修正して、あなたのTポインタはずっとNULLで、あなたはそれを(BiTree)malloc(sizeof(Node))この空間を指さしました!!!つまり、このTポインタをずっと修正していると、デバッグ中にTのアドレスが変化していることに気づきます.では、あなたは彼の引用を使うのではないでしょうか.