Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

292
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda