Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: palacio29 en 22 Octubre 2016, 02:45 am



Título: Pregunta con estructuras y Pilas en C - Cual es la opcion correcta.
Publicado por: palacio29 en 22 Octubre 2016, 02:45 am
Hola


Tengo una duda con respecto al tratamiento de estructuras en pilas en C.
Si tengo las siguientes estructuras declaradas

Código
  1. struct s_persona
  2. {
  3.    char nombre[25];
  4.    int edad;
  5.    int fnacimiento;
  6. };
  7. typedef struct s_persona tPers;
  8.  
  9. struct s_nodo
  10. {
  11.    struct s_persona prs;
  12.    struct s_nodo *sig;
  13. };
  14. typedef struct s_nodo *t_nodo;
  15.  


Si yo quiero insertar en una pila elementos de tipo tPers

Cual seria la opcion correcta... Esta

Código
  1. void push(t_nodo* pila,tPers persona)
  2. {
  3.    t_nodo aux=NULL;
  4.    aux=(t_nodo)malloc(sizeof(struct s_nodo));
  5.    if(aux==NULL)
  6.        return;
  7.    aux->prs=persona;
  8.    aux->sig=*pila;
  9.    *pila=aux;
  10. }


Osea asignando directamente toda la estructura o pasando cada dato de la estructura de manera individual como en el siguiente codigo

Código
  1. void push(t_nodo* pila,tPers persona)
  2. {
  3.    t_nodo aux=NULL;
  4.    aux=(t_nodo)malloc(sizeof(struct s_nodo));
  5.    if(aux==NULL)
  6.        return;
  7.    strcpy(((*pila)->prs).nombre,persona.nombre);
  8.    aux->prs.edad=persona.edad;
  9.    aux->prs.fnacimiento=persona.fnacimiento;
  10.    aux->sig=*pila;
  11.    *pila=aux;
  12. }


Título: Re: Pregunta con estructuras y Pilas en C - Cual es la opcion correcta.
Publicado por: ivancea96 en 22 Octubre 2016, 13:37 pm
Ambas sirven, con unas pequeñas pautas:

Si no vas a usar punteros de ningún tipo dentro de la estructura, entonces la primera sirve bien.
Si utilizas algún puntero, la primera será incorrecta, pues no copiarás el contenido del puntero. En tal caso, tendrías que hacer una copia manual de lo apuntado por el puntero (si así lo requiere el programa).

Por cierto, en el código, aveces utilizas "struct s_nodo", a veces "struct s_nodo*", a veces "t_nodo" y a veces "t_nodo*". Ten cuidadado al andar mezclando estas estructuras. Yo de ti, ponía:
Código
  1. struct s_nodo
  2. {
  3.    struct s_persona prs;
  4.    struct s_nodo *sig;
  5. };
  6. typedef struct s_nodo t_nodo;
Sin puntero en t_nodo. Ten en cuenta que tPers no es un puntero tampoco, así que o pones ambos como punteros, o ninguno. Sinó queda incongruente.
Además, se supone que el uso del typedef ahí es para evitar utilizar "struct s_nodo".