Edición didáctica en español. El código y sus salidas conservan el original.
Lista enlazada simple en C
Crea, recorre y libera nodos enlazados mediante punteros.

Cada nodo guarda un dato y un puntero al siguiente nodo. head señala el primero; NULL indica el final o una lista vacía. A diferencia de un array, los nodos no tienen que ocupar direcciones consecutivas.
Comprueba malloc antes de escribir en un nodo. Al insertar o borrar, conserva el enlace al resto de la lista y actualiza head si cambia el primer nodo. Buscar un valor requiere recorrer la lista y cuesta O(N).
Para liberar la lista, guarda el siguiente puntero antes de llamar a free sobre el nodo actual. Prueba listas vacías, de un nodo y de varios nodos; nunca consultes un nodo después de liberarlo.
Código C
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node* insertHead(Node *head, int val) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = val;
newNode->next = head;
return newNode;
}
void printList(Node *head) {
Node *curr = head;
while (curr != NULL) {
printf("%d -> ", curr->data);
curr = curr->next;
}
printf("NULL\n");
}
void freeList(Node *head) {
Node *curr = head;
while (curr != NULL) {
Node *temp = curr;
curr = curr->next;
free(temp);
}
}
int main() {
Node *head = NULL;
head = insertHead(head, 30);
head = insertHead(head, 20);
head = insertHead(head, 10);
printf("Linked List: ");
printList(head);
freeList(head);
return 0;
}Abrir en el compiladorSalida esperada
Linked List: 10 -> 20 -> 30 -> NULL
Preguntas frecuentes
¿Por qué el código y la salida siguen en inglés?
Las palabras clave, los identificadores y los textos que verifican las pruebas se conservan para no cambiar el programa. Las explicaciones y los controles están traducidos.