void Leave(LinkQueue *wait, LinkQueue *park, LinkStack *giveway, int num,
int t) {
// 从停车场中找到要离开的车辆
QueueNode p = park->front;
QueueNode pre = NULL; // 前驱结点指针,用于删除链表结点
while (p != NULL && p->infom.number != num) {
pre = p;
p = p->next;
}
if (p == NULL) { // 没找到要离开的车辆
printf("查无此车!\n");
return;
} else { // 找到要离开的车辆
// 弹出在该车之前进入停车场的车辆,并保存到栈中
QueueNode q = park->front;
while (q != p) {
StackNode node = (StackNode) malloc(sizeof(struct stack)); // 创建新的栈结点存储数据
node->data.number = q->infom.number;
node->data.time = q->infom.time;
node->next = giveway->top; // 将新结点压入栈顶
giveway->top = node;
giveway->count++;
q = q->next;
}
// 删除要离开的车辆结点
if (pre == NULL) { // 要删除的是队首结点
park->front = p->next;
} else {
pre->next = p->next;
}
free(p);
// 如果等待道上有车,则将等待道上的第一辆车移动到停车场
if (wait->front != NULL) {
QueueNode node = (QueueNode) malloc(sizeof(struct QueueNode)); // 创建新的队列结点存储数据
node->infom.number = wait->front->infom.number;
node->infom.time = t; // 进入停车场的时间为当前时间
node->next = NULL;
if (park->front == NULL) { // 停车场为空
park->front = node;
park->rear = node;
} else { // 停车场不为空,将新节点插入队尾
park->rear->next = node;
park->rear = node;
}
dequeue(wait, &num, &t); // 等待道上第一辆车出队
}
// 将在该车之前进入停车场的车辆从栈中弹出,按先出后入的顺序重新进入停车场
while (giveway->top != NULL) {
StackNode node = giveway->top; // 弹出栈顶结点
giveway->top = node->next;
QueueNode q = (QueueNode) malloc(sizeof(struct QueueNode)); // 创建新的队列结点存储数据
q->infom.number = node->data.number;
q->infom.time = node->data.time;
q->next = NULL;
if (park->front == NULL) { // 停车场为空
park->front = q;
park->rear = q;
} else { // 停车场不为空,将新节点插入队尾
park->rear->next = q;
park->rear = q;
}
giveway->count--;
free(node); // 释放出栈结点的内存空间
}
// 计算停车费用,并输出信息
float fee = (t - p->infom.time) * COST; // 停车费用
printf("序号为%d的车停车时间%d小时,应收费%3.2f元\n", num, t - p->infom.time, fee);
}
}