例题 例二 排队问题的系统模拟

算法3.6
  void CustomerArrived(eventList evL, Queue Q, Event en )
 { // 处理顾客进门事件
  Random(durtime, intertime);
  nextAT = en.occurTime + intertime;    // 下一顾客到达时刻
  if (nextAT<closeTime) {
   newAEvent = ( nextAT, 'A');      // 新的进门事件
   MakeNode(newp, newAEvent);
   LocateElem(evL, newAEvent, compare);
   Insafter(evL, newp);         // 插入事件表
  }
 
 
  evL 为事件表,表中的第1个事件为(0,'A')。 

  durtime 为当前进门的顾客理发所需时间,intertime 为下一个顾客即将进门的间隔时间。
 
    if (freeChair) {           // 顾客即刻开始理发
   dT = en.occurTime + durtime;
   newDEvent = (dT, 'D');        // 新的出门事件
   MakeNode(newp, newDEvent);
   LocateElem(evL, newDEvent, compare);
   Insafter(evL, newp);         // 插入事件表
    freeChair 的初值即为 chairNum。  
     totalTime += durtime;        // 累计逗留时间
   --freeChair;
  }
  else {               // 顾客排队等候
   newCustomer = (en.occuTime, durtime);
   EnQueue(Q, newCustomer);
  }
  ++customerNum;            // 统计顾客总人数
  totalQLength += QueueLength(Q);    // 累计排队的长度
 } // CustomerArrived

算法3.7
  void CustomerDeparture(eventList evL, Queue Q, Event en)
 { // 处理顾客出门事件
  if (!DeQueue(Q, cm)) ++FreeChair;   // 无人等候理发
  else {               // 排头顾客出列开始理发
   dT = en.occurTime + cm.duration;
   newDEvent = (dT, 'D');       // 新的出门事件
   MakeNode(newp, newDEvent);
   LocateElem(evL, newDEvent, compare);
   Insafter(evL, newp);        // 插入事件表
   totalTime += (dT - cm.arrivalTime); // 累计逗留时间
  } totalFreeChair += freeChair;    // 累计空椅数
 } // CustomerDeparture
    TotalTime、customerNum 和 totalQLength 的初值均为0。