Cola

Descripcion del TAD

Estructura FIFO (First In, First Out): el primer nodo en entrar queda al frente y sale primero. En la animacion revisa las reasignaciones de frente/atras y verifica que al quedar vacia ambos extremos vuelvan al estado nulo. La Cola (FIFO) conserva el orden de llegada. Su TAD en C mantiene referencias al frente y al final, y cada operacion debe preservar consistencia cuando la estructura pasa de vacia a no vacia y viceversa.

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.

Controles de ejecucion paso a paso

Operaciones soportadas

Operaciones pendientes / restricciones

No hay operaciones pendientes para esta estructura en esta fase.

Estructura del TAD en C

struct NodoCola {
    int nro;                     
    struct NodoCola *sgte;       
};

struct Cola {
    struct NodoCola *delante;    
    struct NodoCola *atras;      
};

Metodos del TAD en C

Codigo C: encolar

Crea nodo nuevo y lo conecta al final; si la cola estaba vacia 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
}

Codigo C: desencolar

Extrae el nodo del frente, avanza el puntero de frente y ajusta final cuando se elimina el ultimo elemento.

/**
 * @brief Elimina y devuelve el primer elemento de la cola.
 * @param q Puntero a la cola.
 * @return int Valor desencolado.
 */
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;
}

Codigo C: limpiar

Recorre la estructura liberando todos los nodos y deja el puntero raiz en estado nulo para reinicio seguro.

/**
 * @brief Vacía completamente la cola liberando memoria.
 * @param q Puntero a la cola.
 */
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;
}

Codigo C: frente

Consulta el valor del nodo frontal sin modificar enlaces, preservando el estado interno.

/**
 * @brief Retorna el valor al cola_frente de la cola sin eliminarlo.
 * @param q Cola de la cual se obtiene el cola_frente.
 * @return Valor en el cola_frente de la cola, o -1 si está vacía.
 */
int cola_frente(struct Cola q) {
    if (q.delante != NULL)
        return q.delante->nro;
    else
        return -1;
}

Codigo C: final

Este metodo del TAD Cola debe interpretarse respetando condicionales, ciclos, returns y actualizacion del estado visual segun el flujo real del codigo C.

int cola_final(struct Cola q) {
    return q.atras == NULL ? -1 : q.atras->nro;
}

Ir a la visualizacion