⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 algo3-12.c

📁 《数据结构算法实现及解析》—配合严蔚敏_吴伟民编著的数据结构(C语言版)(作者 高一凡)源代码
💻 C
字号:
 /* algo3-12.c 银行业务模拟。实现算法3.6、3.7的程序 */
 #define Qu 4 /* 客户队列数 */
 #define Khjg 5 /* 两相邻到达的客户的时间间隔最大值 */
 #define Blsj 30 /* 每个客户办理业务的时间最大值 */
 #include"func3-3.c" /* 包含algo3-12.c和algo3-13.c共同用到的函数和变量等 */

 LinkQueue q[Qu]; /* Qu个客户队列 */
 QElemType customer; /* 客户记录, 临时变量 */
 /*FILE *fq; /* 文件型指针,用于指向a.txt文件 */

 void OpenForDay()
 { /* 初始化事件链表ev且插入第1个到达事件,初始化Qu个队列 */
   int i;
   InitList(&ev); /* 初始化事件链表ev为空 */
   en.OccurTime=0; /* 设定第1位客户到达时间为0(银行一开门,就有客户来) */
 /*fprintf(fq,"首位客户到达时刻=%3d,",en.OccurTime); */
   en.NType=Qu; /* 到达 */
   OrderInsert(&ev,en,cmp); /* 将第1个到达事件en有序插入事件表ev中,在bo2-6.c中 */
   for(i=0;i<Qu;++i) /* 初始化Qu个队列 */
     InitQueue(&q[i]);
 }

 int Minimum(LinkQueue Q[])
 { /* 返回最短队列的序号,若有并列值,返回队列序号最小的 */
   int l[Qu];
   int i,k=0;
   for(i=0;i<Qu;i++)
     l[i]=QueueLength(Q[i]);
   for(i=1;i<Qu;i++)
     if(l[i]<l[0])
     {
       l[0]=l[i];
       k=i;
     }
   return k;
 }

 void CustomerArrived()
 { /* 处理客户到达事件en(en.NType=Qu) */
   QElemType f;
   int durtime,intertime,i;
   ++CustomerNum; /* 客户数加1 */
   Random(&durtime,&intertime); /* 生成当前客户办理业务的时间和下一个客户到达的时间间隔2个随机数 */
   et.OccurTime=en.OccurTime+intertime; /* 下一客户et到达时刻=当前客户en的到达时间+时间间隔 */
   et.NType=Qu; /* 下一客户到达事件 */
   i=Minimum(q); /* 求长度最短队列的序号,等长为最小的序号(到达事件将入该队) */
 /*if(CustomerNum<=20) /* 输出前20个客户到达信息到文件a.txt中 */
 /*  fprintf(fq,"办理业务的时间=%2d,所排队列=%d\n下一客户到达时刻=%3d,",durtime,i,et.OccurTime); */
   if(et.OccurTime<CloseTime) /* 下一客户到达时银行尚未关门 */
     OrderInsert(&ev,et,cmp); /* 按升序将下一客户到达事件et插入事件表ev中,在bo2-6.c中 */
   f.ArrivalTime=en.OccurTime; /* 将当前客户到达事件en赋给队列元素f */
   f.Duration=durtime;
   EnQueue(&q[i],f); /* 将f入队到第i队列(i=0~Qu-1) */
   if(QueueLength(q[i])==1) /* 该元素为队头元素 */
   {
     et.OccurTime=en.OccurTime+durtime; /* 设定一个离开事件et */
     et.NType=i;
     OrderInsert(&ev,et,cmp); /* 将此离开事件et按升序插入事件表ev中 */
   }
 }

 void CustomerDeparture()
 { /* 处理客户离开事件en(en.NType<Qu) */
   int i;
   i=en.NType; /* 确定离开事件en发生的队列序号i */
   DeQueue(&q[i],&customer); /* 删除第i队列的排头客户 */
   TotalTime+=en.OccurTime-customer.ArrivalTime; /* 客户逗留时间=离开事件en的发生时刻-该客户的到达时间 */
   if(!QueueEmpty(q[i]))
   { /* 删除第i队列的排头客户后,第i队列仍不空 */
     GetHead_Q(q[i],&customer); /* 将第i队列新的排头客户赋给customer */
     et.OccurTime=en.OccurTime+customer.Duration; /* 设定离开事件et,新排头的离开时间=原排头的离开时间+新排头办理业务的时间 */
     et.NType=i; /* 第i个队列的离开事件 */
     OrderInsert(&ev,et,cmp); /* 将此离开事件et按升序插入事件表ev中 */
   }
 }

 void main()
 {
 /*fq=fopen("a.txt","w"); /* 打开a.txt文件,用于写入客户到达信息 */
 /*fp=fopen("b.txt","w"); /* 打开b.txt文件,用于写入有序事件表的历史记录 */
   printf("请输入银行营业时间长度(单位:分): ");
   scanf("%d",&CloseTime);
 /*srand(time(0)); /* 设置随机数种子,以使每次运行程序产生的随机数不同(time(0)是长整型数,与调用时间有关) */
   Bank_Simulation();
 /*fclose(fq); /* 关闭a.txt */
 /*fclose(fp); /* 关闭b.txt */
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -