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

  1. Identifica frente y atrás; no son dos colas distintas.
  2. En paso a paso, sigue el enlace del último nodo al nuevo al encolar.
  3. 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

  1. Prepara una operación y predice qué cambiará.
  2. Activa Paso a paso antes de ejecutar si quieres ver la traza; sin ese modo obtienes el resultado final.
  3. Relaciona el dibujo con la línea C resaltada: acaba de ejecutarse. Una condición puede no cambiar ningún nodo.
  4. 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.

  1. 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.
  2. 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.
  3. Elige Cargar valores para añadirlos en orden con resultado final, o Agregar paso a paso para estudiar cada inserción.
  4. 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

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");
}

Ir a la visualización