数据结构C语言实现之银行业务模拟一、问题描述: 假设某银行有4个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队。对于刚进和银行的客户,如果某个窗口的业务员正空闲,则可上前输业务;反之,若个窗口均有客户所占,他便会排在为数最少的队伍后面。编制一个程序模拟银行的这种业务活动并计算一天中客户在银行的平均逗留时间。二、算法描述://银行业务模拟,统计一天内客户在银行逗留的平均时间voidBank_Simulation(intCloseTime){OpenForDay();//初始化while(MoreEvent)//{EventDrived(OccurTime,EventType);//事件驱动switch(EventType){case'A'://处理客户到达事件CustomerArrived();break;case'D':CustomerDeparture();break;//处理客户离开时间default:Invalid();}CloseForDay();//计算平均逗留时间}}三、程序实现:typedefstruct{intOccurTime;//事件发生时刻intNType;//事件发生类型,0表示到达,1~4表示4个窗口的离开}Event,ElemType;//事件类型,为有序表LinkList的数据元素类型typedefLinkListEventList;typedefstruct{intArrivalTime;//到达时刻intDuration;//办理事务所需时间}QElemType;//队列的数据类型//程序中用到的主要变量EventListev;//事件表Eventen;//事件LinkQueueq[5];//4个客户队列,q[0]未用QElemTypecustomer;//客户记录intTotalTime,CustomerNum;//累计客户逗留时间,客户数intCloseTime;intcmp(Eventa,Eventb){//依事件a的发生时刻或=或事件b的发生时刻分别返回-1或0或1if(a.OccurTimeb.OccurTime)return-1;if(a.OccurTimeb.OccurTime)return+1;return0;}voidRandom(int&durtime,int&intertime){//生成随机数durtime=random(2,10);intertime=random(10);}intMinimum(LinkQueueq[]){//求长度最短队列intminlen=QueueLength(q[1]);inti=1;for(intj=2;j=4;j++)if(QueueLength(q[j])minlen){minlen=QueueLength(q[j]);i=j;}returni;}voidOpenForDay(){//初始化操作TotalTime=0;CustomerNum=0;//初始化累计时间和客户数为0InitList(ev);//初始化事件链表为空表en.OccurTime=0;en.NType=0;//设定第一个客户到达事件OrderInsert(ev,en,cmp);//按事件发生时刻的次序插入事件表for(inti=1;i=4;++i)InitQueue(q[i]);//置空队列}//OpenForDayvoidCustomerArrived(){//处理客户到达事件,en.NType=0intdurtime,intertime,i,t;++CustomerNum;printf(Customer%darrivedat%dand,CustomerNum,en.OccurTime);Random(durtime,intertime);//生成随机数t=en.OccurTime+intertime;//下一客户到达时刻if(tCloseTime)//银行尚未关门,插入事件表OrderInsert(ev,MakeElem(t,0),cmp);i=Minimum(q);//求长度最短队列printf(entertheQueue%d\n,i);EnQueue(q[i],MakeQElem(en.OccurTime,durtime));if(QueueLength(q[i])==1)//设定第i队列的一个离开事件并插入事件表OrderInsert(ev,MakeElem(en.OccurTime+durtime,i),cmp);}//CustomerArrivedvoidCustomerDeparture(){//处理客户离开事件,en.NType0printf(Customerdepartureat%d\n,en.OccurTime);inti=en.NType;DeQueue(q[i],customer);//删除第i队列的排头客户TotalTime+=en.OccurTime-customer.ArrivalTime;//累计客户逗留时间if(!QueueEmpty(q[i])){//设定第i队列的一个离开事件并插入事件表GetHead(q[i],customer);OrderInsert(ev,MakeElem(en.OccurTime+customer.Duration,i),cmp);}}//CustomerDeparturevoidBank_Simulation(intclosetime){inti=0;BLinkp;CloseTime=closetime;printf(Bank_Simulation(%d)-----银行业务模拟\n,closetime);OpenForDay();//初始化while(!ListEmpty(ev)){printList(ev);if(DelFirst(GetHead(ev),p)){en=GetCurElem(p);if(en.NType==0)CustomerArrived();//处理客户到达事件elseCustomerDeparture();//处理客户离开事件}if(++i%9==0){printf(\n-----按任意键,继续-----);getch();printf(\n\n);}}//计算并输出平均逗留时间printf(\nTheAverageTimeis%f\n,(float)TotalTime/CustomerNum);}