写了一年多的C ++了,今天写二叉搜索树ADT中的deletemin()的时候出现了一个非常奇怪,从未见过的问题---指针在赋值给其他指针变量一次之后,自己自动的改变了,简直是吓死我了
排查这个问题用了一个多小时,通过调试和输出过程量,最后确定了就是在这个deletemin()函数中许多指针在赋值之后都会自动跳变,完全失去了控制:
Node* BST :: deletemin(Node*& r){
if(r == NULL){
return NULL;
}
if(r->lc == NULL){
if(r->rc != NULL){
if(r->father != NULL){
r->rc->father = r->father;
r->father->lc = r->rc;
return r;
}
else{
cout << "赋值前:r->rc = " << r->rc << endl;
cout << "赋值前:root = " << root << endl;
this->root = r->rc;
cout << "r->rc = " << r->rc << endl;
cout << "root = " << root << endl;
cout << "r->rc->father" << r->rc->father << endl;
cout << "root->father" << r->father << endl;
root->father = NULL;
return r;
}
}
else{
Node* temp = r;
r = NULL;
return temp;
}
}
return deletemin(r->lc);
}
这个二分搜索树我使用了一个父指针便于向上搜索和方便写除去函数,但是deletemin这个函数还没搞定,写不了除去函数
出现跳变的证据:
从图中可以看到,每次赋值结束,R-> RC的值就会自动移动,简直像见了鬼一样
目前还没有解决,,,,,,
//2018/11/16问题完美解决(凌晨),原因是传入的是指针的引用,所以当传入参数树的根节点的时候,若有r == root 成立,本质是同一个指针的不同名字,上面的root = r->rc就是root = root->rc 也就是 r = r->rc 也等效于 r = root->rc
//2018/11/16带有父指针的二分搜索树完美运行,实现了13个常用ADT,代码先不发,等验收过了再发,否则被抄了就0分了