[英]Why am i getting a "lvalue required as unary & operand" error?
我正在研究在二叉搜索樹中插入一個值的 function,我編寫了以下代碼:
// 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 lson;
lson=leftson(*a);
insert(&lson,val);
但我仍然不明白首先是什么問題。
似乎 function leftSon
(和rightSon
)具有返回類型tree
。 也就是說,它返回一個臨時的 object。 您不能像此語句中那樣將運算符 & 應用於臨時 object
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 );
您的rightSon
function 正在返回存儲在head->right
的指針 object 的值。 您不能獲取值的地址。
你想要做的是讓rightSon
返回head->right
的地址,然后可以直接將其傳遞給insert
。
所以更改rightSon
以返回地址:
tree *rightSon(tree head)
{
return &head->right;
}
並這樣稱呼它:
insert(rightSon(*a),val);
leftSon
大概也有同樣的問題,所以對此進行類似的更改。
此外,將指針隱藏在typedef
后面被認為是不好的做法,因為僅通過查看該類型的變量是指針的代碼就不再明顯,並且可能導致讀者混淆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.