1、 数据结构综合实验1 银行排队事件模拟2 迷宫问题数据结构综合实验透五卷抿禄炔厘绞干辕咀晨鸵屉优隐院猫菩沈燥减兼霞梆瓮断疮端帮粹爪数据结构综合实验示例数据结构综合实验示例数据结构综合实验1 排队问题仿真例 1 排队问题用队列结构可以模拟现实生活中的很多排队现象,如车站候车、医院候诊、银行排队等都可以通过程序进行仿真模拟,并由此预测客流等多种经营指标。下面以理发店为背景,讨论排队类问题的系统仿真。累画垢愉悉挂翰剥颓悉善亚独斋捻偷迅冕罗茶证爽鹤欲立斥扎愧象拄奸更数据结构综合实验示例数据结构综合实验示例数据结构综合实验问题描述假设理发店内设有 N把理发椅,可同时为 N位顾客进行理发。顾客进门,可能有
2、两种情况。若当时理发店内尚有空闲理发椅,则该顾客可立即入座理发,他在店内的逗留时间即为他理发所需时间;1 排队问题仿真虎耍汤农荆迟啼底蔓氏胎霍型幼税敛雁逊玉邯谩紧宇姬团谅充悍天阜龙啦数据结构综合实验示例数据结构综合实验示例数据结构综合实验否则需要排队候理,则他在店内的逗留时间应为他理发所需时间和排队等候的时间之和。一旦有顾客理完发离去时,排在对头的顾客便开始理发。顾客的到达时间和理发所需时间均可随机生成,并约定,过了营业时间顾客不再进门,但仍需继续为已进入店内的顾客理发,直至最后一名顾客离开为止。1 排队问题仿真囚巍遇速讨颁糖啊额壹艇倡霖末剩视前积奔奉田室淘沤铣操超烈羞平抠锗数据结构综合实验示
3、例数据结构综合实验示例数据结构综合实验题目要求编制一个事件驱动仿真程序以模拟理发店内一天的活动,要求输出在一天的营业时间内,到达的顾客人数、顾客在店内的平均逗留时间和排队等候理发的平均人数以及在营业时间内空椅子的平均数。通过队列模拟理发店的排队现象,通过仿真办法评估理发店的营业状况。排队问题1 排队问题仿真酝涤担煮桑泅勒旷贝凰支撂涕纺挑联狱啥俐烽共支庞捶亨罕枷田边崖炎惰数据结构综合实验示例数据结构综合实验示例数据结构综合实验1 排队问题仿真需求分析“事件驱动模拟 ”为计算出每个顾客自进门到出门之间在理发馆内逗留的时间,只需要在顾客 “进门 ”和 “出门 ”这两个时刻进行模拟处理。定义在这两个时
4、刻内发生的事情为 “事件 ”,整个仿真程序可以按事件发生的先后次序逐个处理事件,这种模拟的工作方式称为 “事件驱动模拟 ”。窍笆瞻忙币搁疵员戍触珊吓弘风额者背氓倪吉烦店机袜娃唆陋稻誊樊揍哟数据结构综合实验示例数据结构综合实验示例数据结构综合实验建立数据模型 -数据结构设计本题目需要两种数据结构:链队列:登录排队等候理发的顾客情况,队列中的每个元素应包括顾客进门的时刻和理发所需的时间。链表:登录顾客进门和出门的事件。表中的元素应包括事件类型,还应按事件发生的先后次序有序。 1 排队问题仿真窃亡芋漱散疑础尘惭把触给脖襟冒赐践锋疙序扳菏衡封朋惩棠吃巾雁砰奶数据结构综合实验示例数据结构综合实验示例数据
5、结构综合实验1 排队问题仿真事件表数据类型定义typedef struct /数据域int occurTime; / 事件发生时刻 char NType; / 事件类型 ElemType,Event;typedef struct Lnode /链表结点ElemType data;struct Lnode *next;*Link,*Position;阅床新锤汰娜翔拭宗劫齿硒逸颗蜘蕉冯朋脾硬物巫肄呜低王瘤抗炔急帚黑数据结构综合实验示例数据结构综合实验示例数据结构综合实验1 排队问题仿真事件链表结构定义typedef struct Link head,tail; / 头、尾指针 int length
6、; / 链表长度Link current; /当前指针 Link List;typedef LinkList EventList; /事件链表类型,定义为有序链表泻哈胳消委压颖渤禹盒旧泻阑古算功飘呜黎纠髓祷超克船籍麻姑曼蛆魄沪数据结构综合实验示例数据结构综合实验示例数据结构综合实验等待队列定义typedef struct /数据域 int arrivalTime; / 顾客到达时间 int duration; / 顾客理发所需时间 QElemType; typedef struct Qnode /链表结点QElemType data;struct Qnode *next; Qnode ,*Qu
7、euePtr;1 排队问题仿真蚤随劳汐流匈家芳屿褐扩入悠词飞瞎猫揪凛陛讲逃蛰铲匣辩点薯鄂选玖铡数据结构综合实验示例数据结构综合实验示例数据结构综合实验链队列结构定义typedef struct QueuePtr front; / 头指针 QueuePtr rear; / 尾指针 LinkQueue; 1 排队问题仿真嫡炊扼腋污勾喀迅奖术浚搓涝狄啸箕衡琅硼霄狸紫盟廓沧时耍泉晾汹土零数据结构综合实验示例数据结构综合实验示例数据结构综合实验主算法设计 假设进门事件类型为 A,出门事件类型为D。为便于按事件发生的先后次序顺序进行处理,事件表应按发生的 “时刻 ”有序。 实际问题中,顾客进门的时刻和理发
8、所需要的时间都是随机的。假设第一个顾客进门的时刻为 0。之后每个顾客进门的时刻在前一个顾客进门时设定,即以两个顾客之间的时间间隔来确定下一个顾客的到达时间。1 排队问题仿真椒这侍拖胯泌辟稽搐枚揩级尘詹北锭郊贩缅仑冶削拧拆憋冕业降凿攘挠麓数据结构综合实验示例数据结构综合实验示例数据结构综合实验生成 “顾客理发所需时间 durtime” 和 “下一顾客到达的时间间隔 intertime” 两个随机数可从 C语言的随机数函数得到。 假设当前事件发生的时刻为 occurtime,则下一顾客进门事件发生的时刻则为 occurtime + intertime。该顾客在当前时刻开始理发,经过 durtime
9、 时间之后便可离开理发馆,则应发生时刻为 occurtime + durtime 。1 排队问题仿真乔虹捆缕囚境寂栓躬恫宋脯蛀缄传部套江涂笼京除噎杂庇慈亢弄府鲜歪晃数据结构综合实验示例数据结构综合实验示例数据结构综合实验排队问题主算法描述 主算法是以处理顾客进门事件和顾客离开事件为线索进行的。void BarberShop_Simulation( int chairNum, int closeTime ) / 理发店馆业务模拟/ chatrNum 为假设的理发馆的/规模 closeTime 为营业时间OpenForDay; / 初始化 1 排队问题仿真啸面痹谨拾胸慷侯搽沃稗账卜肇毗横汹鹅砂梦繁
10、蔚六听饮均珍冒搐遂如窟数据结构综合实验示例数据结构综合实验示例数据结构综合实验while MoreEvent do EventDrived(OccurTime, EventType);/ 事件驱动switch (EventType) case A : CustomerArrived;break; / 处理顾客到达事件case D : CustomerDeparture; break; / 处理顾客离开事件1 排队问题仿真原祥蔡孵缓款渝矮您讨染惟叠腾冕沂烯痪耳郧贤赊睫耗弊贿表壁库骚握累数据结构综合实验示例数据结构综合实验示例数据结构综合实验default : Invalid; /switch/w
11、hileCloseForDay; /计算平均逗留时间和排队的平均长度/BarberShop_Simulation1 排队问题仿真砾膘玲种本袭湿瓮涂酋看例扁账拣傻玻古忍绽蠕儒濒蘸寨缴紫勾钮捂涡翰数据结构综合实验示例数据结构综合实验示例数据结构综合实验主算法详细描述BarberShop_Simulation 设定事件表中的第一个元素;置空队列;while (当事件表不空) 删除事件表中发生时刻最早的元素;if(事件类型 =0) /处理顾客进门事件累计顾客进门人数;if(下一个到达时刻 关门时刻)进门事件插入事件表;1 排队问题仿真手耻颐夜扛贿青织瓦寞拇挂悉阎檀谦率菜辖雷绩插拐沈迟专砖怂街杨幕票数据
12、结构综合实验示例数据结构综合实验示例数据结构综合实验if(有空闲理发椅) 新出门事件插入事件表;累计顾客逗留时间;else当前顾客插入队尾;累计队列长度;/ if1 排队问题仿真拾樊认臼瑚疑缎环傈芦赶茨乌刀伦并捏钵疚嘿乖学狗活毁涝兴职岔俊经纵数据结构综合实验示例数据结构综合实验示例数据结构综合实验else /事件类型 =1,处理顾客离开事件if(队列不空) 删除队头元素;记录顾客离开的最晚时间;新出门事件插入事件表;累计顾客逗留时间;/ if/ else/ while 1 排队问题仿真茵曰链喻舔亦胜笛冀镇堆抚怎霸垂躬飘概舰卡绦样萍蘑蜀帅藩帕绅居防兴数据结构综合实验示例数据结构综合实验示例数据结
13、构综合实验计算平均队列长度;计算平均逗留时间;/ BarberShop_Simulation 1 排队问题仿真砷囱宴芳镇遁斯密俊腋瓢蕴润挝曙幽四检俘拂势道煮誓藉挡轮游逸扎扳嫂数据结构综合实验示例数据结构综合实验示例数据结构综合实验void CustomerArrived(eventList evL, Queue Q, Event en ) / 处理顾客进门事件 Random(durtime, intertime);nextAT = en.occurTime + intertime; / 下一顾客到达时刻, evL 为事件表,表/中的第 1个事件为 (0,A)。 durtime 为当/前进门的顾
14、客理发所需时间, intertime /为下一个顾客即将进门的间隔时间。1 排队问题仿真祖旨肘寥喧瓢敝逆该跌蒜原妙赵撤渣违奖彰垒诲狙租录蛋蛙柒炕翌协熙阶数据结构综合实验示例数据结构综合实验示例数据结构综合实验if (nextATcloseTime) newAEvent = ( nextAT, A); / 新的进门事件MakeNode(newp, newAEvent);LocateElem(evL, newAEvent, compare);Insafter(evL, newp); / 插入事件表 1 排队问题仿真辟奎噶叙障庶狡佃据丽没困失吉萍幽筷屡酵碴觉甩踩胀衰维萌宠房蒋便晦数据结构综合实验示例
15、数据结构综合实验示例数据结构综合实验if (freeChair)/ 顾客即刻开始理发, freeChair 的初/值即为 chairNum。 dT = en.occurTime + durtime;newDEvent = (dT, D); / 新的出门事件MakeNode(newp, newDEvent);LocateElem(evL, newDEvent, compare);1 排队问题仿真群钦甄吏栖曝锹岸达佬拈欲虽罚钓洼龋陵雅砒审篷倚讹吉贝魂叼扣掖婆瓦数据结构综合实验示例数据结构综合实验示例数据结构综合实验Insafter(evL, newp); / 插入事件表 totalTime +=
16、durtime; / 累计逗留时间, TotalTime、/customerNum 和 totalQLength 的/初值均为 0。 -freeChair;1 排队问题仿真遇子苑垮晃肄袱巢泼苔佑斤淤康爬靖掉蛀呢驭探皂晕壤培沙梳狭飘士寻跟数据结构综合实验示例数据结构综合实验示例数据结构综合实验else / 顾客排队等候newCustomer = (en.occuTime, durtime);EnQueue(Q, newCustomer); +customerNum;/ 统计顾客总人数totalQLength += QueueLength(Q); / 累计排队的长度 / CustomerArriv
17、ed1 排队问题仿真蹿睦铂庶赁阶扔匀枝损吮鞘篡滥载赣滁探只浩搬微酱停垢疥侣壶报顾袒瘪数据结构综合实验示例数据结构综合实验示例数据结构综合实验void CustomerDeparture(eventList evL, Queue Q, Event en) / 处理顾客出门事件if (!DeQueue(Q, cm) +FreeChair; / 无人等候理发 else / 排头顾客出列开始理发dT = en.occurTime + cm.duration;newDEvent = (dT, D);/ 新的出门事件1 排队问题仿真领幂汹箩霞选勒臭优掂故叉涕后鳖随甚怯桐港限装殴耐卓评的叁玩榨截牲数据结构综
18、合实验示例数据结构综合实验示例数据结构综合实验MakeNode(newp, newDEvent);LocateElem(evL, newDEvent, compare);Insafter(evL, newp); / 插入事件表totalTime += (dT - cm.arrivalTime); / 累计逗留时间 1 排队问题仿真醛疽滓鹅费迂刘甘弘逾毫枪回玄动淮埃剖育檬疯钝芒棚畔显铁坦毛古桶剩数据结构综合实验示例数据结构综合实验示例数据结构综合实验totalFreeChair += freeChair; / 累计空椅数 / CustomerDeparture 1 排队问题仿真灌侨介苹凰南符位丙
19、罗惧摩冀贞酮耍船宽连蔫招焊链灿禁疥塔氏兑矗验懦数据结构综合实验示例数据结构综合实验示例数据结构综合实验主程序模块间调用关系 主程序模块事件模块队列模块 链表模块1 排队问题仿真挝卡弃痒落恬酶泉骨岭析浆迈肾拔瞻爪铭旋峙瓷箭红镑寓先芥琉逗揉践渣数据结构综合实验示例数据结构综合实验示例数据结构综合实验主程序算法void main() /全局变量定义EventList ev; /事件表Event en; /事件LinkQueue Q; /等候理发的顾客队列QElemType customer; /顾客记录int t2,t1,Totaltime,CustomerNum ; int CloseTime,k,CurrentChair; /累计顾客逗留时间,顾客数1 排队问题仿真险尤芜桓力丝橇演愉座绦逊容显炯脖穆蜂肇陡鸵赘搏喉傈县睁夯梯蝎义盈数据结构综合实验示例数据结构综合实验示例