Denme su opinion de simulacion de cola de cajas en c

#1
Hola
Estoy haciendo esta simulacion de colas de caja de supermercado.
Pero no se si esta bien la forma que la estoy implimentando, denme su opinion ya que no quiero que truene mi simulacion.
Ahorita es de una sola cola , pero tengo que hacer tres cajas para una cola.
Código:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <graphics.h>
#include <dos.h>
#include <stdlib.h>
#include <string.h>
struct cola
{
   int t_espera,n;
   struct cola *sig;
};
typedef struct cola COLA;
typedef COLA *PTRCOLA;
PTRCOLA cabeza = NULL, cola = NULL;
int color=0, cola_max=0, tiempo_max=0;
 
void encolar(PTRCOLA *cabeza, PTRCOLA *cola)
{
   PTRCOLA nuevo;
   randomize();
   nuevo = (PTRCOLA) malloc (sizeof(COLA));
   if (nuevo != NULL)
   {
      nuevo->n = color;
      if(color<15)
  color=color+1;
      else color=0;
      nuevo->t_espera = 0;
      nuevo->sig = NULL;
      if (*cabeza == NULL)
  *cabeza = nuevo;
      else
  (*cola)->sig = nuevo;
      *cola = nuevo;
   }
}
int decolar(PTRCOLA *cabeza, PTRCOLA *cola)
{
   PTRCOLA temp;
   int cliente = 0;
   if ( (*cabeza)->t_espera > tiempo_max) tiempo_max = (*cabeza)->t_espera;
   if(*cabeza != NULL)
   {
      temp = *cabeza;
      cliente = (*cabeza)->n;
      *cabeza = (*cabeza)->sig;
      if (*cabeza == NULL)
  *cola = NULL;
      free(temp);
   }
   return cliente;
}

void leer_lista(PTRCOLA cabeza)
{
   PTRCOLA puntero;
   int i = 0, i2 = 0, j = 0;
   setcolor(GREEN);
   line(3, 288, 37, 288);
   line(3, 342, 37, 342);
   line(3, 240, 3, 342);
   line(37, 288, 37, 275);
   line(37, 275, 110, 275);
   line(110, 275, 110, 240);
   line(110, 240, 3, 240);
   setfillstyle (SOLID_FILL, LIGHTGREEN);
   floodfill (50,245,GREEN);

   setcolor(LIGHTGREEN);
   line(2, 287, 37, 287);
   line(2, 341, 37, 341);
   line(2, 239, 2, 341);
   line(2, 239, 110, 239);
   line(111, 239, 111, 275);
   setlinestyle(DOTTED_LINE,1,1);
   line(37, 287, 37, 341);
   setlinestyle(SOLID_LINE,1,1);
   puntero = cabeza;
   while  (puntero != NULL)
   {
      setcolor(WHITE);
      circle(15+i*40-i2*80, 300+j*80,10);
      line(15+i*40-i2*80, 310+j*80, 15+i*40-i2*80, 325 +j*80);
      line(15+i*40-i2*80, 325 +j*80, 8+i*40-i2*80, 330 +j*80);
      line(15+i*40-i2*80, 325 +j*80, 22+i*40-i2*80, 330 +j*80);
      line(10+i*40-i2*80, 335 +j*80, 8+i*40-i2*80, 330 +j*80);
      line( 20+i*40-i2*80, 335 +j*80, 22+i*40-i2*80, 330 +j*80);
      ellipse(8+i*40-i2*80, 337 +j*80, 0, 360, 5, 3);
      ellipse(22+i*40-i2*80, 337 +j*80, 0, 360, 5, 3);
      line(15+i*40-i2*80, 315+j*80, 5+i*40-i2*80, 320 +j*80);
      line(15+i*40-i2*80, 315+j*80, 25+i*40-i2*80, 320 +j*80);
      circle(4+i*40-i2*80, 321 +j*80, 4);
      circle(26+i*40-i2*80, 321 +j*80, 4);
      setfillstyle (SOLID_FILL, puntero->n);
      floodfill (15+i*40-i2*80,300+j*80,WHITE);
      floodfill (8+i*40-i2*80, 337 +j*80,WHITE);
      floodfill (22+i*40-i2*80, 337 +j*80,WHITE);
      floodfill (4+i*40-i2*80, 321 +j*80,WHITE);
      floodfill (26+i*40-i2*80, 321 +j*80,WHITE);
      setcolor(puntero->n + 8);
      line(15+i*40-i2*80, 297+j*80, 15+i*40-i2*80, 302+j*80);
      line(12+i*40-i2*80, 306+j*80, 18+i*40-i2*80, 303+j*80);
      putpixel(12+i*40-i2*80, 297+j*80, puntero->n + 8);
      circle(18+i*40-i2*80, 297+j*80,2);
      putpixel(18+i*40-i2*80, 297+j*80, puntero->n + 8);

      j = i / 16;
      if( pow(-1,i/16) == -1)
  i2+=1;
      else i2 = 0;
      puntero = puntero->sig;
      i+=1;
   }
   if(i>cola_max) cola_max=i;
   setcolor(BLACK);
   if(i == 0 ) outtextxy(10,255,"Cajero libre");
}
void reloj (int tiempo)
{
   int hora, minuto;
   char h[3], m[3];
   setcolor(WHITE);
   line(500,0,639,0);
   line(500,0,500,50);
   setcolor(DARKGRAY);
   line(500,50,639,50);
   line(639,0,639,50);
   setcolor(LIGHTGRAY);
   line(501,1,638,1);
   line(501,1,501,49);
   line(501,49,638,49);
   line(638,1,638,49);
   setfillstyle (SOLID_FILL,LIGHTGRAY );
   floodfill (550,25,LIGHTGRAY);
   setcolor(WHITE);
   line(525,25,614,25);
   line(614,25,614,5);
   setcolor(DARKGRAY);
   line(525,5,614,5);
   line(525,25,525,5);
   setcolor(BLACK);
   line(526,24,613,24);
   line(613,24,613,6);
   line(526,6,613,6);
   line(526,24,526,6);
   setfillstyle (SOLID_FILL, BLACK);
   floodfill (550,20,BLACK);
   hora = tiempo / 60 + 8;
   minuto = tiempo - (hora - 8) * 60;
   h[0] = hora/10 + '0';
   h[1] = hora - 10*(hora/10) + '0';
   m[0] = minuto/10 + '0';
   m[1] = minuto - 10*(minuto/10) + '0';
   h[2] = m[2] = NULL;
   setcolor(LIGHTGREEN);
   settextstyle(0, 0, 1);
   outtextxy(545,10,h);
   outtextxy(565,10," : ");
   outtextxy(585,10,m);
   setcolor(DARKGRAY);
   settextstyle(2, 0, 4);
   outtextxy(505,30,"A las 20:00 se termina");
   settextstyle(0, 0, 1);
   setcolor(LIGHTGRAY);
   outtextxy(130,440,"Oprima cualquier tecla para abortar la animaci¢n");
   setcolor(WHITE);
   outtextxy(128,438,"Oprima cualquier tecla para abortar la animaci¢n");
}

void main (void)
{
   int tiempo = 0, rango_max = 0, intervalo_ll=-1, intervalo_at=-1;
   int rango_llegada, rango_atencion=-1, cliente1=1, Delay;
   char OK, SN;
   int controlador, modo;
   randomize();
   controlador = VGA;
   modo = VGAHI;
   initgraph (&controlador,&modo,"");
   encolar (&cabeza, &cola);
   rango_llegada = random(4)+1;
   outtextxy(20,100,"Ingrese el tiempo en milisegundos que durar¡a un minuto: ");
   gotoxy(63,7);
   scanf("%d",&Delay);
   do
   {
      outtextxy(20,160,"Desea que el rango m ximo de llegada sea 3 y no 4 (S/N): ");
      gotoxy(63,11);
      SN = getch();
      printf("%c %c",8,8);
      switch(SN)
      {
      case 's': rango_max = 1;
  OK = 1;
  break;
      case 'S': rango_max = 1;
  OK = 1;
  break;
      case 'n': OK = 1;
  break;
      case 'N': OK = 1;
  break;
      default: OK = 0;
        break;
      }
   }
   while (OK==0);
 
   leer_lista(cabeza);
   for (tiempo=0; tiempo<=720 && !kbhit(); tiempo++)
   {
      reloj (tiempo);
      intervalo_ll=intervalo_ll+1;
      intervalo_at=intervalo_at+1;
      delay (Delay);
      if(intervalo_ll == rango_llegada)//lleg¢ nuevo cliente
      {
  encolar(&cabeza,&cola);
  cola->t_espera = tiempo;
  intervalo_ll = 0;
  rango_llegada = random (4 - rango_max) + 1;
  if (cliente1 == 1)
  {
     rango_atencion = random(4) + 1;
     intervalo_at = 0;
     cliente1 = 0;
  }
      }
      if(intervalo_at == rango_atencion )//atendi¢ cliente
      {
  cabeza->t_espera = tiempo - cabeza->t_espera;
  decolar(&cabeza,&cola);
  intervalo_at = 0;
  rango_atencion = random (4) + 1;
      }

      cleardevice();
      outtextxy(20, 100, "Tama¤o de la cola m s larga: ");
      gotoxy(33,7);
      printf("%d",cola_max);
      outtextxy(20, 132, "Tiempo de espera m s largo: ");
      gotoxy(33,9);
      printf("%d",tiempo_max);
      leer_lista(cabeza);
   }
   do
   {
      setcolor(LIGHTBLUE);
      outtextxy(20, 100, "Tama¤o de la cola m s larga: ");
      gotoxy(33,7);
      printf("%d",cola_max);
      outtextxy(20, 132, "Tiempo de espera m s largo: ");
      gotoxy(33,9);
      printf("%d",tiempo_max);
      if (tiempo < 720)
      {
  outtextxy(20, 164, "La animaci¢n fue abortada el el minuto ");
  gotoxy(43,11);
  printf("%d",tiempo);
      }
      setcolor(LIGHTRED);
      outtextxy(20, 190, "Presione ESC para salir");

      OK=getch();
   }
   while(OK!=27);
   restorecrtmode();
}
 
Arriba