Edición didáctica en español. El código y sus salidas conservan el original.
Lista doblemente enlazada en C
Mantén enlaces hacia delante y hacia atrás al insertar y borrar nodos.

Un nodo doblemente enlazado contiene next y prev. Estos dos enlaces permiten recorrer la lista en ambos sentidos, a costa de un puntero adicional por nodo y más actualizaciones en cada modificación.
Al insertar un nodo entre dos vecinos, conecta ambos lados y corrige los enlaces inversos. Al borrar, une los vecinos antes de liberar el nodo. Los extremos requieren especial cuidado: el primero no tiene anterior y el último no tiene siguiente.
Comprueba la coherencia recorriendo hacia delante y hacia atrás. Prueba borrar el único nodo, la cabeza y la cola; libera todas las asignaciones al terminar.
Código C
#include <stdio.h>
#include <stdlib.h>
typedef struct DNode {
int data;
struct DNode *prev;
struct DNode *next;
} DNode;
DNode* insertHead(DNode *head, int val) {
DNode *newNode = (DNode *)malloc(sizeof(DNode));
newNode->data = val;
newNode->prev = NULL;
newNode->next = head;
if (head != NULL) head->prev = newNode;
return newNode;
}
void printForward(DNode *head) {
DNode *curr = head;
while (curr != NULL) {
printf("%d <-> ", curr->data);
curr = curr->next;
}
printf("NULL\n");
}
void freeDList(DNode *head) {
DNode *curr = head;
while (curr != NULL) {
DNode *temp = curr;
curr = curr->next;
free(temp);
}
}
int main() {
DNode *head = NULL;
head = insertHead(head, 300);
head = insertHead(head, 200);
head = insertHead(head, 100);
printf("Doubly Linked List: ");
printForward(head);
freeDList(head);
return 0;
}Abrir en el compiladorSalida esperada
Doubly Linked List: 100 <-> 200 <-> 300 <-> 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.