AprenderC
← Todas las lecciones

Una cadena de cajitas

Cada dato en su sitio, y cada uno sabe dónde está el siguiente.

1Por qué

La tabla de la lección anterior tiene un problema que no se ve hasta que estorba: hay que decir el tamaño al pedirla. Si se queda corta, toca pedir otra más grande y copiarlo todo. Y meter un dato en medio obliga a correr hacia atrás todo lo que venía después.

Hay otra forma de guardar varias cosas, y cambia el trato por completo. En vez de tenerlas todas juntas, cada dato vive en su propio sitio y guarda dónde está el siguiente. Eso es una lista enlazada.

Añadir es pedir un sitio más y apuntarlo. Nada se mueve, nada se copia, y no hay tamaño que decidir de antemano.

El precio: no puedes saltar al número 5. Para llegar al quinto hay que pasar por los cuatro anteriores, uno a uno. Los arreglos y las listas se reparten la misma moneda al revés — rápido para saltar, o rápido para crecer — y elegir entre las dos es de las primeras decisiones de diseño de verdad que vas a tomar.

El struct que hace falta tiene algo raro: guarda un puntero a otro igual que él. Por eso lleva nombre propio (struct Nodo) además del typedef: dentro de sí mismo, el nombre corto todavía no existe.

Y el último de la cadena apunta a NULL, que quiere decir «aquí se acabó». Es la misma idea que el cero del final de las palabras.

2Míralo andar

Este programa funciona. Léelo, y después ejecútalo sin cambiar nada.

#include <stdio.h>
#include <stdlib.h>
typedef struct Nodo {
int valor;
struct Nodo *sig;
} Nodo;
int main(void)
{
Nodo *a = malloc(sizeof(Nodo));
Nodo *b = malloc(sizeof(Nodo));
a->valor = 10;
a->sig = b;
b->valor = 20;
b->sig = NULL;
printf("%d\n", a->sig->valor);
free(a);
free(b);
return 0;
}

3Ahora tú

El recorrido de abajo escribe siempre lo mismo y no termina nunca. Escribe la línea que avanza al siguiente

#include <stdio.h>
#include <stdlib.h>
typedef struct Nodo {
int valor;
struct Nodo *sig;
} Nodo;
int main(void)
{
Nodo *a = malloc(sizeof(Nodo));
Nodo *b = malloc(sizeof(Nodo));
Nodo *c = malloc(sizeof(Nodo));
a->valor = 3;
a->sig = b;
b->valor = 7;
b->sig = c;
c->valor = 1;
c->sig = NULL;
Nodo *p = a;
while (p != NULL)
{
printf("%d\n", p->valor);
}
free(a);
free(b);
free(c);
return 0;
}

↖︎ Tu línea va aquí. Sin ella, p se queda en el primero para siempre.

Ejecutar

Lo que dice tu programa

↖︎ Escribe tu parte y dale a Ejecutar

Qué pasó

Aquí te aviso si tu programa hace algo raro.

    4Qué guarda tu programa

    Memoria

    ↖︎ Ejecuta el programa para ver qué pasa por dentro