#ifndef BANK_SIM_H
#define BANK_SIM_H
#include <stddef.h>
#define COUNTER 4
#define ARRIVAL COUNTER
typedef struct {
size_t OccurTime, NType;
} Event;
typedef struct Enode {
Event event;
struct Enode *next;
} Enode, *EventList;
typedef struct {
size_t ArrTime, Duration;
} QElem;
typedef struct Qnode {
QElem Cust;
struct Qnode *next;
} Qnode, *Qptr;
typedef struct {
Qptr front, rear;
} LinkQueue;
int bank_open( void );
int CustArr( void );
int CustDepart( void );
void DelFirst( void );
int DeQueue( LinkQueue * );
void DestroyAll( void );
void DestroyList( EventList );
void DestroyQueue( LinkQueue * );
int EnQueue( LinkQueue *, QElem );
EventList InitList( void );
int InitQueue( LinkQueue * );
size_t Minimun( void );
int OrderInsert( EventList, Event );
size_t QueueLength( LinkQueue );
#endif
/
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "../header/bank_sim.h"
#define CLOSETIME 480
#define MAX_TIME 30
#define INTERVAL 5
EventList ev;
Event en;
LinkQueue q[COUNTER];
QElem customer;
size_t TotalTime, CustNum;
int bank_open( void )
{
size_t i;
srand( time(NULL) );
CustNum = TotalTime = 0;
if ( !( ev = InitList() ) ) {
return 0;
}
en.OccurTime = 0;
en.NType = ARRIVAL;
if ( !OrderInsert(ev, en) ) {
DestroyList( ev );
return 0;
}
for ( i = 0; i < COUNTER; ++i ) {
if ( !InitQueue(&q[i]) ) {
DestroyList( ev );
for ( i = 0; q[i].front; ++i ) {
DestroyQueue( &q[i] );
}
return 0;
}
}
return 1;
}
int CustArr( void )
{
int durtime, intertime;
QElem e;
size_t i;
++CustNum;
durtime = rand() / (RAND_MAX / MAX_TIME + 1) + 1;
intertime = rand() / (RAND_MAX / INTERVAL);
e.ArrTime = en.OccurTime;
e.Duration = durtime;
en.OccurTime += intertime;
if ( en.OccurTime < CLOSETIME ) {
if ( !OrderInsert(ev, en) ) {
DestroyAll();
return 0;
}
}
i = Minimun();
if ( !EnQueue(&q[i], e) ) {
DestroyAll();
return 0;
}
if ( QueueLength(q[i]) == 1 ) {
en.NType = i;
en.OccurTime = e.ArrTime + durtime;
if ( !OrderInsert(ev, en) ) {
DestroyAll();
return 0;
}
}
return 1;
}
int CustDepart( void )
{
Qptr tmp;
size_t i = en.NType;
if ( !DeQueue( &q[i] ) ) {
DestroyAll();
return 0;
}
TotalTime = TotalTime + en.OccurTime - customer.ArrTime;
if ( q[i].front != q[i].rear ) {
tmp = q[i].front->next;
customer = tmp->Cust;
en.OccurTime += customer.Duration;
if ( !OrderInsert(ev, en) ) {
DestroyAll();
return 0;
}
}
return 1;
}
void DelFirst( void )
{
EventList tmp = ev->next;
ev->next = tmp->next;
en = tmp->event;
free(tmp);
}
int DeQueue(LinkQueue *Q)
{
Qptr tmp;
if ( Q->front == Q->rear ) {
return 0;
}
tmp = Q->front->next;
customer = tmp->Cust;
Q->front->next = tmp->next;
if ( Q->rear == tmp ) {
Q->rear = Q->front;
}
free(tmp);
return 1;
}
void DestroyAll( void )
{
size_t i;
DestroyList( ev );
for ( i = 0; i < COUNTER; ++i ) {
DestroyQueue( &q[i] );
}
}
void DestroyList( EventList L )
{
EventList T = L;
for ( L = L->next; L; T = L, L = L->next ) {
free( T );
}
free( T );
}
void DestroyQueue(LinkQueue *Q)
{
while ( Q->front ) {
Q->rear = Q->front->next;
free( Q->front );
Q->front = Q->rear;
}
}
int EnQueue(LinkQueue *Q, QElem e)
{
Qptr tmp = malloc( sizeof *tmp );
if ( !tmp ) {
return 0;
}
tmp->Cust = e;
tmp->next = NULL;
Q->rear->next = tmp;
Q->rear = tmp;
return 1;
}
EventList InitList( void )
{
EventList h;
if ( !( h = malloc(sizeof *h) ) ) {
return NULL;
}
h->next = NULL;
return h;
}
int InitQueue(LinkQueue *Q)
{
Q->rear = Q->front = malloc( sizeof *Q->front );
if ( !Q->front ) {
return 0;
}
Q->front->next = NULL;
return 1;
}
size_t Minimun( void )
{
size_t h = 0, i, j, k;
j = QueueLength(q[0]);
for ( i = 1; i < COUNTER; ++i ) {
k = QueueLength(q[i]);
if ( j > k ) {
j = k;
h = i;
}
}
return h;
}
int OrderInsert(EventList ev, Event a)
{
EventList tmp, h = ev, e = ev->next;
if ( !( tmp = InitList() ) ) {
return 0;
}
tmp->event = a;
while ( e && (a.OccurTime > e->event.OccurTime) ) {
h = e;
e = e->next;
}
h->next = tmp;
tmp->next = e;
return 1;
}
size_t QueueLength(LinkQueue Q)
{
size_t i;
for ( i = 0; Q.front->next; ++i ) {
Q.front = Q.front->next;
}
return i;
}
/
#include <stdio.h>
#include <stdlib.h>
#include "header/bank_sim.h"
extern EventList ev;
extern Event en;
extern size_t TotalTime, CustNum;
int main( void )
{
if ( !bank_open() ) {
return EXIT_FAILURE;
}
while ( ev->next ) {
DelFirst();
if ( en.NType == ARRIVAL ) {
if ( !CustArr() ) {
return EXIT_FAILURE;
}
} else if ( !CustDepart() ) {
return EXIT_FAILURE;
}
}
printf( "Average Stay Time:%.2f minutes/n", (float)TotalTime / CustNum );
puts( "Press ENTER to quit..." );
getchar();
DestroyAll();
return EXIT_SUCCESS;
}