ZBLOG

/*TODO: 功能描述:当停车场内某辆车要离开时,在它之前进入的车辆必须先退出车场为它让路,待该辆车开出大门后,其它让路的车辆再按先出后入的次序重新进入车场,然后便道上的车辆才能进入车场。 每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。 参数说明:*wait-LinkQueue过道的车辆链队列 *park-停车场的车辆链队列 *giveway链栈-车辆离开的时候,用于保存在该车之前的车辆信息 num-int型车辆号 t-int型时间 如果查询到停车场中车辆号,...

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);
}

}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=710

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?