• Sábado 9 de Noviembre de 2024, 03:41

Autor Tema:  necesito que me ayudeis a definir  (Leído 1328 veces)

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
necesito que me ayudeis a definir
« en: Viernes 19 de Septiembre de 2008, 18:40 »
0
Hola yo he definido un paciente

struct Tpaciente{
//con sus respectivos campos
};

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;

pero mi pregunta es que como me defino una lista dentro de un nodo de una pila?
asi lo entiendo con la siguiente afirmacion "el nodo de la pila contendrá una lista con los nodos de los pacientes".

Me podeís explicar como lo defino? es que os lo digo realmente me cuesa mucho entenderlo.
Gracias de antemano.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: necesito que me ayudeis a definir
« Respuesta #1 en: Viernes 19 de Septiembre de 2008, 22:39 »
0
Wenas paco

Aclararte que no necesitas dos registros iguales, como los que presentas:

Cita de: "pacorubio77"
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?

Código: C
  1.  
  2. /*Creamos una variable tNODOPILA*/
  3. PILA = malloc(sizeof(tNODOPILA));
  4.  
  5.  

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:

Código: C
  1.  
  2. Tpaciente pacienteA;
  3. /*Insertamos un paciente*/
  4. PILA->paciente = pacienteA;
  5. /*Como sólo tenemos un paciente, no hay siguiente, por lo tanto a NULL*/
  6. PILA->sig = NULL;
  7.  
  8.  

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()  ;) ?

Código: C
  1.  
  2. Tpaciente pacienteB;
  3. /*Creamos otra variable tNODOPILA*/
  4. pNODOPILA = malloc(sizeof(tNODOPILA));
  5. /*Insertamos un paciente*/
  6. PILA->paciente = pacienteB;
  7. /*¿Y el siguiente?*/
  8.  
  9.  

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:

Código: C
  1.  
  2. /*El siguiente del que acaba de llegar (pacienteB) es el que estaba antes (pacienteA)*/
  3. pNODOPILA->sig = PILA;
  4. /*El primero es el que acaba de llegar (pacienteB)*/
  5. PILA = pNODOPILA;
  6.  
  7.  

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:

Código: C
  1.  
  2. /*Para acordarnos del primero*/
  3. pNODOPILA = PILA;
  4. /*El primero pasa a ser el siguiente del que era primero*/
  5. PILA = PILA->sig;
  6. /*Liberamos la memoria ocupada por el dato ya procesado*/
  7. free(pNODOPILA);
  8.  
  9.  

Espero que me haya explicado bien. Cualquier duda, ya sabes: pregunta en otro foro  :D  (es broma)

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: necesito que me ayudeis a definir
« Respuesta #2 en: Sábado 20 de Septiembre de 2008, 12:53 »
0
Hola leí atentamente su explicacion,pero si me perdona tengo una pregunta esencial....
Todo lo que me ha explicado es para que dentro de un nodo pila tenga una lista de nodos?,pero los nodos de mi lista,como los relaciono? o mejor dicho como los enlazo?

y lo más importante como los desenlazo?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: necesito que me ayudeis a definir
« Respuesta #3 en: Domingo 21 de Septiembre de 2008, 01:20 »
0
:ph34r:  :ph34r:  :ph34r:

Cita de: "pacorubio77"
pero los nodos de mi lista,como los relaciono? o mejor dicho como los enlazo?

Cita de: "m0skit0"
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:

Mostrar/Ocultar Número de línea | Expandir/Contraer | Seleccionar todo

   1.  
   2. /*El siguiente del que acaba de llegar (pacienteB) es el que estaba antes (pacienteA)*/
   3. pNODOPILA->sig = PILA;
   4. /*El primero es el que acaba de llegar (pacienteB)*/
   5. PILA = pNODOPILA;
   6.  

Cita de: "pacorubio77"
y lo más importante como los desenlazo?

Cita de: "m0skit0"
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*/
# free(pNODOPILA);
#