项目二——停车场

来源:互联网 发布:洗菜盆 知乎 编辑:程序博客网 时间:2024/04/30 17:10
停车场管理
问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1) 建立三个数据结构分别是:停放队列、让路栈、等候队列。

(2) 输入数据模拟管理过程,数据(入或出,车号)。

#ifndef __PARK_H__#define __PARK_H__#define TRUE  1#define FALSE 0#define SIZE 11typedef struct _cardata{int id;char num[20];char name[10];int time;}CarData;typedef struct _parkqueue{CarData data[SIZE];int parkfront;int parkrear;}ParkQueue;typedef struct _waitnode{CarData data;struct _waitnode *next;}WaitNode;typedef struct _waitqueue{WaitNode *waitfront;WaitNode *waitrear;}WaitQueue;typedef struct _stacknode{CarData data;struct _stacknode *next;}StackNode;typedef struct _linkStack{StackNode *top;}LinkStack;int InitParkQueue(ParkQueue *parkq);int ParkQueueFull(ParkQueue *parkq);int ParkQueueEmpty (ParkQueue *parkq);int EnParkQueue(ParkQueue *parkq,CarData x);int DeParkQueue(ParkQueue *parkq,CarData *x);WaitQueue* Create_Queue();int WaitQueueEmpty(WaitQueue *waitq);int EnWaitQueue(WaitQueue *waitq,CarData x);int DeWaitQueue(WaitQueue *waitq,CarData *x);LinkStack *Create_Stack();int StackEmpty(LinkStack *s);int Push(LinkStack *s,CarData x);int Pop(LinkStack *s,CarData *x);int park(ParkQueue *parkq,WaitQueue *waitq,CarData x);void display(ParkQueue *parkq,WaitQueue *waitq);void face();#endif // __PARK_H__
#include "park.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>int InitParkQueue(ParkQueue *parkq){if(parkq == NULL)return FALSE;parkq->parkfront = 0;parkq->parkrear = 0;return TRUE;}int ParkQueueFull(ParkQueue *parkq){if(parkq == NULL)return FALSE;return parkq->parkfront == (parkq->parkrear + 1) % SIZE;}int ParkQueueEmpty (ParkQueue *parkq){if (parkq == NULL)return FALSE;return parkq->parkfront == parkq->parkrear;}int EnParkQueue(ParkQueue *parkq,CarData x){if(parkq == NULL)return FALSE;if(ParkQueueFull(parkq))return TRUE;parkq->parkrear = (parkq->parkrear + 1) % SIZE;parkq->data[parkq->parkrear] = x;return TRUE;}int DeParkQueue(ParkQueue *parkq,CarData *x){if (parkq == NULL)return FALSE;if (ParkQueueEmpty(parkq))return FALSE;parkq->parkfront = (parkq->parkfront + 1) % SIZE;*x = parkq->data[parkq->parkfront];return TRUE;}WaitQueue* Create_Queue(){WaitQueue * waitq = (WaitQueue*)malloc(sizeof(WaitQueue)/sizeof(char));if (waitq == NULL)return NULL;waitq->waitfront = NULL;waitq->waitrear  = NULL;return waitq;}int WaitQueueEmpty(WaitQueue *waitq){if (waitq == NULL)return FALSE;return waitq->waitfront == NULL;}int EnWaitQueue(WaitQueue *waitq,CarData x){if (waitq == NULL)return FALSE;WaitNode * waitnode = (WaitNode*)malloc(sizeof(WaitNode)/sizeof(char));if (waitnode == NULL)return FALSE;waitnode->data = x;waitnode->next = NULL;if (waitq->waitfront == NULL){waitq->waitfront = waitnode;waitq->waitrear  = waitnode;}else{waitq->waitrear->next = waitnode;waitq->waitrear = waitnode;}return TRUE;}int DeWaitQueue(WaitQueue *waitq,CarData *x){if (waitq == NULL)return FALSE;if (WaitQueueEmpty(waitq))return FALSE;WaitNode *p = waitq->waitfront;*x = p->data;waitq->waitfront = p->next;free(p);if (waitq->waitfront == NULL)waitq->waitrear = NULL;return TRUE;}LinkStack *Create_Stack(){LinkStack* s = (LinkStack*)malloc(sizeof(LinkStack)/sizeof(char));if (s == NULL)return NULL;s->top = NULL;return s;}int StackEmpty(LinkStack *s){if (s == NULL)return FALSE;return s->top == NULL;}int Push(LinkStack *s,CarData x){if (s == NULL)return FALSE;StackNode* snode = (StackNode*)malloc(sizeof(StackNode)/sizeof(char));if (snode == NULL)return FALSE;snode->data = x;snode->next = s->top;s->top = snode;return TRUE;}int Pop(LinkStack *s,CarData *x){if (s == NULL)return FALSE;if (StackEmpty(s))return FALSE;StackNode *p = s->top;*x = p->data;s->top = p->next;free(p);return TRUE;}int park(ParkQueue *parkq,WaitQueue *waitq,CarData x){if(parkq == NULL || waitq == NULL)return FALSE;if(ParkQueueFull(parkq)){EnWaitQueue(waitq,x);printf("车位已满,进入等候队列!\n");}else{EnParkQueue(parkq,x);printf("成功停车,进入停车队列!\n");}return TRUE;}void display(ParkQueue *parkq,WaitQueue *waitq){if(parkq == NULL || waitq == NULL)return;printf("停车队列-----------------------------------\n");int tmp1 = parkq->parkfront;do{tmp1 = (tmp1 + 1) % SIZE;printf("%4d%15s%15s%9d\n",parkq->data[tmp1].id,parkq->data[tmp1].num,\parkq->data[tmp1].name,time(NULL) % 86400 - parkq->data[tmp1].time);}while(tmp1 != parkq->parkrear);printf("候车队列-----------------------------------\n");WaitNode *tmp2 = waitq->waitfront;while(tmp2 != NULL){printf("%4d%15s%15s%9d\n",tmp2->data.id,tmp2->data.num,\tmp2->data.name,time(NULL) % 86400 - tmp2->data.time);tmp2 = tmp2->next;}}int away(ParkQueue *parkq,WaitQueue *waitq,LinkStack* s,int id){CarData x;int tmp1 = (parkq->parkfront) % SIZE;do{tmp1 = (tmp1 + 1) % SIZE;if(parkq->data[tmp1].id != id){DeParkQueue(parkq,&x);Push(s,x);}else{DeParkQueue(parkq,&x);while(StackEmpty(s) != TRUE){Pop(s,&x);EnParkQueue(parkq,x);}if(WaitQueueEmpty(waitq) != TRUE){DeWaitQueue(waitq,&x);EnParkQueue(parkq,x);}return TRUE;}}while(tmp1 != parkq->parkrear);printf("未找到该ID!\n");return FALSE;}void face(){system("clear");printf("**************************************************\n");printf("|                                                |\n");printf("|        1、停车                2、显示          |\n");printf("|                                                |\n");printf("**************************************************\n");printf("|                                                |\n");printf("|        2、显示                3、离开          |\n");printf("|                                                |\n");printf("**************************************************\n");printf("|                                                |\n");printf("|                   4、退出                      |\n");printf("|                            madeby:XuYuanMing  |\n");printf("**************************************************\n\n");printf("请输入您要执行的操作(1-4):");}
#include "park.h"#include <stdio.h>#include <string.h>#include <time.h>int count = 7; int main(){ParkQueue parkq;InitParkQueue(&parkq);WaitQueue* waitq = Create_Queue();LinkStack* s = Create_Stack();CarData data1 = {1,"qw123213","zhangsan1",time(NULL) % 86400};CarData data2 = {2,"qw123213","zhangsan2",time(NULL) % 86400};CarData data3 = {3,"qw123213","zhangsan3",time(NULL) % 86400};CarData data4 = {4,"qw123213","zhangsan4",time(NULL) % 86400};CarData data5 = {5,"qw123213","zhangsan5",time(NULL) % 86400};CarData data6 = {6,"qw123213","zhangsan6",time(NULL) % 86400};CarData data7 = {7,"qw123213","zhangsan7",time(NULL) % 86400};EnParkQueue(&parkq,data1);EnParkQueue(&parkq,data2);EnParkQueue(&parkq,data3);EnParkQueue(&parkq,data4);EnParkQueue(&parkq,data5);EnParkQueue(&parkq,data6);EnParkQueue(&parkq,data7);char num[20];char name[10];int id;int quit;int choice;CarData x;while(1){face();scanf("%d",&choice);if(choice == 1){while(1){printf("请输入车牌号:");scanf("%s",num);printf("请输入车主名:");scanf("%s",name);count++;x.id = count;strcpy(x.num,num);strcpy(x.name,name);x.time = time(NULL) % 86400;park(&parkq,waitq,x);printf("输入1继续停车,输入2退出:");scanf("%d",&quit);if(quit == 2)break;}}else if(choice == 2){display(&parkq,waitq);printf("输入2退出:");scanf("%d",&quit);if(quit == 2)continue;} else if(choice == 3){while(1){printf("请输入ID:");scanf("%d",&id);away(&parkq,waitq,s,id);printf("输入2退出:");scanf("%d",&quit);if(quit == 2)break;}}else{break;}}    return 0;}




原创粉丝点击