#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <ctime>
using namespace std;
struct nodoLista{
string matricula;
int horas;
int minutos;
struct nodoLista* ptrSiguiente;
};
typedef struct nodoLista NodoLista;
typedef NodoLista *ptrNodoLista;
void horaActual( int &h, int &m );
void cajaParking( int h, int m );
void insertar( ptrNodoLista *ptrS, string valor );
bool eliminar( ptrNodoLista *ptrS, string valor );
int estaVacia( ptrNodoLista ptrS );
void imprimir( ptrNodoLista ptrActual );
void horaActual( int &hour, int &minute ){
time_t now;
struct tm *now_tm;
now = time(NULL);
now_tm = localtime(&now);
hour = now_tm->tm_hour;
minute = now_tm->tm_min;
}
void cajaParking( int h, int m ){
}
void insertar( ptrNodoLista *ptrS, string valor){
ptrNodoLista ptrNuevo;
ptrNodoLista ptrAnterior;
ptrNodoLista ptrActual;
ptrNuevo = new NodoLista;
int h, m;
horaActual( h, m );
if( ptrNuevo != NULL ){
ptrNuevo->matricula = valor;
ptrNuevo->horas = h;
ptrNuevo->minutos = m;
ptrNuevo->ptrSiguiente = NULL;
ptrAnterior = NULL;
ptrActual = *ptrS;
while( ptrActual != NULL && valor > ptrActual->matricula ){
ptrAnterior = ptrActual;
ptrActual = ptrActual->ptrSiguiente;
}
if( ptrAnterior == NULL ){
ptrNuevo->ptrSiguiente = *ptrS;
*ptrS = ptrNuevo;
}
else {
ptrAnterior->ptrSiguiente = ptrNuevo;
ptrNuevo->ptrSiguiente = ptrActual;
}
}
else {
cout << "\nNo se inserto " << valor << ". No hay memoria disponible." << endl;
}
}
bool eliminar( ptrNodoLista *ptrS, string valor ){
ptrNodoLista ptrAnterior;
ptrNodoLista ptrActual;
ptrNodoLista tempPtr;
int h, m;
if( valor == ( *ptrS )->matricula) {
tempPtr = *ptrS;
*ptrS = ( *ptrS )->ptrSiguiente;
h = tempPtr->horas;
m = tempPtr->minutos;
cajaParking( h, m );
delete( tempPtr );
return true;
}
else {
ptrAnterior = *ptrS;
ptrActual = ( *ptrS )->ptrSiguiente;
while( ptrActual != NULL && ptrActual->matricula != valor ) {
ptrAnterior = ptrActual;
ptrActual = ptrActual->ptrSiguiente;
}
if( ptrActual != NULL ){
tempPtr = ptrActual;
ptrAnterior->ptrSiguiente = ptrActual->ptrSiguiente;
h = ptrActual->horas;
m = ptrActual->minutos;
cajaParking( h, m );
delete( tempPtr );
return true;
}
}
return false;
}
int estaVacia( ptrNodoLista ptrS ){
return ptrS == NULL;
}
//! Imprime la lista
void imprimir( ptrNodoLista ptrActual ) {
if( ptrActual == NULL){
cout << "\nLa lista esta vacia.\n\n";
}
else {
cout << "\nVehiculo Entrada\n"
<< "===================\n";
while( ptrActual != NULL ){
cout << ptrActual->matricula << " -> "
<< setfill('0')
<< setw(2)
<< ptrActual->horas << ":"
<< setw(2)
<< ptrActual->minutos << "\n";
ptrActual = ptrActual->ptrSiguiente;
}
cout << "\n\n";
}
}
void instrucciones(){
cout << "Introduzca su eleccion:\n"
<< " 1.- Entrada de vehiculos.\n"
<< " 2.- Salida de vehiculos.\n"
<< " 3.- Terminar.\n";
}
int main() {
ptrNodoLista ptrInicial = NULL;
int eleccion;
string elemento;
instrucciones();
cout << "? ";
cin >> eleccion;
while( eleccion != 3 ){
switch( eleccion ){
case 1:
cout << "\nEntrada de Vehiculos: "
<< "\nMatricula: ";
cin >> elemento;
insertar( &ptrInicial, elemento );
imprimir( ptrInicial );
break;
case 2:
if( !estaVacia( ptrInicial ) ){
cout << "\nSalida de Vehiculos: "
<< "\nMatricula: ";
cin >> elemento;
if( eliminar( &ptrInicial, elemento ) ){
cout << "\nVehiculo " << elemento << " eliminado.\n";
imprimir( ptrInicial );
}
else {
cout << "\nNo se encuentra el vehiculo " << elemento << "\n";
}
}
else {
cout << "\nLa lista esta vacia.\n";
}
break;
default:
cout << "\nOpcion invalida.\n\n";
instrucciones();
break;
}
cout << "? ";
cin >> eleccion;
}
cout << "\nFin de la ejecucion." << endl;
return 0;
}