#include #include typedef struct NodoCircular { int dato; struct NodoCircular *siguiente; } NodoCircular; NodoCircular *crearNodo(int dato) { NodoCircular *nuevo = malloc(sizeof(NodoCircular)); if (nuevo == NULL) { printf("Error al reservar memoria.\n"); exit(EXIT_FAILURE); } nuevo->dato = dato; nuevo->siguiente = NULL; return nuevo; } void insertarInicio(NodoCircular **cola, int dato) { NodoCircular *nuevo = crearNodo(dato); if (*cola == NULL) { nuevo->siguiente = nuevo; *cola = nuevo; return; } nuevo->siguiente = (*cola)->siguiente; (*cola)->siguiente = nuevo; } void insertarFinal(NodoCircular **cola, int dato) { NodoCircular *nuevo = crearNodo(dato); if (*cola == NULL) { nuevo->siguiente = nuevo; *cola = nuevo; return; } nuevo->siguiente = (*cola)->siguiente; (*cola)->siguiente = nuevo; *cola = nuevo; } void recorrer(NodoCircular *cola) { if (cola == NULL) { printf("Lista vacia.\n"); return; } NodoCircular *inicio = cola->siguiente; NodoCircular *p = inicio; do { printf("%d -> ", p->dato); p = p->siguiente; } while (p != inicio); printf("(vuelve al inicio)\n"); } NodoCircular *buscar(NodoCircular *cola, int dato) { if (cola == NULL) return NULL; NodoCircular *inicio = cola->siguiente; NodoCircular *p = inicio; do { if (p->dato == dato) return p; p = p->siguiente; } while (p != inicio); return NULL; } int eliminar(NodoCircular **cola, int dato) { if (*cola == NULL) return 0; NodoCircular *p = (*cola)->siguiente; NodoCircular *anterior = *cola; do { if (p->dato == dato) { if (p == anterior) { *cola = NULL; /* Un solo nodo */ } else { anterior->siguiente = p->siguiente; if (p == *cola) *cola = anterior; } free(p); return 1; } anterior = p; p = p->siguiente; } while (p != (*cola)->siguiente); return 0; } void liberarLista(NodoCircular **cola) { if (*cola == NULL) return; NodoCircular *inicio = (*cola)->siguiente; (*cola)->siguiente = NULL; /* Romper el ciclo */ NodoCircular *p = inicio; while (p != NULL) { NodoCircular *temporal = p; p = p->siguiente; free(temporal); } *cola = NULL; } int main(void) { NodoCircular *cola = NULL; insertarInicio(&cola, 20); insertarInicio(&cola, 10); insertarFinal(&cola, 30); insertarFinal(&cola, 40); printf("Lista circular:\n"); recorrer(cola); printf("El valor 30 %s\n", buscar(cola, 30) ? "existe" : "no existe"); eliminar(&cola, 10); recorrer(cola); liberarLista(&cola); return 0; }