c语言队列模拟排队编程,c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队)...

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

//c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队)

//------头文件---------

#include

#include

#include

//-------宏定义---------

#define TURE 1

#define ERROR 0

#define OVERFLOW -2

//------替换及结构体------

typedef int Bool;

typedef struct Node

{

long OccurTime;

long LeaveTime;

struct Node *next;

}Custom,*Customer;//模拟顾客属性

typedef struct

{

Customer front;//头

Customer rear;//尾

}LinkQueue;//顾客队列化

//-----全局变量-------

long TotalTime,TotalCustomer;//总时间,总客户量

long OpenTime=420,CloseTime=1020;//银行开门时间和关门时间分别是420/60=7:00 1020/60=17:00 以24小时制计算

LinkQueue q[5];//银行开4个普通窗口,一个应急窗口

//------函数列表------

Bool InitQueue();//初始化队列

Bool DeQueue(int i,Customer c);//离开队列

Bool EnQueue(int i,Customer c);//进入队列

void OpenForDay();//初始化数据

//void Bank(Customer c,long *StartTime);

void CompareTime(Custom c);

void QueueLeagth(int *i);

void Bank_Simulation();

void Rand(Customer c,long *StartTime);

//-------主函数------

void main()

{

printf("--------------------系统说明-----------------------\n");

printf("1.关于银行业务系统的模拟.\n");

printf("2.银行的营业时间为7:00-17:00.\n");

printf("3.银行有四个窗口对外接待顾客.\n");

printf("4.窗口在某一时刻只能接待一位顾客,因此在客户众多的情况下需要排队等候.\n");

printf("5.若两个窗口均被占,则客户排在最短的窗口.\n");

printf("6.银行办理业务的时间为10-30分钟不等.\n");

Bank_Simulation();

printf("平均每个人在银行的逗留时间:");

printf("%-5.2f\n",(float)TotalTime/TotalCustomer);

getchar();

getchar();

}

//-------其余函数--------

void Bank_Simulation()

{

Custom c;//定义一个顾客

long StartTime=420;

int i=1;

OpenForDay();

Rand(&c,&StartTime);

printf("等待时间\t业务办理时间\t窗口号\t\t到达时间\t离开时间\n");

while(c.LeaveTime<1020)

{

CompareTime(c);

QueueLeagth(&i);

EnQueue(i,&c);

StartTime=c.OccurTime;

printf("%d\t\t",i);

printf("%d:%d\t\t",c.OccurTime/60,c.OccurTime%60);

printf("%d:%d\n",c.LeaveTime/60,c.LeaveTime%60);

getchar();

Rand(&c,&StartTime);

}

}

void OpenForDay()

{

//int i;

TotalTime=0;

TotalCustomer=0;

InitQueue();

}

void Rand(Customer c,long *StartTime)

{

srand((unsigned)time(NULL));

do

{

c->OccurTime=rand()%1020;

}while(c->OccurTime

}

Bool InitQueue()

{

int i=1;

for(;i<=4;i++)

{

q[i].rear=q[i].front=(Customer)malloc(sizeof(Custom));

if(!q[i].front)

{

exit(OVERFLOW);

}

q[i].front->next=NULL;

}

return TURE;

}

Bool DeQueue(int i,Customer c)

{

Customer t=(Customer)malloc(sizeof(Custom));

if(!t||q[i].front==q[i].rear)

{

exit(OVERFLOW);

}

t=q[i].front->next;

c->OccurTime=t->OccurTime;

c->LeaveTime=t->LeaveTime;

q[i].front->next=t->next;

if(q[i].rear==t)

{

q[i].rear=q[i].front;

}

free(t);

return TURE;

}

Bool EnQueue(int i,Customer c)

{

long DurTime,WaitTime=0;

Customer t=(Customer)malloc(sizeof(Custom));

if(!t)

{

exit(OVERFLOW);

}

if(q[i].front==q[i].rear)

{

WaitTime=0;

}

else

{

WaitTime=q[i].rear->LeaveTime-q[i].rear->OccurTime;

}

srand((unsigned)time(NULL));

do

{

DurTime=rand()%31;

}while(DurTime<10);

c->LeaveTime=c->OccurTime+WaitTime+DurTime;

printf("%ld\t\t%ld\t\t",WaitTime,DurTime);

t->OccurTime=c->OccurTime;

t->LeaveTime=c->LeaveTime;

TotalTime+=c->LeaveTime-c->OccurTime;

t->next=NULL;

q[i].rear->next=t;

q[i].rear=t;

TotalCustomer++;

return TURE;

}

void CompareTime(Custom c)

{

int i;

Custom t;

Customer s;

for(i=1;i<=4;i++)

{

s=q[i].front->next;

while(s&&q[i].front!=q[i].rear)

{

if(c.OccurTime>=s->LeaveTime)

{

DeQueue(i,&t);

s=q[i].front->next;

}

else

{

s=s->next;

}

}

}

}

void QueueLeagth(int *i)

{

int min,j,k,a[4];

Customer s;

for(j=0;j<4;j++)

{

k=0;

s=q[j+1].front;

if(q[j+1].front==q[j+1].rear)

{

a[j]=0;

}

else

{

while(s!=q[j+1].rear)

{

s=s->next;

a[j]=++k;

}

}

}

min=a[0];

*i=1;

for(j=0;j<4;j++)

{

if(min>a[j])

{

min=a[j];

*i=j+1;

}

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值