1. 程式人生 > >BiTree &T 和Bitree T

BiTree &T 和Bitree T

想必大家學習資料結構的時候一直會猶豫這個問題,為什麼要用BiTree &T 和Bitree T。有如下定義

typedef struct Node{
	char data;
	struct Node *lchild, *rchild;
}*BiTree, Node;
//二叉排序數的插入操作
void Insert(BiTree &T, char c){
if (T == NULL){
T = (BiTree)malloc(sizeof(Node));
T->data = c;
T->lchild = T->rchild = NULL;
return;
}
else if (c == T->data)
return;
else if (c < T->data)
return Insert(T->lchild, c);
else
return Insert(T->rchild, c);
}

BiTree 本身已經是一個指標了,為什麼要用Bitree &T呢?

首先明確一個問題:Bitree &T 中的&是引用,這個也就是取地址的意思,這個只有C++中才有,你也可以用C中的指標,用Bitree *T,但是這樣你呼叫Insert時就必須這樣呼叫Insert(&T).

這裡為什麼要用指標取指標T的地址呢,因為你這裡要修改這個指標。試想一下,當你要在一個函式修改一個int變數的時候,你會去用fun(*p)或者funz(&i)。同理,你修改一個指標也要用指標的指標(即二級指標)或者指標的引用。

第二個問題來了,有人肯定會跟我一樣,認為自己並不要修改這個指標,因為你想修改的只是這個指標T的T->lchild和T->rchild和T->data。其實,你犯了一個大錯,你從來沒有修改過T->lchild和T->rchild和T->data。你只是一直在修改這個T指標,你的T指標一直是NULL,而你讓它指向了(BiTree)malloc(sizeof(Node))這個空間!!!即一直在修改這個T指標,除錯時你會發現你的T的地址發生了變化。那麼你說你是不是要用他的引用啊!

第三個問題,有人也會覺得自己一直在改變T的值,那麼返回之後這個T豈不是指向了這棵樹的葉子節點,這你也是多慮了,你其實每次都在遞迴呼叫,最終返回的T還是那個T。

當你用排序的時候,你用Bitree T是沒問題的,因為你只需要使用這個指標,並不需要修改這個指標。