Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

294
Views
¿Por qué recibo un error de "valor requerido como unario y operando"?

Estoy trabajando en una función que inserta un valor en un árbol de búsqueda binario, escribí este código:

 // 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); } }

Resolví el problema declarando variables locales de tipo tree y luego asignándoles los valores de esta manera:

 tree lson; lson=leftson(*a); insert(&lson,val);

Pero todavía no entiendo cuál era el problema en primer lugar.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Parece que la función leftSon (y rightSon ) tiene el tipo de retorno tree . Es decir, devuelve un objeto temporal. No puede aplicar el operador & a un objeto temporal como en esta declaración

 insert(&leftSon(*a),val);

Podrías escribir el código sin llamar a las funciones hijo izquierdo o hijo derecho como

 if(!empty(rightSon(*a))) insert( &(*a)->right ,val);

De hecho, las declaraciones if-else como esta

 if(!empty(leftSon(*a))) insert(&leftSon(*a),val); // error here leftson return a tree else { (*a)->left=newNoed(val); }

son redundantes. En lugar de ellos, podrías escribir

 insert( &(*a)->left, val );

y

 insert( &(*a)->right, val );
over 4 years ago · Santiago Trujillo Report

0

Su función rightSon está devolviendo el valor del objeto puntero almacenado en head->right . No puede tomar la dirección de un valor.

En cambio, lo que desea hacer es hacer que rightSon devuelva la dirección de head->right , que luego se puede pasar directamente a insert .

Así que cambie rightSon para devolver la dirección:

 tree *rightSon(tree head) { return &head->right; }

Y llámalo así:

 insert(rightSon(*a),val);

presumiblemente, leftSon tiene el mismo problema, así que haga un cambio similar para eso.

Además, ocultar un puntero detrás de una typedef de tipo se considera una mala práctica, ya que ya no es obvio con solo mirar el código que una variable de ese tipo es un puntero y puede causar confusión al lector.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!