《课题设计停车场车辆管理系统C语言版数据结构.docx》由会员分享,可在线阅读,更多相关《课题设计停车场车辆管理系统C语言版数据结构.docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、/设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。/汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),/若车场内已停满n辆汽车,则后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;/当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车长为它让路,待该车开出大门外,/其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。/基本要求:以栈模拟停车场,以队列模拟车场外的便道/部分源代码(栈与队列的数据结构自己定义,在清华版的数据结构课本上有详细的描
2、述)/停车场管理系统/停车场管理系统#includetypedefstructCar/结构体:车辆Carintnumber;intinTime;intoutTime;Car;typedefCarUser;/用户自定义类型#defineFEIYONG/停车费用单价#define MAXSIZE5/停车场容量/-系统库函数-#includestdlib.h/-通用变量、常量、类型声明-#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineOVERFLOW-2typedefintStatus;typedefUserSElemType;/-存储表
3、示-#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10typedefstructSElemType*base;SElemType*top;intstacksize;SqStack;/-函数原型-/StatusInitStack(SqStack &S);/构造空栈/StatusDestroyStack(SqStack &S);/销毁栈S/StatusClearStack(SqStack &S);/置空/StatusStackEmpty(SqStack S);/判空;空:TRUE,不空:FALSE。/intStackLength(SqStack S);
4、/返回S的元素的个数,即栈的长度。/StatusGetTop(SqStack S,SElemType &e);/若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR。/StatusPush(SqStack &S,SElemType e);/插入元素e为新的栈顶元素/StatusPop(SqStack &S,SElemType &e);/若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。/StatusStackTraverse(SqStack S,Status ( * visit)();/从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit(
5、)失败,则操作失败。/-基本操作-Status InitStack(SqStack &S) /构造空栈S.base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType);if(!S.base)exit(OVERFLOW);S = S.base;S.stacksize = STACK_INIT_SIZE;returnOK;/InitStackStatus DestroyStack(SqStack &S)/销毁栈Sfree(S.base);returnOK;/DestroyStackStatus ClearStack(SqStack
6、&S)/置空returnOK;/ClearStack/StatusClearStack(SqStack &S);/置空StatusStackEmpty(SqStack S)/判空;空:TRUE,不空:FALSE。if(S = S.base)returnTRUE;elsereturnFALSE;/QueueEmptyintStackLength(SqStack S)/返回S的元素的个数,即栈的长度。returnS - S.base;Status GetTop(SqStack S,SElemType &e)/若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR。if(S = S.bas
7、e)returnERROR;e = *(S-1);returnOK;/GetTopStatus Push(SqStack &S,SElemType e)/插入元素e为新的栈顶元素if(S - S.base = S.stacksize)/栈满,追加存储空间S.base = (SElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(SElemType);if(!S.base)exit(OVERFLOW);/存储分配失败S = S.base + S.stacksize;S.stacksize += STACKINCREME
8、NT;*S+ = e;returnOK;/PushStatus Pop(SqStack &S,SElemType &e)/若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。if(S = S.base)returnERROR;e = * -S;returnOK;/PopStatusStackTraverse(SqStack S)/,Status ( * visit)()/从栈底到栈顶依次对栈S中每个元素调用函数visit()。一旦visit()失败,则操作失败。for(SElemType*p = S.base; p number);returnOK;/StackTrav
9、ersetypedefintStatus;typedefUserQElemType;/-存储表示-typedefstructQNode QElemTypedata;structQNode*next;QNode,*QueuePtr;typedefstruct QueuePtrfront;QueuePtrrear;LinkQueue;/-函数原型-/StatusInitQueue(LinkQueue &Q);/构造空队列Q/StatusDestroyQueue(LinkQueue &Q);/销毁队列Q/StatusClearQueue(LinkQueue &Q);/置空/StatusQueueEm
10、pty(LinkQueue Q);/判空;空:TRUE,不空:FALSE。/intQueueLength(LinkQueue Q);/返回S的元素的个数,即队列的长度。/StatusGetHead(LinkQueue Q,QElemType &e);/若队列不空,则用e返回S的队头元素,并返回OK;否则返回ERROR。/StatusEnQueue(LinkQueue &Q,QElemType e);/插入元素e为新的队尾元素/StatusDeQueue(LinkQueue &Q,QElemType &e);/若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR。/Sta
11、tusQueueTraverse(LinkQueue Q,Status ( * visit)();/从队头到队尾依次对队列Q中每个元素调用函数visit()。一旦visit()失败,则操作失败。/-基本操作-StatusInitQueue(LinkQueue &Q)/构造空队列QQ.front = Q.rear = (QueuePtr)malloc(sizeof(QNode);if(!Q.front)exit(OVERFLOW);Q.front-next = NULL;returnOK;/InitQueueStatusDestroyQueue(LinkQueue &Q)/销毁队列Qwhile(
12、Q.front)Q.rear = Q.front-next;free(Q.front);Q.front = Q.rear;returnOK;/DestroyQueue/StatusClearQueue(LinkQueue &Q);/置空StatusQueueEmpty(LinkQueue Q)/判空;空:TRUE,不空:FALSE。if(Q.front = Q.rear)returnTRUE;elsereturnFALSE;/QueueEmpty/intQueueLength(LinkQueue Q);/返回Q的元素的个数,即队列的长度。StatusGetHead(LinkQueue Q,QE
13、lemType &e)/若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR。if(Q.front = Q.rear)returnERROR;e = Q.front-next-data;returnOK;/GetHeadStatusEnQueue(LinkQueue &Q,QElemType e)/插入元素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;/EnQ
14、ueueStatusDeQueue(LinkQueue &Q,QElemType &e)/若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR。QueuePtrp;if(Q.front = Q.rear)returnERROR;p = Q.front-next;e = p-data;Q.front-next = p-next;if(Q.rear = p)Q.rear = Q.front;free(p);returnOK;/DeQueueStatusQueueTraverse(LinkQueue Q)/,Status ( * visit)()/从队头到队尾依次对队列Q中每
15、个元素调用函数visit()。一旦visit()失败,则操作失败。for(QueuePtrp = Q.front-next; p !=NULL; p = p-next)printf(%dn,p-data.number);returnOK;/QueueTraverse/函数声明部分voidWelcome();/主选项画面voidGoIn();/进场部分intGoOut();/出场部分voidLookChang(); /查看停车场部分voidLookDao();/查看便道部分voidLookCopyRight();/查看版权信息/全局变量声明SqStackS1,S2;/S1为停车场,S2为暂存的地
16、方LinkQueueQ;/Q为便道void Welcome()/主选项画面/clrscr();printf(*欢迎使用停车场管理系统*n);printf( 请选择以下功能:nn);printf( 1. 车辆到达n);printf( 2. 车辆离去n);printf( 3. 查看停车场内情况n);printf( 4. 查看便道情况n);printf( 5. 退出nn);printf(*Made by YanJingTu2008*n);printf(请输入16之间的数字选择相应功能:);/WelcomevoidGoIn()/进场部分Care;printf(您选择的是 1.车辆到达n);printf
17、(请输入车号:);scanf(%d,&e.number);printf(请输入到达时间(格式:HHMM):);scanf(%d,&e.inTime);inti = StackLength(S1);if(i = MAXSIZE)/停车场内已满,车辆在便道等待printf(n停车场内已满,请在便道内等待!nn);EnQueue(Q,e);else/停车场没满,车辆进入Push(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 为车辆进入停
18、车场的时间(小时)/e.inTime - e.inTime / 100 * 100 为车辆进入停车场的时间(分钟)/i+1 为停车位/GoInintGoOut()/出场部分intCarNum;/车号SElemType*CarID;/车辆在停车场中的位置,指向停车场栈的基址指针printf(您选择的是 2.车辆离去n);if(StackEmpty(S1) = TRUE)printf(停车场内没有车辆!nn);/看停车场内是否有车else/车辆离开printf(请输入要离开的车辆的车号:);scanf(%d,&CarNum);for(CarID = S1.base; CarID number =
19、CarNum)break;if(CarID = S1)/没有这辆车printf(对不起,没有这辆车!请检查您输入的车号:%dnn,CarNum);else/找到这辆车了,让其离开停车场printf(车辆%d进入停车场的时间是(格式:HHMM):%d,CarID-number,CarID-inTime);printf(n请输入车辆离开的时间(格式:HHMM):);scanf(%d,&CarID-outTime);if(CarID-outTime inTime)printf(n时间不正确,离开时间居然会早于到达时间?!nn);return 0;/计算费用,输出费用inthh1,hh2,mm1,mm
20、2,hh,mm;floatmoney;/停车金额hh1 = CarID-inTime / 100;mm1 = CarID-inTime - hh1 * 100;hh2 = CarID-outTime / 100;mm2 = CarID-outTime - hh2 * 100;if(mm2 - mm1 number | e.inTime != CarID-inTime)Push(S2,e);Pop(S1,e);while(!StackEmpty(S2)Pop(S2,e);Push(S1,e);/检查便道中是否有车辆,有的话第一辆车出队列并入栈S1if(!QueueEmpty(Q)DeQueue(
21、Q,e);e.inTime = hh2 * 100 + mm2;Push(S1,e);/显示提示:便道中的车进入停车场printf(便道中的第一辆车%d于%d时%d分进入停车场!nn,e.number,hh2,mm2);return0;/GoOutvoidLookChang()/查看停车场部分printf(您选择的是 3.查看停车场内情况n);StackTraverse(S1);printf(n);/LookChangvoidLookDao()/查看便道部分printf(您选择的是 4.查看便道情况n);QueueTraverse(Q);printf(n);/LookDaointmain()/
22、主函数InitStack(S1);/初始化S1InitStack(S2);/初始化S2InitQueue(Q);/初始化Qwhile(1)Welcome();char i = getchar();/获取按键(主菜单)if(i = 10)i = getchar();/清空字符缓冲区char i2 = getchar();while(i2 != 10)i2 = getchar();/清空字符缓冲区switch(i)case 1:/选择进场GoIn();break;case 2:/选择出场GoOut();break;case 3:/选择查看场内情况LookChang();break;case 4:/选择查看便道情况LookDao();break;case 5:/退出printf(程序已退出!谢谢使用!nn);exit(0);break;default:/其它printf(您必须选择15之间的数字!n);/while(1)DestroyStack(S1);DestroyStack(S2);DestroyQueue(Q);return0;第 18 页