二叉排序数的删除操作,通过查询函数引用的指针p确定删除结点的位置,再在删除操作中调用查找函数利用指针引用p来删除结点,但为什么从执行结果来看指针p引用根本没起作用

Status SearchBST(BiTree T,KeyType e,BiTree &p){
if(!T) return FALSE;
else {
if(++count&&T->data.key==e)
{ p=T; return TRUE; }
else if(T->data.key>e)
{ p=T; SearchBST(T->lchild,e,p); }
else
{ p=T; SearchBST(T->rchild,e,p); }
}}
Status DeleteBST(BiTree &T,KeyType e,BiTree &p){
BiTree q,r;
if(!SearchBST(T,e,p)) {
printf("树中不存在该元素,删除失败!\n"); return FALSE; }
if(!p->lchild&&!p->rchild)//若删除的是叶子结点,直接删除,指针变NULL
{ q=p; p=NULL; free(q); }
else if(!p->lchild)//若删除结点只有右,删除结点后让右接班
{ q=p; p=p->rchild; free(q); }
else if(!p->rchild)//若删除结点只有左,删除结点后让左接班
{ q=p; p=p->lchild; free(q); }
else //既有左也有右,找删除结点的中序前驱做替死鬼,赋给删除结点其前驱的值后,删除前驱结点
{ r=p->lchild; q=p;
if(!r->rchild) { p->data.key=r->data.key; q->lchild=r->lchild; free(r); } else { while(r->rchild) { q=r; r=r->rchild; } //找删除结点的中序前驱(左子树的右到没有右) p->data.key=r->data.key; q->rchild=r->lchild; free(r); } } printf("%d元素删除成功!\n",e); return TRUE;}
int main()
{ BiTree T,p=NULL; KeyType e;
printf("请输入待删除的元素:");
scanf("%d",&e);
DeleteBST(T,e,p);
}

img

img