Wenas paco
Aclararte que no necesitas dos registros iguales, como los que presentas:
el nodo paciente definido como:
typedef struct tNODO{
Tpaciente paciente:
tNODO *sig;
}*pNODO,*LISTA;
si yo me defino un nodo de una pila ,lo haría de la siguiente forma:
typedef struct tNODOPILA{
Tpaciente paciente:
tNODOPILA *sig;
}*pNODOPILA,*PILA;
Sólo cambias los nombres. Así que con una nos vale, vamos a quedarnos con tNODOPILA
Primero vamos a entender qué registros tiene tu tipo de datos tNODOPILA: un dato Tpaciente y un puntero a un tNODOPILA. Si te lo imaginas en memoria, sería un bloque de memoria ocupado por un dato del tipo Tpaciente (que ocupará
sizeof(Tpaciente) bytes y un puntero (32 bits, 4 bytes). Ahora bien, nuestro objetivo es conseguir de alguna forma enlazar varias zonas de memoria con estructuras tNODOPILA. ¿Cómo hacemos esto?
/*Creamos una variable tNODOPILA*/
PILA
= malloc(sizeof(tNODOPILA
));
Ahora tenemos un espacio de memoria reservado para nuestros datos, cuya dirección de memoria está almacenada en PILA. Vamos a insertar un paciente en la PILA:
Tpaciente pacienteA;
/*Insertamos un paciente*/
PILA->paciente = pacienteA;
/*Como sólo tenemos un paciente, no hay siguiente, por lo tanto a NULL*/
PILA->sig = NULL;
Esto para el primer paciente. ¿Pero y el segundo? Si hacemos lo mismo, simplemente sustituiremos uno por otro. Así que evidentemente necesitaremos otro sitio para almacenarlo. ¿Alguien ha dicho
malloc() ?
Tpaciente pacienteB;
/*Creamos otra variable tNODOPILA*/
pNODOPILA
= malloc(sizeof(tNODOPILA
));/*Insertamos un paciente*/
PILA->paciente = pacienteB;
/*¿Y el siguiente?*/
Ahora toca relacionar de alguna forma ambas variables tNODOPILA. Utilizaremos el registro
sig. Pero, ¿en qué orden enlazamos ambas? Es decir, ¿qué paciente va primero y cuál segundo? Como es una pila, el último en llegar es el primero en pasar (así de injusta es la vida, chavales), así que:
/*El siguiente del que acaba de llegar (pacienteB) es el que estaba antes (pacienteA)*/
pNODOPILA->sig = PILA;
/*El primero es el que acaba de llegar (pacienteB)*/
PILA = pNODOPILA;
Vale, PILA apunta a pacienteB. Al lado de pacienteB está el puntero al siguiente
sig, que es pacienteA, que es último, puesto que
sig es NULL. Así ya insertamos toda la cantidad de datos que deseemos.
Para quitar un dato, la operación inversa:
/*Para acordarnos del primero*/
pNODOPILA = PILA;
/*El primero pasa a ser el siguiente del que era primero*/
PILA = PILA->sig;
/*Liberamos la memoria ocupada por el dato ya procesado*/
Espero que me haya explicado bien. Cualquier duda, ya sabes: pregunta en otro foro
(es broma)