Pregunta con estructuras y Pilas en C - Cual es la opcion correcta.

Iniciado por palacio29, 22 Octubre 2016, 02:45 AM

0 Miembros y 1 Visitante están viendo este tema.

palacio29

Hola


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

struct s_persona
{
    char nombre[25];
    int edad;
    int fnacimiento;
};
typedef struct s_persona tPers;

struct s_nodo
{
    struct s_persona prs;
    struct s_nodo *sig;
};
typedef struct s_nodo *t_nodo;



Si yo quiero insertar en una pila elementos de tipo tPers

Cual seria la opcion correcta... Esta

void push(t_nodo* pila,tPers persona)
{
    t_nodo aux=NULL;
    aux=(t_nodo)malloc(sizeof(struct s_nodo));
    if(aux==NULL)
        return;
    aux->prs=persona;
    aux->sig=*pila;
    *pila=aux;
}



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

void push(t_nodo* pila,tPers persona)
{
    t_nodo aux=NULL;
    aux=(t_nodo)malloc(sizeof(struct s_nodo));
    if(aux==NULL)
        return;
    strcpy(((*pila)->prs).nombre,persona.nombre);
    aux->prs.edad=persona.edad;
    aux->prs.fnacimiento=persona.fnacimiento;
    aux->sig=*pila;
    *pila=aux;
}

ivancea96

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:
struct s_nodo
{
   struct s_persona prs;
   struct s_nodo *sig;
};
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".