#include #include typedef struct NodoDoble { int dato; struct NodoDoble *anterior; struct NodoDoble *siguiente; } NodoDoble; NodoDoble *crearNodo(int dato) { NodoDoble *nuevo = malloc(sizeof(NodoDoble)); if (nuevo == NULL) { printf("Error al reservar memoria.\n"); exit(EXIT_FAILURE); } nuevo->dato = dato; nuevo->anterior = NULL; nuevo->siguiente = NULL; return nuevo; } void insertarInicio(NodoDoble **cabeza, NodoDoble **cola, int dato) { NodoDoble *nuevo = crearNodo(dato); if (*cabeza == NULL) { *cabeza = *cola = nuevo; return; } nuevo->siguiente = *cabeza; (*cabeza)->anterior = nuevo; *cabeza = nuevo; } void insertarFinal(NodoDoble **cabeza, NodoDoble **cola, int dato) { NodoDoble *nuevo = crearNodo(dato); if (*cola == NULL) { *cabeza = *cola = nuevo; return; } nuevo->anterior = *cola; (*cola)->siguiente = nuevo; *cola = nuevo; } void recorrerAdelante(NodoDoble *cabeza) { for (NodoDoble *p = cabeza; p != NULL; p = p->siguiente) printf("%d <-> ", p->dato); printf("NULL\n"); } void recorrerAtras(NodoDoble *cola) { for (NodoDoble *p = cola; p != NULL; p = p->anterior) printf("%d <-> ", p->dato); printf("NULL\n"); } NodoDoble *buscar(NodoDoble *cabeza, int dato) { NodoDoble *p = cabeza; while (p != NULL) { if (p->dato == dato) return p; p = p->siguiente; } return NULL; } int eliminar(NodoDoble **cabeza, NodoDoble **cola, int dato) { NodoDoble *p = buscar(*cabeza, dato); if (p == NULL) return 0; if (p->anterior != NULL) p->anterior->siguiente = p->siguiente; else *cabeza = p->siguiente; if (p->siguiente != NULL) p->siguiente->anterior = p->anterior; else *cola = p->anterior; free(p); return 1; } void liberarLista(NodoDoble **cabeza, NodoDoble **cola) { NodoDoble *p = *cabeza; while (p != NULL) { NodoDoble *temporal = p; p = p->siguiente; free(temporal); } *cabeza = NULL; *cola = NULL; } int main(void) { NodoDoble *cabeza = NULL, *cola = NULL; insertarInicio(&cabeza, &cola, 20); insertarInicio(&cabeza, &cola, 10); insertarFinal(&cabeza, &cola, 30); insertarFinal(&cabeza, &cola, 40); printf("Adelante:\n"); recorrerAdelante(cabeza); printf("Atras:\n"); recorrerAtras(cola); eliminar(&cabeza, &cola, 30); printf("Despues de eliminar 30:\n"); recorrerAdelante(cabeza); liberarLista(&cabeza, &cola); return 0; }