Laboratorio de memoria y punteros en C
Lista Circular
Lista donde el último nodo vuelve al primero.
1 Preparar
Los ejemplos usan las mismas operaciones públicas del TAD.
2 Predecir
Antes de ejecutar, identifica qué extremo, enlace o puntero debería cambiar y qué invariante debe conservarse.
3 Ejecutar y visualizar
Codigo C: Insertar inicio
/**
* @brief Inserta un nuevo elemento al inicio de la lista circular.
*
* @param[in,out] lista Puntero a la lista.
* @param[in] valor Dato a insertar.
*
* @return true si se insertó con éxito, false en caso de error.
*
* @post Si la lista estaba vacía, el nodo apunta a sí mismo.
* @note Complejidad temporal: O(1) ya que se mantiene el puntero a la cola.
*/
bool lcir_insertar_inicio(ListaCircular *lista, int valor) {
LCirNodo *nuevo;
if (lista == NULL) {
return false;
}
nuevo = lcir_crear_nodo(valor);
if (nuevo == NULL) {
return false;
}
if (lista->cabeza == NULL) {
nuevo->sgte = nuevo;
lista->cabeza = nuevo;
lista->cola = nuevo;
lista->cantidad = 1;
return true;
}
nuevo->sgte = lista->cabeza;
lista->cola->sgte = nuevo;
lista->cabeza = nuevo;
lista->cantidad++;
return true;
}3 Controlar la ejecución
Actual: +0.00x (1.00x real)
Paso 0 · sin función · sin fase · sin concepto
Paso: 0/0
4 Comprender
Lista enlazada circular donde el ultimo nodo apunta nuevamente al primero. La interpretacion paso a paso debe evidenciar el cierre del ciclo en cada alta/baja de nodos para evitar rupturas o ciclos invalidos.
Frame actual: prepara una operación para observar concepto, cambio e invariante.
Condición y ciclo
Sin condición en este frame.
Variables C
Sin variables.
Punteros y enlaces
Sin cambios de punteros.
Heap y memoria
Sin objetos reservados.
Pila de llamadas
Sin llamadas.
5 Comparar conceptos
Selecciona una comparación para trabajar sobre dos copias independientes de la misma secuencia.
6 Reflexionar
Consola C (printf)
Historial de ejecución
Estructura del TAD
struct lcir_nodo {
int valor;
struct lcir_nodo *sgte;
};
typedef struct lcir_nodo LCirNodo;
typedef struct {
LCirNodo *cabeza;
LCirNodo *cola;
int cantidad;
} ListaCircular;