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;}
- línea 4
Lleva nombre propio,struct Nodo, además deltypedefde abajo. Dentro de sí mismo el nombre corto todavía no existe. - línea 6
Aquí está la idea entera: un nodo guarda un puntero a otro nodo. Eso es lo que encadena. - línea 15
El último apunta aNULL. Sin esta marca, recorrer la cadena no sabría dónde parar. - línea 17
Se leen dos saltos seguidos: entra ena, de ahí a su siguiente, y de ahí al valor. Por eso sale 20 y no 10.
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