#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
class Nodo
{Nodo *sig;
int id;
public:
Nodo()
{sig=NULL;}
Nodo(int id)
{sig=NULL;
setId(id);}
Nodo* getNodo()
{return sig;}
void setNodo(Nodo *siguiente)
{sig=siguiente;}
int getId()
{return id;}
void setId(int valor)
{id=valor;}
};
class Lista
{Nodo *inicio, *final;
int cantidad;
public:
Lista()
{inicio=NULL;
final=NULL;
cantidad=0;}
Nodo * getinicio()
{return inicio;}
Nodo * getfinal()
{return final;}
int cantidadNodos()
{return cantidad;}
bool insertar(Nodo *nodo)
{if(inicio==NULL)
{inicio=nodo;
final=nodo;}
else
{final->setNodo(nodo);
final=nodo;}
cantidad++;
return true;}
void mostrar()
{if(inicio==NULL)
{exit;}
else
{Nodo *p;
p=inicio;
int conta=1;
int miprioridad=-1;
cout<<endl;
while(p!=NULL && conta<=cantidad)
{cout<<"C"<<p->getId()<<"\t";
p=p->getNodo();
conta++;};
}
}
void mostrarNodosDirecciones()
{if(inicio==NULL)
{exit;}
else
{Nodo *p;
p=inicio;
int conta=1;
int miprioridad=-1;
cout<<endl;
while(p!=NULL && conta<=cantidad)
{cout<<"Nodo C"<<p->getId()<<" Direccion --> "<< p <<" Nodo Sig--> "<<p->getNodo()<<endl;
p=p->getNodo();
conta++;};
}
}
bool eliminarNodo(int total) //cantidad de nodos a eliminar
{if(inicio==NULL || cantidad==0)
{cout<<"Lista vacia "<<endl;
return false;}
else
{if(total>cantidad)
{cout<<endl<<"Solo puede eliminar como maximo "<< cantidad <<" nodos."<<endl;
return false;}
int conta=1;
Nodo *p;
p=inicio;
while(p!=NULL && total>0 && cantidad>0)
{inicio=inicio->getNodo();
total--;
cantidad--;
delete p;
p=inicio;};
if (cantidad==0)
inicio=NULL;
return true;
}
}
bool eliminarNodo()
{if(inicio==NULL || cantidad==0)
return false;
else
{Nodo *p;
p=inicio;
inicio=inicio->getNodo();
delete p;
cantidad --;
return true;}
}
};
class Simulacion
{Lista servidor;
Lista clientes;
int codigo;
public:
Simulacion()
{codigo=0;}
generarClientes(int cantidad)
{for(int x=1;x<=cantidad;x++)
{codigo++;
Nodo *minodo=new Nodo(codigo);
clientes.insertar(minodo);}
}
int cantidadClientes()
{return clientes.cantidadNodos();}
int atenderClientes()
{int valor;
if(clientes.cantidadNodos()==0)
return 0;
valor=random(4);
clientes.eliminarNodo(valor);
return valor;
}
mostrarClientes()
{//clientes.mostrarNodosDirecciones() ;
clientes.mostrar();}
mostrarServidor()
{}
};
int main()
{Simulacion lab;
bool activo=true;
int canti=0;
randomize();
int c=0;
int turno=-1;
c=getch();
cout<<"Presione ENTER para continuar la simulacion y ESC para salir..."<<endl;
while(c!=27)
{//determinar si llegan clientes o si atienden
turno=random(2);
if(turno==1)
{//crear clientes
int cuantos=0;
cuantos=random(5);
lab.generarClientes(cuantos);
cout<<endl<<"Se crearon "<<cuantos<<" clientes."<<endl;
lab.mostrarClientes();}
else
{//atender clientes
canti=lab.atenderClientes();
cout<<endl<<"Cantidad a atender "<<canti<<endl;
if (canti>0)
lab.mostrarClientes();
}
c=getch();
}
clrscr();
cout<<endl<<"El servidor no admite mas clientes..."<<endl;
if(lab.cantidadClientes()>0)
{cout<<"Clientes pendientes por atender... "<< lab.cantidadClientes() <<endl;
lab.mostrarClientes();
while(lab.cantidadClientes()>0) //si quedan clientes atenderlos
{canti=lab.atenderClientes();
cout<<endl<<"Cantidad a atender "<<canti<<endl;
lab.mostrarClientes();}
cout<<endl<<"Se atendieron todos clientes..."<<endl;
}
getch();
}