簡體   English   中英

為什么我會收到“需要作為一元和操作數的左值”錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM