Home Algoritmos y Estructuras de Datos (VJ1215)

Curso 2022/2023

Ejemplos de errores en el ejercicio 5 del tema 2

Esto son ejemplos de errores cometidos por estudiantes. Piensa qué es lo que está mal.

Errores 1

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

Solución

Hay varios errores:

  1. Sobran los dos return.

  2. 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.

  3. 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).

Errores 2

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

Solución

Hay dos errores:

  1. Falta terminar el bucle una vez hecha la inserción, para no seguir insertando (bastaría añadir break o return ahí).

  2. 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.