Cpp/Exámenes Resueltos (Segundo Semestre)/Junio2017ABC/ListaCitas.cpp
2019-06-20 13:06:16 +02:00

92 lines
2.4 KiB
C++

#include "ListaCitas.h"
using namespace std;
//Funciones auxiliares:
void ampliar(tListaCitas& listaCitas, int); //Amplia la lista de citas en caso de que se haya llegado al límite de su capacidad.
bool buscar(tListaCitas& listaCitas, const tCita& cita, int& ini, int& fin, int& pos); //Búsqueda binaria y recursiva.
void nuevaLista(tListaCitas& listaCitas) {
listaCitas.capacidad = 5;
listaCitas.cont = 0;
listaCitas.lista = new tCita[listaCitas.capacidad];
}
bool inserta(tListaCitas& listaCitas, const tCita& cita) {
bool insertado = false;
int ini = 0, fin = listaCitas.cont - 1, pos = 0;
if (listaCitas.cont == listaCitas.capacidad) {
ampliar(listaCitas, listaCitas.capacidad*2);
}
else {
if (!buscar(listaCitas, cita, ini, fin, pos)) {
for (int i = listaCitas.cont; i > pos; i--){
listaCitas.lista[i] = listaCitas.lista[i - 1];
}
listaCitas.lista[pos] = cita;
listaCitas.cont++;
insertado = true;
}
else {
listaCitas.lista[pos] = cita;
}
}
return insertado;
}
//
bool buscar(tListaCitas& listaCitas, const tCita& cita, int& ini, int& fin, int& pos){
bool encontrado = false;
if (ini <= fin) {
pos = (ini + fin) / 2;
if (cita.valoracion < listaCitas.lista[pos].valoracion) {
fin = pos - 1;
encontrado = buscar(listaCitas, cita, ini, fin, pos);
}
else if(listaCitas.lista[pos].valoracion < cita.valoracion){
ini = pos + 1;
encontrado = buscar(listaCitas, cita, ini, fin, pos);
}
else {
encontrado = true;
}
}
return encontrado;
}
//
void muestra(const tListaCitas& listaCitas) {
cout << "Lista de citas: " << endl;
for (int i = listaCitas.cont - 1; i >= 0; i--){
cout << setfill(char('-')) << setw(40) << "\n" << setfill(char(0));
mostrar(*listaCitas.lista[i].puntero1);
mostrar(*listaCitas.lista[i].puntero2);
cout << "Cita en: " << setw(10) << listaCitas.lista[i].lugar << setw(20) << "Valoración: " << listaCitas.lista[i].valoracion << endl;
cout << setfill(char('-')) << setw(40) << "\n" << setfill(char(0));
}
}
//
void ampliar(tListaCitas& listaCitas, int ampliacion) {
listaCitas.capacidad = ampliacion;
tCita* aux;
aux = new tCita[listaCitas.capacidad];
for (int i = 0; i < listaCitas.cont; i++){
aux[i] = listaCitas.lista[i];
}
delete[] listaCitas.lista;
listaCitas.lista = aux;
}
//
void libera(tListaCitas& listaCitas) {
delete[] listaCitas.lista;
}