Colas
Una cola es una lista de elementos,
los cuales se insertan por un extremo y se eliminan por otro. Los
elementos se eliminan en el mismo orden en el que se insertaron. Por
lo tanto, el primer elemento que entra a la cola será el primero en
salir. Debido a esta característica, las colas también reciben el
nombre de estructuras FIFO (First-In, First-Out: primero en
entrar, primero en salir). Una cola de espera es similar a una
línea de pagos en un supermercado -la primera persona en la línea es
atendida primero, y los otros clientes entran en la línea únicamente
por la parte final y esperan para ser atendidos-. Los nodos de la
cola son eliminados sólo de la parte delantera o cabeza de la cola,
y son incluidos únicamente en la parte trasera de la cola.
Existen numerosos casos de colas en la vida real: Las personas
esperando para utilizar un teléfono público (la primera persona de
la fila o cola será la primera que use el teléfono), las personas
que esperan frente a un cajero automático, la cola de automóviles en
una estación de servicio de gasolina, los niños que esperan para
subir a un juego mecánico en el parque de diversión, etc.
Las colas tienen muchas aplicaciones
en sistemas de cómputo. Muchos computadores tienen un solo
procesador, de tal forma que sólo un usuario puede ser atendido a la
vez. Las entradas de los demás usuarios son colocados en una cola.
Cada entrada avanza en forma gradual hacia el frente de la cola,
conforme los usuarios reciben servicio. La entrada que aparece en la
parte delantera de la cola es la siguiente a recibir servicio.
Las colas también se utilizan para apoyar colas
de impresión. Un entorno multiusuario con una sola impresora y
muchos usuarios generando salidas para impresión. Si la impresora
está ocupada, aún así se pueden generar otras salidas. Estas quedan
en "espera" en el disco, donde esperan en una cola hasta que
la impresora quede disponible.
En las redes de computadores, los paquetes de
información también esperan en colas. Cada vez que un paquete llega
a un nodo de red, debe ser encaminado al siguiente nodo de red,
siguiendo una trayectoria hacia el destino final del paquete. El
nodo de enrutamiento envía un paquete a la vez, por lo que los
paquetes adicionales quedan en cola, hasta que el enrutador pueda
enviarlos.
**************************************
// El siguiente es un programa que puede ser utilizado como base
para implementar
// operaciones con listas tipo PILA\COLA. El estudiante debe
adicionar y/o modificar
// algunas funciones.
// BanCola.cpp
#include "iostream.h"
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
#include "dos.h"
#include "string.h"
#define cls clrscr()
//Estructura para los nodos que van a almacenar fechas
struct Fecha {
int dia, mes, anno;
};
//____________________________
//Estructura del nodo que almacena los datos del cliente
struct Cliente {
int cedula;
char nombre[50];
Fecha *fec;
int estado;
};
//_____________________________
//Estructura del nodo que almacena los datos de cada una de las
transacciones hechas por cada cliente
struct Extracto {
int tipoTransaccion;
double transaccion;
double saldo;
Fecha *fec;
Extracto *sig;
};
//_______________________________
//Estructura principal del nodo que va a conformar la lista
principal y a almacenar los datos de la cuenta
struct Cuenta {
int numCuenta;
char tipoCuenta[30];
double saldo;
Cuenta *sig;
Cliente *otro;
Fecha *fec;
Extracto *extra;
};
//_________________________________
// Prototipos de las funciones
void mostrarSaldoClientes(Cuenta *);
void mostrarSaldoCliente(Cuenta *);
void crearCuenta(Cuenta **);
void retiros(Cuenta *);
void deposito(Cuenta *);
void activarEinactivar(Cuenta *);
void liberarMemoria(Cuenta**);
void addInicio(Cuenta **);
void addFinal (Cuenta **);
Cuenta * llenarCuenta();
Cuenta * searchNode(int,Cuenta *);
void aExtracto(Cuenta *, int,double);
void mostrarExtracto(Cuenta *);
//_________________________________
int main (){
int y;
Cuenta *pClien=NULL;
//El menu para acceder a cada una de las funciones
do{
cout<<" "<<"______________"<<endl;
cout<<" "<<"BANCO MiTOLIMA"<<endl;
cout<<" "<<"=============="<<endl<<endl;
cout<<" "<<"MENU PRINCIPAL"<<endl<<endl;
cout<<"1. Crear cuenta (COLA)"<<endl;
cout<<"2. Retiros"<<endl;
cout<<"3. Depositos"<<endl;
cout<<"4. Activar o desactivar cuentas"<<endl;
cout<<"5. Saldo de un cliente"<<endl;
cout<<"6. Saldo de todos los clientes"<<endl;
cout<<"7. Extracto del cliente"<<endl;
cout<<"8. Eliminar una cuenta"<<endl;
cout<<"9. Salir"<<endl;
cout<<"-> ";cin>>y;
switch(y){
case 1:cls; crearCuenta(&pClien);
break;
case 2:retiros(pClien);
break;
case 3:deposito(pClien);
break;
case 4:activarEinactivar(pClien);
break;
case 5:mostrarSaldoCliente(pClien);
break;
case 6:mostrarSaldoClientes(pClien);
break;
case 7:mostrarExtracto(pClien);
break;
case 8:cls;break;
}
}while(y!=9);
liberarMemoria(&pClien);
}
//____________________________________________________
//ATENCION! Esta funcion debe crear un nodo de la COLA
void crearCuenta(Cuenta **pClien){
addFinal(pClien);
cls;
}
Cuenta * llenarCuenta(){
Cuenta *temp;
temp=new Cuenta;
temp->fec=new Fecha;
temp->otro=new Cliente;
temp->otro->fec=new Fecha;
temp->extra=NULL;
cout<<"Por favor, ingrese el numero de cuenta -> ";
cin>>temp->numCuenta;
cout<<endl<<"Fecha de apertura de la cuenta >";
cout<<endl<<"Dia (dd) : ";
cin>>temp->fec->dia;
cout<<"Mes (mm) : ";
cin>>temp->fec->mes;
cout<<"Año (aaaa): ";
cin>>temp->fec->anno;
cout<<endl<<"Tipo de cuenta : ";
cin>>temp->tipoCuenta;
cout<<endl<<"Saldo inicial :$";
cin>>temp->saldo;
cout<<endl<<"Nombre del cliente : ";
gets(temp->otro->nombre);
cout<<endl<<"Cedula : ";
cin>>temp->otro->cedula;
cout<<endl<<"Fecha de nacimiento >"<<endl;
cout<<"Dia : ";
cin>>temp->otro->fec->dia;
cout<<"Mes : ";
cin>>temp->otro->fec->mes;
cout<<"Año : ";
cin>>temp->otro->fec->anno;
cout<<endl<<"Estado de la cuenta? "<<endl;
cout<<"Activo= 0, Inactivo= 1 ->";
cin>>temp->otro->estado;
return temp;
}
//____________________________________________________
//Registra retiros de una cuenta especifica
void retiros(Cuenta *pClien){
int numCuenta;
long retiro;
Cuenta *temp;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
if(temp==NULL){
cout<<"Numero de cuenta NO valido!!!"<<endl;
return;
}
else{
if(temp->otro->estado==0){
cout<<"Cantidad que desea retirar? $";
cin>>retiro;
temp->saldo=(temp->saldo)-retiro;
cout<<"Su nuevo saldo es: $"<<(temp->saldo)<<endl;
aExtracto(pClien,2,retiro);
}
else{
cout<<"Cuenta inactiva"<<endl;
}
}
getche(); cls;
}
//__________________________________________________
//Registra depositos sobre una cuenta especifica
void deposito(Cuenta *pClien){
Cuenta *temp;
int numCuenta;
long deposito;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
if(temp==NULL){
cout<<"Numero de cuenta NO valido!!!"<<endl;
return;
}
else{
if(temp->otro->estado==0){
cout<<"Cantidad que desea consignar? $";
cin>>deposito;
temp->saldo=(temp->saldo)+deposito;
cout<<"Su nuevo saldo es: $"<<(temp->saldo)<<endl;
aExtracto(pClien,1,deposito);
}
else{
cout<<"Cuenta inactiva"<<endl;
}
}getche();cls;
}
//_________________________________________________
//Activa o inactiva una cuenta
void activarEinactivar(Cuenta *pClien){
Cuenta *temp;
int numCuenta,status;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
if(temp==NULL){
cout<<"Numero de cuenta NO valido!!!"<<endl;getche();
return;
}
else{
cout<<"Si desea activarla, digite 0"<<endl;
cout<<"Si desea inactivarla, digite 1"<<endl;
cin>>status;
switch(status){
case (0):cout<<"Su cuenta ha sido activada..."<<endl;
temp->otro->estado=0;
break;
case (1):cout<<"Su cuenta ha sido inactivada..."<<endl;
temp->otro->estado=1;
break;
}
}
getche();cls;
}
//________________________________________________________________
//Muestra el saldo de todas las cuentas
void mostrarSaldoClientes(Cuenta *pClien){
int i=1;
Cuenta *temp;
temp=pClien;
while(temp!=NULL){
cout<<endl<<"Cliente "<<(i)<<":\t$"<<temp->saldo;
temp=temp->sig;
i++;
}
getche(); cls;
}
//___________________________________________________
//Muestra el saldo de una cuenta especifica
void mostrarSaldoCliente(Cuenta *pClien){
Cuenta *temp;
int numCuenta;
cls;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
if(temp!=NULL){
cout<<"Su saldo es: $"<<temp->saldo<<"\t";
}
else{
cout<<"Numero de cuenta NO valido!!!"<<endl;
}
getche();cls;
}
//________________________________________________
//Funcion que almacena los movimientos de la cuenta (Debe ligar los
movimientos con la cuenta)
void aExtracto(Cuenta *pClien, int num,double valor){
cout<<"Fecha de la Transaccion >"<<endl;
Extracto *cab, *ult;
cab= new Extracto;
cab->fec=new Fecha;
cab->sig=NULL;
cout<<"Dia (dd) : ";
cin>>cab->fec->dia;
cout<<"Mes (mm) : ";
cin>>cab->fec->mes;
cout<<"Año (aaaa): ";
cin>>cab->fec->anno;
if(num==1)
{
cab->tipoTransaccion=1;
cab->transaccion=valor;
}
else
{
cab->tipoTransaccion=2;
cab->transaccion=valor;
}
if(pClien->extra==NULL){
pClien->extra=cab;
return;
}
ult=pClien->extra;
while(ult->sig!=NULL){
ult=ult->sig;
}
ult->sig=cab;
cab->sig=NULL;
}
//________________________________________
//Funcion que debe mostrar todos los movimientos realizados en una
cuenta especifica
void mostrarExtracto(Cuenta *pClien){
int numCuenta;
Cuenta *temp;
Extracto *ult;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
ult=temp->extra;
while(ult!=NULL){
cout<<endl<<ult->fec->dia<<'\t'<<ult->fec->mes<<'\t'<<ult->fec->anno;
if (ult->tipoTransaccion==1){
cout<<'\t'<<"Consignacion ";
}else{
cout<<'\t'<<"Retiro ";
}
cout<<'\t'<<ult->transaccion;
ult=ult->sig;
}
getche();cls;
}
//_____________________________________________________
//Funciones encargadas de adicionar nodos a cada lista
void addInicio(Cuenta **pClien){
Cuenta *temp;
temp=llenarCuenta();
temp->sig=*pClien;
*pClien=temp;
}
void addFinal (Cuenta **pClien){
Cuenta *temp, *ult;
if(*pClien==NULL){
addInicio(pClien);
return;
}
temp=llenarCuenta();
ult=*pClien;
while(ult->sig!=NULL){
ult=ult->sig;
}
ult->sig=temp;
temp->sig=NULL;
}
//__________________________________________
//Funcion que encuentra un nodo especifico de una lista
Cuenta * searchNode(int numCuenta,Cuenta *pClien){
if(pClien==NULL){
cout<<"Lista vacia!!!"<<endl;
return NULL;
}
while((pClien!=NULL)&&(pClien->numCuenta!=numCuenta)){
pClien=pClien->sig;
}
return pClien;
}
//__________________________________________
//Funcion encargada de borrar todos los nodos generados con el uso
de la memoria dinamica
void liberarMemoria(Cuenta **pClien){
Cuenta *aux,*aux2;
aux=*pClien;
aux2=*pClien;
while(*pClien != NULL){
aux=*pClien;
if(aux2->sig==NULL){
delete []aux2;
*pClien=NULL;
}
else{
while(aux->sig != NULL){
aux2=aux;
aux=aux->sig;
}
aux2->sig=NULL;
delete []aux;
}
}
}
**************************************
Codificar los
siguientes programas de computación en Lenguaje C/C++ :