1. 程式人生 > >【c++】指標自動改變的問題(已解決)

【c++】指標自動改變的問題(已解決)

寫了一年多的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分了