《停车场管理系统(数据构造C语言版)_1.docx》由会员分享,可在线阅读,更多相关《停车场管理系统(数据构造C语言版)_1.docx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、停车场管理系统(数据构造。C语言版)/设停车场是一个可停放n辆汽车的狭长通道,且只要一个大门可供汽车进出。/汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),/若车场内已停满n辆汽车,则后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;/当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车长为它让路,待该车开出大门外,/其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。/基本要求:以栈模拟停车场,以队列模拟车场外的便道/部分源代码(栈和队列的数据构造本人定义
2、,在清华版的数据构造课本上有具体的描绘)/停车场管理系统/停车场管理系统#includestdio.htypedefstructCar/构造体:车辆Carintnumber;intinTime;intoutTime;Car;typedefCarUser;/用户自定义类型#defineFEIYONG0.05/停车费用单价#defineMAXSIZE5/停车场容量/-系统库函数-#includestdlib.h/-通用变量、常量、类型声明-#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineOVERFLOW-2typedefintStatu
3、s;typedefUserSElemType;/-存储表示-#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10typedefstructSElemType*base;SElemType*top;intstacksize;SqStack;/-函数原型-/StatusInitStack(SqStack/构造空栈/StatusDestroyStack(SqStack/销毁栈S/StatusClearStack(SqStack/置空/StatusStackEmpty(SqStackS);/判空;空:TRUE,不空:FALSE。/intStackLength
4、(SqStackS);/返回S的元素的个数,即栈的长度。/StatusGetTop(SqStackS,SElemType/若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR。/StatusPush(SqStackS,SElemTypee);/插入元素e为新的栈顶元素/StatusPop(SqStackS,SElemType/若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。/StatusStackTraverse(SqStackS,Status(*visit)();/从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败
5、。/-基本操作-StatusInitStack(SqStackS)/构造空栈S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType);if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;returnOK;/InitStackStatusDestroyStack(SqStackS)/销毁栈Sfree(S.base);returnOK;/DestroyStackStatusClearStack(SqStackS)/置空returnOK;/ClearStac
6、k/StatusClearStack(SqStack/置空StatusStackEmpty(SqStackS)/判空;空:TRUE,不空:FALSE。if(S.top=S.base)returnTRUE;elsereturnFALSE;/QueueEmptyintStackLength(SqStackS)/返回S的元素的个数,即栈的长度。returnS.top-S.base;StatusGetTop(SqStackS,SElemTypee)/若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR。if(S.top=S.base)returnERROR;e=*(S.top-1);ret
7、urnOK;/GetTopStatusPush(SqStackS,SElemTypee)/插入元素e为新的栈顶元素if(S.top-S.base=S.stacksize)/栈满,追加存储空间S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType);if(!S.base)exit(OVERFLOW);/存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;returnOK;/PushStatusPop(SqSt
8、ackS,SElemTypee)/若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。if(S.top=S.base)returnERROR;e=*-S.top;returnOK;/PopStatusStackTraverse(SqStackS)/,Status(*visit)()/从栈底到栈顶依次对栈S中每个元素调用函数visit()。一旦visit()失败,则操作失败。for(SElemType*p=S.base;pS.top;p+)printf(%dn,p-number);returnOK;/StackTraversetypedefintStatus;typede
9、fUserQElemType;/-存储表示-typedefstructQNodeQElemTypedata;structQNode*next;QNode,*QueuePtr;typedefstructQueuePtrfront;QueuePtrrear;LinkQueue;/-函数原型-/StatusInitQueue(LinkQueue/构造空队列Q/StatusDestroyQueue(LinkQueue/销毁队列Q/StatusClearQueue(LinkQueue/置空/StatusQueueEmpty(LinkQueueQ);/判空;空:TRUE,不空:FALSE。/intQueu
10、eLength(LinkQueueQ);/返回S的元素的个数,即队列的长度。/StatusGetHead(LinkQueueQ,QElemType/若队列不空,则用e返回S的队头元素,并返回OK;否则返回ERROR。/StatusEnQueue(LinkQueueQ,QElemTypee);/插入元素e为新的队尾元素/StatusDeQueue(LinkQueueQ,QElemType/若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR。/StatusQueueTraverse(LinkQueueQ,Status(*visit)();/从队头到队尾依次对队列Q中每个元
11、素调用函数visit()。一旦visit()失败,则操作失败。/-基本操作-StatusInitQueue(LinkQueueQ)/构造空队列QQ.front=Q.rear=(QueuePtr)malloc(sizeof(QNode);if(!Q.front)exit(OVERFLOW);Q.front-next=NULL;returnOK;/InitQueueStatusDestroyQueue(LinkQueueQ)/销毁队列Qwhile(Q.front)Q.rear=Q.front-next;free(Q.front);Q.front=Q.rear;returnOK;/DestroyQu
12、eue/StatusClearQueue(LinkQueue/置空StatusQueueEmpty(LinkQueueQ)/判空;空:TRUE,不空:FALSE。if(Q.front=Q.rear)returnTRUE;elsereturnFALSE;/QueueEmpty/intQueueLength(LinkQueueQ);/返回Q的元素的个数,即队列的长度。StatusGetHead(LinkQueueQ,QElemTypee)/若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR。if(Q.front=Q.rear)returnERROR;e=Q.front-next-d
13、ata;returnOK;/GetHeadStatusEnQueue(LinkQueueQ,QElemTypee)/插入元素e为新的队尾元素QueuePtrp;p=(QueuePtr)malloc(sizeof(QNode);if(!p)exit(OVERFLOW);p-data=e;p-next=NULL;Q.rear-next=p;Q.rear=p;returnOK;/EnQueueStatusDeQueue(LinkQueueQ,QElemTypee)/若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR。QueuePtrp;if(Q.front=Q.rear)r
14、eturnERROR;p=Q.front-next;e=p-data;Q.front-next=p-next;if(Q.rear=p)Q.rear=Q.front;free(p);returnOK;/DeQueueStatusQueueTraverse(LinkQueueQ)/,Status(*visit)()/从队头到队尾依次对队列Q中每个元素调用函数visit()。一旦visit()失败,则操作失败。for(QueuePtrp=Q.front-next;p!=NULL;p=p-next)printf(%dn,p-data.number);returnOK;/QueueTraverse/函数
15、声明部分voidWelcome();/主选项画面voidGoIn();/进场部分intGoOut();/出场部分voidLookChang();/查看停车场部分voidLookDao();/查看便道部分voidLookCopyRight();/查看版权信息/全局变量声明SqStackS1,S2;/S1为停车场,S2为暂存的地方LinkQueueQ;/Q为便道voidWelcome()/主选项画面/clrscr();printf(*欢迎使用停车场管理系统*nprintf(请选择下面功能:nnprintf(1.车辆到达nprintf(2.车辆离去nprintf(3.查看停车场内情况nprintf(
16、4.查看便道情况nprintf(5.退出nnprintf(*MadebyYanJingTu2020*nprintf(请输入16之间的数字选择相应功能:/WelcomevoidGoIn()/进场部分Care;printf(您选择的是1.车辆到达nprintf(请输入车号:scanf(%d,e.number);printf(请输入到达时间(格式:HHMM):scanf(%d,e.inTime);inti=StackLength(S1);if(i=MAXSIZE)/停车场内已满,车辆在便道等待printf(n停车场内已满,请在便道内等待!nnEnQueue(Q,e);else/停车场没满,车辆进入P
17、ush(S1,e);printf(n车辆%d已于%d时%d分停放在第%d位。nn,e.number,e.inTime/100,e.inTime-e.inTime/100*100,i+1);/e.inTime/100为车辆进入停车场的时间小时/e.inTime-e.inTime/100*100为车辆进入停车场的时间分钟/i+1为停车位/GoInintGoOut()/出场部分intCarNum;/车号SElemType*CarID;/车辆在停车场中的位置,指向停车场栈的基址指针printf(您选择的是2.车辆离去nif(StackEmpty(S1)=TRUE)printf(停车场内没有车辆!nn/
18、看停车场内能否有车else/车辆离开printf(请输入要离开的车辆的车号:scanf(%d,CarNum);for(CarID=S1.base;CarIDS1.top;CarID+)/遍历,检查输入的车号if(CarID-number=CarNum)break;if(CarID=S1.top)/没有这辆车printf(对不起,没有这辆车!请检查您输入的车号:%dnn,CarNum);else/找到这辆车了,让其离开停车场printf(车辆%d进入停车场的时间是(格式:HHMM):%d,CarID-number,CarID-inTime);printf(n请输入车辆离开的时间(格式:HHMM)
19、:scanf(%d,CarID-outTime);if(CarID-outTime=CarID-inTime)printf(n时间不正确,离开时间竟然会早于到达时间?!nnreturn0;/计算费用,输出费用inthh1,hh2,mm1,mm2,hh,mm;floatmoney;/停车金额hh1=CarID-inTime/100;mm1=CarID-inTime-hh1*100;hh2=CarID-outTime/100;mm2=CarID-outTime-hh2*100;if(mm2-mm10)hh2-;mm2+=60;hh=hh2-hh1;mm=mm2-mm1;money=(float)(
20、hh*60+mm)*FEIYONG);/费用四舍五入printf(您本次的停车费用为%2.1f元。谢谢使用。nn,money);/车辆出栈(该车后面的车先出栈并入栈S2暂存)SElemTypee;Pop(S1,e);while(e.number!=CarID-number|e.inTime!=CarID-inTime)Push(S2,e);Pop(S1,e);while(!StackEmpty(S2)Pop(S2,e);Push(S1,e);/检查便道中能否有车辆,有的话第一辆车出队列并入栈S1if(!QueueEmpty(Q)DeQueue(Q,e);e.inTime=hh2*100+mm2
21、;Push(S1,e);/显示提示:便道中的车进入停车场printf(便道中的第一辆车%d于%d时%d分进入停车场!nn,e.number,hh2,mm2);return0;/GoOutvoidLookChang()/查看停车场部分printf(您选择的是3.查看停车场内情况nStackTraverse(S1);printf(n/LookChangvoidLookDao()/查看便道部分printf(您选择的是4.查看便道情况nQueueTraverse(Q);printf(n/LookDaointmain()/主函数InitStack(S1);/初始化S1InitStack(S2);/初始化
22、S2InitQueue(Q);/初始化Qwhile(1)Welcome();chari=getchar();/获取按键(主菜单)if(i=10)i=getchar();/清空字符缓冲区chari2=getchar();while(i2!=10)i2=getchar();/清空字符缓冲区switch(i)case1:/选择进场GoIn();break;case2:/选择出场GoOut();break;case3:/选择查看场内情况LookChang();break;case4:/选择查看便道情况LookDao();break;case5:/退出printf(程序已退出!谢谢使用!nnexit(0);break;default:/其它printf(您必须选择15之间的数字!n/while(1)DestroyStack(S1);DestroyStack(S2);DestroyQueue(Q);return0;