/** * 算法2.21 */ Status MergeList(LinkList &La, LinkList &Lb, LinkList &Lc, int (*compare)(ElemType, ElemType)) { Link ha, hb, pa, pb, q; ElemType a, b; if (!InitList(Lc)) return ERROR; ha = GetHead(La); hb = GetHead(Lb); pa = NextPos(La, ha); pb = NextPos(Lb, hb); while (pa && pb) { a = GetCurElem(pa); b = GetCurElem(pb); if (compare(a, b) <= 0) { // a<=b DelFirst(ha, q); Append(Lc, q); pa = NextPos(La, ha); } else { // a>b DelFirst(hb, q); Append(Lc, q); pb = NextPos(Lb, hb); } } // while if (pa) Append(Lc, pa); else Append(Lc, pb); FreeNode(ha); FreeNode(hb); return OK; }
void Bank_simulation(int CloseTime){ //银行业务模拟,统计一天内客户在银行的逗留时间 //全局变量 static Event en;//事件表 static EvenList ev;//事件 static LinkQueue q[5];//4个客户列队 static QElemType customer;//客户记录 static int TotalTime,CustomerNum;//累计逗留时间,客户数 //变量结束 EvenList p,e; OpenForDay(TotalTime,CustomerNum,en,ev,q); while(!ListEmpty(ev)){ e=GetHead(ev); DelFirst(e,p); en=GetCurElem(p); if(en.NType==0) CustomerArrived(CloseTime,CustomerNum,en,ev,q); else CustomerDeparture(en,ev,q,customer,TotalTime); if(TotalTime>CloseTime)break; } printf("%0.2f\n",(float)TotalTime/CustomerNum); }
void Bank_Simulation() { Link p; OpenForDay(); // 初始化 while(!ListEmpty(ev)) { DelFirst(ev,GetHead(ev),p); en.OccurTime=GetCurElem(p).OccurTime; en.NType=GetCurElem(p).NType; if(en.NType==Qu) CustomerArrived(); // 处理客户到达事件 else CustomerDeparture(); // 处理客户离开事件 } // 计算并输出平均逗留时间 printf("顾客总数:%d, 所有顾客共耗时:%d分钟, 平均每人耗时: %d分钟\n",CustomerNum,TotalTime,TotalTime/CustomerNum); }
Status MergeLinkList(LinkList *La, LinkList *Lb, LinkList *Lc, int (*compare)(ElemType, ElemType)) /* 已知单链表La和Lb的元素按值非递减排列 * 归并La和Lb得到新的单链表Lc, Lc的元素也按值非递减排列. */ { Link pNode_La = La->head, ha = GetHead(*La), pNode_Lb = Lb->head, hb = GetHead(*Lb); int iLen_La = La->len, iLen_Lb = Lb->len; ElemType a = 0, b = 0; Link pTemp = NULL; if (!InitList(Lc)) // Initialize link list Lc. return ERROR; while (pNode_La && pNode_Lb) { a = GetCurElem(pNode_La); b = GetCurElem(pNode_Lb); if (0 >= (*compare)(a, b)) { DelFirst(&ha, &pTemp); Append(Lc, pTemp); pNode_La = NextPos(*La, ha); } else { DelFirst(&hb, &pTemp); Append(Lc, pTemp); pNode_Lb = NextPos(*Lb, hb); } } if (pNode_La) Append(Lc, pNode_La); else Append(Lc, pNode_Lb); FreeNode(&ha); FreeNode(&hb); return OK; }
void Bank_Simulation() { // 银行业务模拟函数 Link p; OpenForDay(); // 初始化事件表ev且插入第1个到达事件,初始化队列 while(!ListEmpty(ev)) // 事件表ev不空 { DelFirst(ev,ev.head,p); // 删除事件表ev的第1个结点,并由p返回其指针,在bo2-6.cpp中 // if(p->data.OccurTime<50) // 输出前50分钟内发生的事件到文件d.txt中 // fprintf(fp,"p->data.OccurTime=%3d p->data.NType=%d\n",p->data.OccurTime,p->data.NType); en.OccurTime=GetCurElem(p).OccurTime; // GetCurElem()在bo2-6.cpp中,返回p->data(ElemType类型) en.NType=GetCurElem(p).NType; if(en.NType==Qu) // 到达事件 CustomerArrived(); // 处理客户到达事件 else // 由某窗口离开的事件 CustomerDeparture(); // 处理客户离开事件 } // 计算并输出平均逗留时间 printf("窗口数=%d 两相邻到达的客户的时间间隔=0~%d分钟 每个客户办理业务的时间=1~%d分钟\n",Qu,Khjg,Blsj); printf("客户总数:%d, 所有客户共耗时:%ld分钟,平均每人耗时:%d分钟,",CustomerNum,TotalTime,TotalTime/CustomerNum); printf("最后一个客户离开的时间:%d分\n",en.OccurTime); }