由于这个程序比较复杂,涉及到很多功能的实现,需要花费一定的时间和精力才能完成。以下是对主要函数的补充说明。
- EnterQueue函数
这个函数用来模拟客户取号排队的过程。当一个新的客户进入排队时,要记录他进入队列的时间,并初始化办理业务的开始和结束时间为-1,因为还没有开始办理业务。具体实现如下:
int EnterQueue(LinkQueue *Q, int n) {
int flag = 1;
LinkQueueNode *p;
printf("欢迎使用银行叫号系统,正在取号中,请稍后。\n");
p = (LinkQueueNode *) malloc(sizeof(LinkQueueNode));
if (p != NULL) {
p->number = n; // 记录客户序号
p->t[0] = timeClock[time_index]; // 记录进入队列的时间
p->t[1] = -1; // 初始化办理业务的开始时间
p->t[2] = -1; // 初始化办理业务的结束时间
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return TRUE;
} else
return FALSE;
}
- DeleteQueue函数
这个函数用来模拟叫号的过程。根据选择的柜台号,从队列中出队一个客户。如果队列为空,则输出“无等待客户”,否则输出“请耐心等待”并返回一个客户节点信息。在出队的过程中,要记录开始服务的时间,并把柜台号记录到LinkQueueNode结构体的counter成员中。
LinkQueueNode * DeleteQueue(LinkQueue *Q, int n, int flag[SIZE]) {
LinkQueueNode *p;
if (IsEmpty(Q)) {
printf("无等待客户\n");
return NULL;
} else {
printf("请耐心等待\n");
p = Q->front->next;
Q->front->next = p->next;
if (Q->rear == p)
Q->rear = Q->front;
p->t[1] = timeClock[time_index]; // 记录开始服务的时间
p->counter = n; // 记录柜台号
flag[n - 1] = 1; // 标记柜台为正在服务状态
return p;
}
}
- ChoseCounter函数
这个函数用来根据选择的柜台号,选择相应的队列出队一个客户,并输出相关信息。如果队列为空,则输出“空闲”。
void ChoseCounter(LinkQueue *Q, LinkQueueNode * now[SIZE], int flag[SIZE], int n) {
LinkQueueNode *temp;
if (now[n - 1] != NULL && now[n - 1]->t[2] != -1) {
PrintPriorTime(now[n - 1]); // 打印上一位客户序号和服务时间
now[n - 1] = NULL;
flag[n - 1] = 0; // 标记柜台为空闲状态
}
if (n >= 1 && n <= 4) { // 柜台1-4选择p队列出队
temp = DeleteQueue(Q, n, flag);
} else if (n >= 5 && n <= 6) { // 柜台5,6选择队列为空则从p队列出队,不为空选择p1或p2队列出队
if (!IsEmpty(Q)) {
temp = DeleteQueue(Q, n, flag);
} else {
if (!IsEmpty(p1)) {
temp = DeleteQueue(p1, n, flag);
} else if (!IsEmpty(p2)) {
temp = DeleteQueue(p2, n, flag);
} else {
printf("空闲\n");
return;
}
}
}
if (temp != NULL) {
now[n - 1] = temp;
printf("柜台%d: ", n);
if (flag[n - 1] == 0)
printf("空闲\n");
else
printf("正在服务\n");
printf("当前处理的客户序号为%d\n", now[n - 1]->number);
}
}
完整程序如下: