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
- Extraer por BACK
- No anular 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.
Controles de ejecucion paso a paso
- Checkbox Interpretar codigo paso a paso: activado muestra toda la traza; desactivado aplica solo el resultado final.
- Botones de ejecucion: Reproducir y Reiniciar.
- Navegacion por traza: Anterior paso y Siguiente paso.
- Velocidad de simulacion: slider de -2x a +2x (0.00x = 1.00x real).
- En modo rapido (checkbox desactivado), el resultado visual final debe coincidir con el ultimo estado de la traza interpretada.
- Al llegar al ultimo paso, Siguiente paso se bloquea hasta cambiar entradas/operacion; Anterior paso se habilita solo cuando ya avanzaste.
Operaciones soportadas
- cola_encolar
- cola_desencolar
- cola_vaciar
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;
}