我正在研究一個在二叉搜索樹中插入一個值的函式,我寫了這個代碼:
// this is my decalarations if its relevent
typedef struct element* tree;
typedef struct element
{
type data;
tree right;
tree left;
} noed;
tree rightSon(tree head)
{
return (head->right);
}
void insert(tree* a,int val)
{
if(!empty(*a)) {
if((*a)->data>val) {
if(!empty(leftSon(*a)))
insert(&leftSon(*a),val); // error here leftson return a tree
else {
(*a)->left=newNoed(val);
}
}
else if((*a)->data<val) {
if(!empty(rightSon(*a)))
insert(&rightSon(*a),val); //same error here
else
(*a)->right=newNoed(val);
}
else printf("value already exist!\n");
}
else {
*a=newNoed(val);
}
}
我通過宣告型別的區域變數tree然后像這樣為它們分配值來解決這個問題:
tree lson;
lson=leftson(*a);
insert(&lson,val);
但我仍然不明白首先是什么問題。
uj5u.com熱心網友回復:
似乎函式leftSon(和rightSon)具有回傳型別tree。也就是說它回傳一個臨時物件。您不能像在此陳述句中那樣將運算子 & 應用于臨時物件
insert(&leftSon(*a),val);
您可以在不呼叫 leftSon 或 rightSon 函式的情況下撰寫代碼
if(!empty(rightSon(*a)))
insert( &(*a)->right ,val);
實際上像這樣的 if-else 陳述句
if(!empty(leftSon(*a)))
insert(&leftSon(*a),val); // error here leftson return a tree
else
{
(*a)->left=newNoed(val);
}
是多余的。而不是他們,你可以只寫
insert( &(*a)->left, val );
和
insert( &(*a)->right, val );
uj5u.com熱心網友回復:
您的rightSon函式正在回傳存盤在 的指標物件的值head->right。你不能取值的地址。
您想要做的是rightSon回傳地址,head->right然后可以直接將其傳遞給insert.
所以改成rightSon回傳地址:
tree *rightSon(tree head)
{
return &head->right;
}
并這樣稱呼它:
insert(rightSon(*a),val);
leftSon 大概有同樣的問題,所以做一個類似的改變。
此外,將指標隱藏在 a 后面typedef被認為是不好的做法,因為僅通過查看該型別的變數是指標的代碼就不再明顯了,并且會導致讀者混淆。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/400302.html
標籤:C
上一篇:為什么這個程式會重復列印字符,而它們只出現在堆記憶體中一次?
下一篇:餐飲野蠻人問題-信號量和互斥量
