ZBLOG

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

void Leave(LinkQueue *wait, LinkQueue *park, LinkStack *giveway, int num,

  1. int t) {
  2. // 从停车场中找到要离开的车辆
  3. QueueNode p = park->front;
  4. QueueNode pre = NULL; // 前驱结点指针,用于删除链表结点
  5. while (p != NULL && p->infom.number != num) {
  6. pre = p;
  7. p = p->next;
  8. }
  9. if (p == NULL) { // 没找到要离开的车辆
  10. printf("查无此车!\n");
  11. return;
  12. } else { // 找到要离开的车辆
  13. // 弹出在该车之前进入停车场的车辆,并保存到栈中
  14. QueueNode q = park->front;
  15. while (q != p) {
  16. StackNode node = (StackNode) malloc(sizeof(struct stack)); // 创建新的栈结点存储数据
  17. node->data.number = q->infom.number;
  18. node->data.time = q->infom.time;
  19. node->next = giveway->top; // 将新结点压入栈顶
  20. giveway->top = node;
  21. giveway->count++;
  22. q = q->next;
  23. }
  24. // 删除要离开的车辆结点
  25. if (pre == NULL) { // 要删除的是队首结点
  26. park->front = p->next;
  27. } else {
  28. pre->next = p->next;
  29. }
  30. free(p);
  31. // 如果等待道上有车,则将等待道上的第一辆车移动到停车场
  32. if (wait->front != NULL) {
  33. QueueNode node = (QueueNode) malloc(sizeof(struct QueueNode)); // 创建新的队列结点存储数据
  34. node->infom.number = wait->front->infom.number;
  35. node->infom.time = t; // 进入停车场的时间为当前时间
  36. node->next = NULL;
  37. if (park->front == NULL) { // 停车场为空
  38. park->front = node;
  39. park->rear = node;
  40. } else { // 停车场不为空,将新节点插入队尾
  41. park->rear->next = node;
  42. park->rear = node;
  43. }
  44. dequeue(wait, &num, &t); // 等待道上第一辆车出队
  45. }
  46. // 将在该车之前进入停车场的车辆从栈中弹出,按先出后入的顺序重新进入停车场
  47. while (giveway->top != NULL) {
  48. StackNode node = giveway->top; // 弹出栈顶结点
  49. giveway->top = node->next;
  50. QueueNode q = (QueueNode) malloc(sizeof(struct QueueNode)); // 创建新的队列结点存储数据
  51. q->infom.number = node->data.number;
  52. q->infom.time = node->data.time;
  53. q->next = NULL;
  54. if (park->front == NULL) { // 停车场为空
  55. park->front = q;
  56. park->rear = q;
  57. } else { // 停车场不为空,将新节点插入队尾
  58. park->rear->next = q;
  59. park->rear = q;
  60. }
  61. giveway->count--;
  62. free(node); // 释放出栈结点的内存空间
  63. }
  64. // 计算停车费用,并输出信息
  65. float fee = (t - p->infom.time) * COST; // 停车费用
  66. printf("序号为%d的车停车时间%d小时,应收费%3.2f元\n", num, t - p->infom.time, fee);
  67. }

}

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?