Foros del Web » Programación para mayores de 30 ;) » Programación General »

No me entero con la memoria dinámica (pilas, listas...)

Estas en el tema de No me entero con la memoria dinámica (pilas, listas...) en el foro de Programación General en Foros del Web. Hola, estoy intentando entender la memoria dinámica (pilas y colas) y no me está yendo muy bien, ufff... Algún peasso de experto me puede ayudar ...
  #1 (permalink)  
Antiguo 21/03/2005, 03:08
 
Fecha de Ingreso: noviembre-2004
Mensajes: 28
Antigüedad: 20 años
Puntos: 0
Pregunta No me entero con la memoria dinámica (pilas, listas...)

Hola,
estoy intentando entender la memoria dinámica (pilas y colas) y no me está yendo muy bien, ufff... Algún peasso de experto me puede ayudar con esto, plisss?. Se trata de una cadena con encadenamiento simple (¿¿simple, dice??):

struct nodo
{
short n;
struct nodo * sig;
}
struct nodo *p, *pa, *pi; //QUÉ SIGNIFICAN TODOS ESTOS PUNTEROS???
short aux;

void main (void)
{
printf("introduce numero o 0 para terminar:");
scanf("%d", &aux);
while(aux!=0)
{
p=(struct nodo *) malloc(sizeof(struct nodo)); //esto lo puedo entender, es la reserva de memoria

p->n=aux;
p->sig=0; //¿y este baile de punteros? S-(
if(pi==0)
pi=p;
else
pa->sig=p;
pa=p;

printf("introduce numero o 0 para terminar:");
scanf("%d", &aux);
func_clasificacion(); //No es más que una función para ordenar
}
  #2 (permalink)  
Antiguo 21/03/2005, 03:52
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
struct nodo *p, *pa, *pi; //QUÉ SIGNIFICAN TODOS ESTOS PUNTEROS???

p vendría a ser el item que se va agregando cada vez que se mete un entero en la lista, pa vendría a ser el anterior al item actual y pi el primero de todos los nodos.

p->sig = 0; //¿y este baile de punteros? S-(

Esto se pone para marcar que el actual (hasta el momento) es el último nodo que se ha instertado en la lista.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 21/03/2005 a las 03:53
  #3 (permalink)  
Antiguo 21/03/2005, 05:43
 
Fecha de Ingreso: noviembre-2004
Mensajes: 28
Antigüedad: 20 años
Puntos: 0
Pregunta OK, ya empiezo a entender algo

Pero aquí me atasco otra vez:

if(pi==0)
pi=p;
else
pa->sig=p;
pa=p;

¿Me lo explicas? Gracias!!
  #4 (permalink)  
Antiguo 21/03/2005, 06:25
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No se de donde habrás sacado ese código pero la sintaxis no es muy clara que digamos así que lo voy a cambiar para aumentar su legibilidad:

Código:
if(pi == 0)
{
  pi = p; 
}
else 
{
  pa->sig = p; 
}
pa = p;
Ahora voy a tratar de explicarlo:

Si pi todavía no tiene valor es porque estamos agregando el primer nodo a la lista, entonces pi = p (el nodo que se está agregando). De lo contrario pa->sig es igual a p, con lo cual el nodo anterior apuntá al siguiente (p). Finalmente todas las veces se le asigna a pa p, con lo cual pa apunta al último nodo que se agregó.

El chiste de esto es que, a partir de pi->seg podemos rastrear todos los nodos:

Código:
nodo *next = next = pi->sig;
for (;;)
{
  printf("%d\r\n", next->n);    
  if (!next->sig) { break; }
  next = next->sig;     
 }
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 21/03/2005 a las 06:27
  #5 (permalink)  
Antiguo 21/03/2005, 08:39
 
Fecha de Ingreso: noviembre-2004
Mensajes: 28
Antigüedad: 20 años
Puntos: 0
OK, a ver si lo entiendo así

Lo voy a leer con tranquilidad y espero entenderlo, gracias
  #6 (permalink)  
Antiguo 21/03/2005, 09:59
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
De nadas y cualquier cosa preguntá
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:31.