Cola
¿Qué representa este TAD?
Una cola atiende como una fila: los datos entran por atrás y salen por el frente. El primero que llega es el primero que sale.
Prueba este ejemplo
En una Cola vacía carga 10, 20, 30 con Agregar varios. Ejecuta Desencolar: saldrá 10 y quedarán 20, 30, en ese orden.
Qué observar · tres pasos
- Identifica frente y atrás; no son dos colas distintas.
- En paso a paso, sigue el enlace del último nodo al nuevo al encolar.
- Al desencolar, comprueba que sólo avanza el frente; si retiras el último, ambos extremos quedan vacíos.
Ir a la visualización e ingresar estos datos
De la idea al resultado
- Prepara una operación y predice qué cambiará.
- Activa Paso a paso antes de ejecutar si quieres ver la traza; sin ese modo obtienes el resultado final.
- Relaciona el dibujo con la línea C resaltada: acaba de ejecutarse. Una condición puede no cambiar ningún nodo.
- Lee las pistas de Comprender y las pestañas de Resultados.
Paso anterior / Siguiente paso revisan la misma llamada. Pausar no deshace; cerrar Paso a paso muestra su final sin ejecutarla otra vez. Restablecer TAD (o Reiniciar, según el módulo) borra estructura e historial, no sólo el cursor.
Usa −, +, 100%, Encajar vista y Centrar inicio para acomodar el gráfico. El zoom y el desplazamiento se conservan durante los pasos; la memoria auxiliar es opcional.
Agregar varios valores en esta estructura
Disponible en Pila, Cola, Lista enlazada, Lista circular, ABB, AVL, Rojo-Negro y Montículo binario. En las listas agrega al final. No está disponible para Grafos, Hash, Cola de prioridad ni Sublista; Ordenamiento conserva su propia entrada de arreglo.
- Abre Agregar varios en Preparar. Escribe hasta 50 enteros separados por comas, por ejemplo
8, -3, 12. Se permiten espacios y signos; no decimales, posiciones vacías ni una coma final. Rango: −2147483648 a 2147483647. - Revisa cantidad y orden. Se valida la lista completa antes de empezar. ABB, AVL y Rojo-Negro no aceptan repetidos, ni dentro del lote ni respecto al árbol actual. Pila, Cola, listas y Montículo sí los admiten.
- Elige Cargar valores para añadirlos en orden con resultado final, o Agregar paso a paso para estudiar cada inserción.
- En paso a paso, usa los controles del lote. Reproducir traza sólo reproduce el valor actual; Pausar detiene la reproducción. Al final, pulsa Siguiente valor para aceptar la siguiente inserción, o Finalizar lote al terminar la última.
Al terminar o detener un lote, edita la lista antes de iniciar otro. La vista previa conserva el orden solicitado; el resumen describe ese lote, no sustituye el estado actual tras otra operación o Restablecer TAD.
Detener lote conserva las operaciones ya aceptadas, incluida la actual, y descarta los valores pendientes. No es «deshacer todo». Si falla una operación durante el proceso, las anteriores no se revierten. Si la respuesta es incierta, usa Recargar estado e historial y comprueba qué se guardó antes de volver a cargar valores.
Palabras básicas para leer el dibujo
- TAD
- Tipo abstracto de dato: los datos y las operaciones permitidas sobre ellos.
- Nodo
- Elemento que guarda un valor y enlaces a otros elementos.
- Puntero o enlace
- Referencia que permite llegar a otro nodo. NULL indica que no apunta a un nodo.
- Raíz, padre e hijo
- La raíz inicia el árbol; un padre se conecta con sus hijos.
- Tope, frente y atrás
- Tope (TOP) en Pila; frente (FRONT) y atrás (BACK) en Cola son referencias a sus extremos.
Primera práctica de 5 minutos · Copiar, ampliar y exportar · Resolver dudas y errores · Atajos y referencia
Profundizar: objetivo, reglas y memoria
Objetivo
Explicar FIFO y las transiciones de extremos.
Estrategia
Seguir FRONT para salir y BACK para entrar.
Invariante
Vacía implica FRONT == BACK == NULL.
Memoria dinámica
El nodo saliente se desconecta de FRONT antes de free.
Errores frecuentes
- Extraer por atrás (BACK)
- No anular atrás (BACK) al retirar el único nodo
Glosario contextual
- Nodo
- Objeto dinámico con datos y uno o más enlaces.
- Enlace
- Campo puntero que conecta objetos.
- Alias
- Dos punteros que designan el mismo objeto.
- LIFO
- El último en entrar es el primero en salir.
- FIFO
- El primero en entrar es el primero en salir.
- Prioridad
- Criterio de selección independiente del orden físico.
- Circularidad
- El último enlace vuelve al inicio.
- malloc
- Reserva memoria; puede devolver NULL.
- free
- Libera una reserva que deja de ser válida.
Alcance de esta pantalla
Usa las operaciones disponibles en el selector. Los auxiliares C pueden no tener un botón propio.
Referencia de operaciones y datos de entrada
Operaciones de la aplicación y datos
- Desencolar
desencolar - Sin datos adicionales.
- Encolar
encolar - Valor (entero)
- Limpiar
limpiar - Sin datos adicionales.
Los métodos C siguientes pueden incluir helpers, utilidades sin botón propio y llamadores equivalentes. Un bloque con varias funciones no cambia el nombre de la operación de la aplicación. Las vistas de memoria usan identidades simbólicas; tras free, sus registros históricos no son punteros utilizables.
Ejecutar operación crea una llamada; Anterior/Siguiente recorren la misma traza. Cerrar y reactivar Paso a paso no vuelven a ejecutar. Las consultas completadas pueden conservarse en el historial o journal aunque no muten la estructura; los rechazos no agregan llamadas exitosas. Restablecer TAD (o Reiniciar, según el módulo) borra la estructura y su historial.
Referencia avanzada por operación
Abre sólo el tema que estás estudiando. Estos detalles distinguen el contrato C, su representación visual y las funciones auxiliares de la aplicación.
Representación, enlaces y consultas
- Estructura FIFO (First In, First Out): el primer nodo en entrar queda al frente y sale primero.
- En la animación revisa las reasignaciones de frente/atrás y verifica que al quedar vacía ambos extremos vuelvan al estado nulo.
Código fuente completo del TAD
Descarga el archivo C principal de Cola y su encabezado para estudiarlo o compilarlo en tu equipo.
Referencia: estructura del TAD en C
struct NodoCola {
int nro; /**< Dato entero almacenado. */
struct NodoCola *sgte; /**< Enlace al siguiente nodo. */
};
struct Cola {
struct NodoCola *delante; /**< Primer nodo de la cola. */
struct NodoCola *atras; /**< Último nodo de la cola. */
};Código C y llamadores equivalentes
Encolar · código C
Crea nodo nuevo y lo conecta al final; si la cola estaba vacía actualiza tanto frente como final.
void cola_encolar(struct Cola *q, int valor) {
if (q == NULL) {
printf("Error: cola no inicializada.\n");
return;
}
struct NodoCola *aux = (struct NodoCola *) malloc(sizeof(struct NodoCola));
if (aux == NULL) {
printf("Error: no se pudo asignar memoria.\n");
return;
}
aux->nro = valor;
aux->sgte = NULL;
if (q->delante == NULL) {
q->delante = aux; // Primer elemento encolado
} else {
q->atras->sgte = aux;
}
q->atras = aux; // Siempre apunta al último
}Desencolar · código C
Extrae el nodo del frente, avanza el puntero de frente y ajusta final cuando se elimina el último elemento.
/**
* @brief Copia el dato del frente, retira su enlace y libera exactamente ese nodo.
* @param[in,out] q Direccion prestada de una FIFO consistente, o NULL.
* @return Dato extraido; -1 tambien es un dato valido. Ante q NULL/cola vacia,
* imprime diagnostico y devuelve -1 sin cambiar enlaces.
* @note Compruebe la cola no vacia antes de extraer; el valor -1 no distingue error.
* @note Los aliases al nodo liberado dejan de ser utilizables; q sigue valido.
*/
int cola_desencolar(struct Cola *q) {
if (q == NULL || q->delante == NULL) {
printf("Cola vacía. No se puede desencolar.\n");
return -1; // Valor de error
}
struct NodoCola *aux = q->delante;
int num = aux->nro;
q->delante = aux->sgte;
if (q->delante == NULL) {
q->atras = NULL; // Cola vacía después de desencolar
}
free(aux);
return num;
}Limpiar · código C
Recorre la estructura liberando todos los nodos y deja el puntero raíz en estado nulo para reinicio seguro.
/**
* @brief Libera la lista y pone delante y atras en NULL.
* @param[in,out] q Direccion prestada de cola propia consistente; NULL se ignora.
* @note Cada nodo debe ser vivo, propio y no compartido con otra estructura propietaria. No reserva ni imprime; aliases a nodos liberados quedan invalidos.
*/
void cola_vaciar(struct Cola *q) {
struct NodoCola *aux;
if (q == NULL) {
return;
}
while (q->delante != NULL) {
aux = q->delante;
q->delante = aux->sgte;
free(aux);
}
q->delante = NULL;
q->atras = NULL;
}Consultar frente (auxiliar sin botón propio) · código C
Consulta el valor del nodo frontal sin modificar enlaces, preservando el estado interno.
/**
* @brief Consulta el dato de delante sin modificar la cola.
* @param[in] q Copia prestada de cola consistente.
* @return Dato del primer nodo o -1 si delante es NULL; -1 tambien es dato valido.
* @note No reserva, libera ni imprime. Requiere punteros vivos cuando no son NULL.
*/
int cola_frente(struct Cola q) {
if (q.delante != NULL)
return q.delante->nro;
else
return -1;
}Consultar final (auxiliar sin botón propio) · código C
Consulta el valor del extremo de atrás sin recorrer ni modificar la cola. El retorno −1 puede representar vacío o un dato real; comprueba antes si hay elementos.
/**
* @brief Consulta el dato de atras sin modificar la cola.
* @param[in] q Copia prestada de cola consistente.
* @return Dato del ultimo nodo o -1 si atras es NULL; -1 tambien es dato valido.
* @note Consulta atras directamente, no recorre ni valida consistencia frente/final. No reserva, libera ni imprime.
*/
int cola_final(struct Cola q) {
return q.atras == NULL ? -1 : q.atras->nro;
}Mostrar · código C
Recorre la estructura para construir una salida ordenada sin alterar enlaces internos.
/**
* @brief Imprime la FIFO de delante a atras sin modificar nodos.
* @param[in] q Copia prestada de cola con lista viva y aciclica.
* @note Siempre imprime prefijo Cola: y salto de linea, incluso vacia. No reserva ni libera.
*/
void cola_mostrar(struct Cola q) {
struct NodoCola *aux = q.delante;
printf("Cola: ");
while (aux != NULL) {
printf("%d ", aux->nro);
aux = aux->sgte;
}
printf("\n");
}