Curso 2023/2024
Esto son ejemplos de errores cometidos por estudiantes. Piensa qué es lo que está mal.
void ColaDePrioridad::insertar(float prioridad) { if (primero == nullptr) primero = new Nodo(prioridad, primero); else return insertar(prioridad, primero); } void ColaDePrioridad::insertar(float prioridad, Nodo * actual) { if (prioridad <= actual->siguiente->prioridad) actual->siguiente = new Nodo(prioridad, actual->siguiente); else if (actual->siguiente == nullptr) actual->siguiente = new Nodo(prioridad, nullptr); else return insertar(prioridad, actual->siguiente); }
Hay varios errores:
Sobran los dos return
.
No se trata el caso en que la cola de prioridad no estaba vacía y el nuevo dato debe pasar a ser el primero.
Cuando actual->siguiente
vale nullptr
, no se puede acceder a
actual->siguiente->prioridad
(por tanto,
el orden en que están las condiciones de las
instrucciones if
es incorrecto).
void ColaDePrioridad::insertar(float prioridad) { if (primero == nullptr || prioridad <= primero->prioridad) primero = new Nodo(prioridad, primero); else for (Nodo * actual = primero; actual != nullptr; actual = actual->siguiente) if (prioridad <= actual->siguiente->prioridad) actual->siguiente = new Nodo(prioridad, actual->siguiente); }
Hay dos errores:
Falta terminar el bucle una vez hecha la inserción, para
no seguir insertando (bastaría añadir break
o return
ahí).
No se trata el caso en que la cola de prioridad no
estaba vacía y el nuevo dato es mayor que todos. En
relación con ese caso,
cuando actual->siguiente
valga nullptr
, fallará el acceso
a actual->siguiente->dato
.