数据结构实验报告模拟停车场管理含代码.docx
《数据结构实验报告模拟停车场管理含代码.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告模拟停车场管理含代码.docx(20页珍藏版)》请在冰点文库上搜索。
数据结构实验报告模拟停车场管理含代码
模拟停车场管理
班级:
物联网姓名:
XXX学号:
XXXXXXX日期:
4月9日
一、需求分析
1、程序的功能描述
按照从终端输入的数据序列进行模拟管理。
1)狭道停车用栈来实现,并且用的顺序栈,等车位的便道用队列来实现,并用链式存储。
2)每一组输入信息包含三个数据项,汽车的“到达”和“离去”的信息,汽车牌照号码,汽车“到达”或“离去”的时刻。
3)对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车子离去,则输出车辆在停车场内停留的时间和缴纳的费用。
(假设在便道等车的时间不收费)
4)选作内容:
(1)便道也是要收费的,仅仅比狭道收费便宜点。
(2)狭道上的车可以直接开走。
2、输入/输出的要求
首先选择操作的模块,根据提示输入车牌和到达时间,程序会告知是否停满或者停车车位。
车牌为10个字符以内的字符串,时间的输入中间有冒号把时分隔开。
3、测试数据
1苏D5431:
10
1苏Q1231:
20
1苏D1451:
30
二、概要设计
1、本程序所用的抽象数据类型的定义
typedefstructNODE{
CarNode*stack[MAX+1];
inttop;
}SeqStackCar;//狭道的堆栈顺序存储
typedefstructcar{
CarNode*data;
structcar*next;
}QueueNode;//队列的链式存储
typedefstructNode{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;//便道上等候的队列定义
2、主模块的流程及各子模块的主要功能
车辆到达:
intArrival(SeqStackCar*Enter,LinkQueueCar*W)首先定义一个栈和队列的结构体指针为:
*p,*t。
然后申请一个车辆信息的内存空间,并把它赋给栈指针。
车辆到达时就输入车牌号,并通过if(Enter->top如果是else就显示该车要停在便道上,并进行进队列的操作。车辆离开:voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)定义一个整型变量room记录要离开车辆的位置,定义两个栈指针和一个队列指针,用个if(Enter->top>0)确保栈不空,然后用个while(1)确保输入的车辆离开位置的合法性。如果不和法,显示输入有误,要重新输入。通过while(Enter->top>room)判断离开车辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,等要开出的车开出后,再把临时栈的车看进车场内,并要调用PRINT(p,room);这个函数计算显示费用。然后还要用if((W->head!=W->rear)&&Enter->top3、模块之间的层次关系主函数中包含着各个函数模块,各模块也在互相调用。比如,离开函数中要计算停车费,故要调取价格函数。价格函数计算要用到离开和进入的时间,又要调用进入和离开函数。三、详细设计1、采用C语言定义相关的数据类型#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05typedefstructtime{//定义时间结构体inthour;intmin;}Time;typedefstructnode{//定义车辆信息结构体charnum[10];Timereach;Timeleave;}CarNode;2、写出各模块的伪码算法voidPRINT(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达停车位时间);printf("\n离开停车位时间为:);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*price+PRINTE(p,room));free(p);}intArrival(SeqStackCar*Enter,LinkQueueCar*W)//进入便道或者狭道{CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));进入队列,调整指针;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1)//再把临时栈里德车辆进停车场{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");} 3、画出函数的调用关系图|---------------->到达函数-----||---------------->离开函数-------->停车费用主函数----------->显示车场里的情况|---------------->显示便道里的情况四、调试分析1、调试中遇到的问题及对问题的解决方法因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、算法的时间复杂度和空间复杂度由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。5、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。第一个应缴费用是在便道中的费用,第二个费用是总费用。六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已#include#include#include#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05#definepricee0.02typedefstructtime{//定义时间结构体inthour;intmin;}Time;typedefstructnode{//定义车辆信息结构体charnum[10];Timereach;Timeleave;}CarNode;typedefstructNODE{CarNode*stack[MAX+1];inttop;}SeqStackCar;typedefstructcar{CarNode*data;structcar*next;}QueueNode;typedefstructNode{QueueNode*head;QueueNode*rear;}LinkQueueCar;voidInitStack(SeqStackCar*);intInitQueue(LinkQueueCar*);intArrival(SeqStackCar*,LinkQueueCar*);voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);voidList(SeqStackCar,LinkQueueCar);voidmain(){SeqStackCarEnter,Temp;LinkQueueCarWait;intch;system("color4A");InitStack(&Enter);InitStack(&Temp);InitQueue(&Wait);while(1){printf("\n§※§※§※§※§※§欢迎使用停车场系统.§※§※§※§※§※§\t\n\n");printf("\n\t################1.车辆到达登记.################\t\n");printf("\n\t################2.车辆离开登记.################\t\n");printf("\n\t################3.车辆列表显示.################\t\n");printf("\n\t################4.退出系统.################\t\n\n");while(1){printf("请选择:");scanf("%d",&ch);if(ch>=1&&ch<=4)break;elseprintf("\n输入有误,请重新选择:1~4:");}switch(ch){case1:Arrival(&Enter,&Wait);break;case2:Leave(&Enter,&Temp,&Wait);break;case3:List(Enter,Wait);break;case4:exit(0);default:break;}}}//自定义函数voidInitStack(SeqStackCar*s){//栈的初始化inti;s->top=0;for(i=0;i<=MAX;i++)s->stack[s->top]=NULL;} intInitQueue(LinkQueueCar*Q){//队列的初始化Q->head=(QueueNode*)malloc(sizeof(QueueNode));if(Q->head!=NULL){Q->head->next=NULL;Q->rear=Q->head;return(1);}elsereturn(-1);}floatPRINTE(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开便道的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达便道时间为:%d:%d",p->reach.hour,p->reach.min);printf("\n离开便道时间为:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*pricee);return(((B1-A1)*60+(B2-A2))*pricee);free(p);} voidPRINT(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达停车位时间为:%d:%d",p->reach.hour,p->reach.min);printf("\n离开停车位时间为:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*price+PRINTE(p,room));free(p);}//车辆的到达登记intArrival(SeqStackCar*Enter,LinkQueueCar*W){CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[Enter->top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}} voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1)//再把临时栈里德车辆进停车场{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);printf("%d:%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf
如果是else就显示该车要停在便道上,并进行进队列的操作。
车辆离开:
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
定义一个整型变量room记录要离开车辆的位置,定义两个栈指针和一个队列指针,
用个if(Enter->top>0)确保栈不空,然后用个while
(1)确保输入的车辆离开位置的合法性。
如果不和法,显示输入有误,要重新输入。
通过while(Enter->top>room)判断离开车辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,等要开出的车开出后,再把临时栈的车看进车场内,并要调用PRINT(p,room);这个函数计算显示费用。
然后还要用if((W->head!
=W->rear)&&Enter->top3、模块之间的层次关系主函数中包含着各个函数模块,各模块也在互相调用。比如,离开函数中要计算停车费,故要调取价格函数。价格函数计算要用到离开和进入的时间,又要调用进入和离开函数。三、详细设计1、采用C语言定义相关的数据类型#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05typedefstructtime{//定义时间结构体inthour;intmin;}Time;typedefstructnode{//定义车辆信息结构体charnum[10];Timereach;Timeleave;}CarNode;2、写出各模块的伪码算法voidPRINT(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达停车位时间);printf("\n离开停车位时间为:);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*price+PRINTE(p,room));free(p);}intArrival(SeqStackCar*Enter,LinkQueueCar*W)//进入便道或者狭道{CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));进入队列,调整指针;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1)//再把临时栈里德车辆进停车场{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");} 3、画出函数的调用关系图|---------------->到达函数-----||---------------->离开函数-------->停车费用主函数----------->显示车场里的情况|---------------->显示便道里的情况四、调试分析1、调试中遇到的问题及对问题的解决方法因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、算法的时间复杂度和空间复杂度由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。5、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。第一个应缴费用是在便道中的费用,第二个费用是总费用。六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已#include#include#include#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05#definepricee0.02typedefstructtime{//定义时间结构体inthour;intmin;}Time;typedefstructnode{//定义车辆信息结构体charnum[10];Timereach;Timeleave;}CarNode;typedefstructNODE{CarNode*stack[MAX+1];inttop;}SeqStackCar;typedefstructcar{CarNode*data;structcar*next;}QueueNode;typedefstructNode{QueueNode*head;QueueNode*rear;}LinkQueueCar;voidInitStack(SeqStackCar*);intInitQueue(LinkQueueCar*);intArrival(SeqStackCar*,LinkQueueCar*);voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);voidList(SeqStackCar,LinkQueueCar);voidmain(){SeqStackCarEnter,Temp;LinkQueueCarWait;intch;system("color4A");InitStack(&Enter);InitStack(&Temp);InitQueue(&Wait);while(1){printf("\n§※§※§※§※§※§欢迎使用停车场系统.§※§※§※§※§※§\t\n\n");printf("\n\t################1.车辆到达登记.################\t\n");printf("\n\t################2.车辆离开登记.################\t\n");printf("\n\t################3.车辆列表显示.################\t\n");printf("\n\t################4.退出系统.################\t\n\n");while(1){printf("请选择:");scanf("%d",&ch);if(ch>=1&&ch<=4)break;elseprintf("\n输入有误,请重新选择:1~4:");}switch(ch){case1:Arrival(&Enter,&Wait);break;case2:Leave(&Enter,&Temp,&Wait);break;case3:List(Enter,Wait);break;case4:exit(0);default:break;}}}//自定义函数voidInitStack(SeqStackCar*s){//栈的初始化inti;s->top=0;for(i=0;i<=MAX;i++)s->stack[s->top]=NULL;} intInitQueue(LinkQueueCar*Q){//队列的初始化Q->head=(QueueNode*)malloc(sizeof(QueueNode));if(Q->head!=NULL){Q->head->next=NULL;Q->rear=Q->head;return(1);}elsereturn(-1);}floatPRINTE(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开便道的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达便道时间为:%d:%d",p->reach.hour,p->reach.min);printf("\n离开便道时间为:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*pricee);return(((B1-A1)*60+(B2-A2))*pricee);free(p);} voidPRINT(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达停车位时间为:%d:%d",p->reach.hour,p->reach.min);printf("\n离开停车位时间为:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*price+PRINTE(p,room));free(p);}//车辆的到达登记intArrival(SeqStackCar*Enter,LinkQueueCar*W){CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[Enter->top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}} voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1)//再把临时栈里德车辆进停车场{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);printf("%d:%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf
3、模块之间的层次关系
主函数中包含着各个函数模块,各模块也在互相调用。
比如,离开函数中要计算停车费,故要调取价格函数。
价格函数计算要用到离开和进入的时间,又要调用进入和离开函数。
三、详细设计
1、采用C语言定义相关的数据类型
#defineMAX3//停车场最大容量为3辆,便于观察
#defineprice0.05
typedefstructtime{//定义时间结构体
inthour;
intmin;
}Time;
typedefstructnode{//定义车辆信息结构体
charnum[10];
Timereach;
Timeleave;
}CarNode;
2、写出各模块的伪码算法
voidPRINT(CarNode*p,introom){//车辆收费
intA1,A2,B1,B2;
printf("\n车辆离开的时间:
");
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min));
printf("\n离开车辆的车牌号为:
puts(p->num);
printf("\n其到达停车位时间);
printf("\n离开停车位时间为:
);
A1=p->reach.hour;
A2=p->reach.min;
B1=p->leave.hour;
B2=p->leave.min;
printf("\n应交费用为:
%2.1f元",((B1-A1)*60+(B2-A2))*price+PRINTE(p,room));
free(p);
}
intArrival(SeqStackCar*Enter,LinkQueueCar*W)//进入便道或者狭道
{
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
printf("\n请输入车牌号(例:
豫B1234):
gets(p->num);
if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));进入队列,调整指针;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1)//再把临时栈里德车辆进停车场{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");} 3、画出函数的调用关系图|---------------->到达函数-----||---------------->离开函数-------->停车费用主函数----------->显示车场里的情况|---------------->显示便道里的情况四、调试分析1、调试中遇到的问题及对问题的解决方法因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、算法的时间复杂度和空间复杂度由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。5、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。第一个应缴费用是在便道中的费用,第二个费用是总费用。六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已#include#include#include#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05#definepricee0.02typedefstructtime{//定义时间结构体inthour;intmin;}Time;typedefstructnode{//定义车辆信息结构体charnum[10];Timereach;Timeleave;}CarNode;typedefstructNODE{CarNode*stack[MAX+1];inttop;}SeqStackCar;typedefstructcar{CarNode*data;structcar*next;}QueueNode;typedefstructNode{QueueNode*head;QueueNode*rear;}LinkQueueCar;voidInitStack(SeqStackCar*);intInitQueue(LinkQueueCar*);intArrival(SeqStackCar*,LinkQueueCar*);voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);voidList(SeqStackCar,LinkQueueCar);voidmain(){SeqStackCarEnter,Temp;LinkQueueCarWait;intch;system("color4A");InitStack(&Enter);InitStack(&Temp);InitQueue(&Wait);while(1){printf("\n§※§※§※§※§※§欢迎使用停车场系统.§※§※§※§※§※§\t\n\n");printf("\n\t################1.车辆到达登记.################\t\n");printf("\n\t################2.车辆离开登记.################\t\n");printf("\n\t################3.车辆列表显示.################\t\n");printf("\n\t################4.退出系统.################\t\n\n");while(1){printf("请选择:");scanf("%d",&ch);if(ch>=1&&ch<=4)break;elseprintf("\n输入有误,请重新选择:1~4:");}switch(ch){case1:Arrival(&Enter,&Wait);break;case2:Leave(&Enter,&Temp,&Wait);break;case3:List(Enter,Wait);break;case4:exit(0);default:break;}}}//自定义函数voidInitStack(SeqStackCar*s){//栈的初始化inti;s->top=0;for(i=0;i<=MAX;i++)s->stack[s->top]=NULL;} intInitQueue(LinkQueueCar*Q){//队列的初始化Q->head=(QueueNode*)malloc(sizeof(QueueNode));if(Q->head!=NULL){Q->head->next=NULL;Q->rear=Q->head;return(1);}elsereturn(-1);}floatPRINTE(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开便道的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达便道时间为:%d:%d",p->reach.hour,p->reach.min);printf("\n离开便道时间为:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*pricee);return(((B1-A1)*60+(B2-A2))*pricee);free(p);} voidPRINT(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达停车位时间为:%d:%d",p->reach.hour,p->reach.min);printf("\n离开停车位时间为:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*price+PRINTE(p,room));free(p);}//车辆的到达登记intArrival(SeqStackCar*Enter,LinkQueueCar*W){CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[Enter->top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}} voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1)//再把临时栈里德车辆进停车场{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);printf("%d:%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf
Enter->top++;
printf("\n车辆在车场第%d位置.",Enter->top);
printf("\n车辆到达时间:
%d",&(p->reach.hour),&(p->reach.min));
Enter->stack[top]=p;
return
(1);
else
printf("\n该车须在便道等待!
有车位时进入车场");
t=(QueueNode*)malloc(sizeof(QueueNode));
进入队列,调整指针;
printf("请输入进入便道的时间");
{//车辆的离开
introom;
CarNode*p,*t;
QueueNode*q;
if(Enter->top>0)//判断车场是否为空
while
(1)
printf("\n请输入车在车场的位置/1--%d/:
",Enter->top);
scanf("%d",&room);
if(room>=1&&room<=Enter->top)break;
elseprintf("\n输入有误,请重输:
while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。
Temp->top++;
Temp->stack[Temp->top]=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。
while(Temp->top>=1)//再把临时栈里德车辆进停车场
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack[Temp->top]=NULL;
Temp->top--;
PRINT(p,room);//调用计费函数计费。
。
if((W->head!
=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");} 3、画出函数的调用关系图|---------------->到达函数-----||---------------->离开函数-------->停车费用主函数----------->显示车场里的情况|---------------->显示便道里的情况四、调试分析1、调试中遇到的问题及对问题的解决方法因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、算法的时间复杂度和空间复杂度由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。5、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。第一个应缴费用是在便道中的费用,第二个费用是总费用。六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已#include#include#include#defineMAX3//停车场最大容量为3辆,便于观察#defineprice0.05#definepricee0.02typedefstructtime{//定义时间结构体inthour;intmin;}Time;typedefstructnode{//定义车辆信息结构体charnum[10];Timereach;Timeleave;}CarNode;typedefstructNODE{CarNode*stack[MAX+1];inttop;}SeqStackCar;typedefstructcar{CarNode*data;structcar*next;}QueueNode;typedefstructNode{QueueNode*head;QueueNode*rear;}LinkQueueCar;voidInitStack(SeqStackCar*);intInitQueue(LinkQueueCar*);intArrival(SeqStackCar*,LinkQueueCar*);voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);voidList(SeqStackCar,LinkQueueCar);voidmain(){SeqStackCarEnter,Temp;LinkQueueCarWait;intch;system("color4A");InitStack(&Enter);InitStack(&Temp);InitQueue(&Wait);while(1){printf("\n§※§※§※§※§※§欢迎使用停车场系统.§※§※§※§※§※§\t\n\n");printf("\n\t################1.车辆到达登记.################\t\n");printf("\n\t################2.车辆离开登记.################\t\n");printf("\n\t################3.车辆列表显示.################\t\n");printf("\n\t################4.退出系统.################\t\n\n");while(1){printf("请选择:");scanf("%d",&ch);if(ch>=1&&ch<=4)break;elseprintf("\n输入有误,请重新选择:1~4:");}switch(ch){case1:Arrival(&Enter,&Wait);break;case2:Leave(&Enter,&Temp,&Wait);break;case3:List(Enter,Wait);break;case4:exit(0);default:break;}}}//自定义函数voidInitStack(SeqStackCar*s){//栈的初始化inti;s->top=0;for(i=0;i<=MAX;i++)s->stack[s->top]=NULL;} intInitQueue(LinkQueueCar*Q){//队列的初始化Q->head=(QueueNode*)malloc(sizeof(QueueNode));if(Q->head!=NULL){Q->head->next=NULL;Q->rear=Q->head;return(1);}elsereturn(-1);}floatPRINTE(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开便道的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达便道时间为:%d:%d",p->reach.hour,p->reach.min);printf("\n离开便道时间为:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*pricee);return(((B1-A1)*60+(B2-A2))*pricee);free(p);} voidPRINT(CarNode*p,introom){//车辆收费intA1,A2,B1,B2;printf("\n车辆离开的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达停车位时间为:%d:%d",p->reach.hour,p->reach.min);printf("\n离开停车位时间为:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为:%2.1f元",((B1-A1)*60+(B2-A2))*price+PRINTE(p,room));free(p);}//车辆的到达登记intArrival(SeqStackCar*Enter,LinkQueueCar*W){CarNode*p;QueueNode*t;p=(CarNode*)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[Enter->top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}} voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1)//再把临时栈里德车辆进停车场{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);printf("%d:%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf
q=W->head->next;
t=q->data;
%d",&(t->reach.hour),&(t->reach.min));
//t->leave.hour=t->reach.hour;
//t->leave.min=t->reach.min;
W->head->next=q->next;
if(q==W->rear)W->rear=W->head;
Enter->stack[Enter->top]=t;
PRINTE(t,room);
free(q);
elseprintf("\n便道里没有车.\n");
elseprintf("\n车场里没有车.");
3、画出函数的调用关系图
|---------------->到达函数-----|
|---------------->离开函数-------->停车费用
主函数----------->显示车场里的情况
|---------------->显示便道里的情况
四、调试分析
1、调试中遇到的问题及对问题的解决方法
因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:
01这个时间的话,会导致显示列表是1:
1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。
解决方法1:
可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。
解决方案2:
将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!
2、算法的时间复杂度和空间复杂度
由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。
其余的都是结构体和链式存储的队列属于动态存储。
当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。
5、使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果)
时间以24进制计算,停车时间不能跨越24进制。
车牌号是10个字符串以内,不可溢出。
第一个应缴费用是在便道中的费用,第二个费用是总费用。
六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已
#include
#definepricee0.02
}SeqStackCar;
}QueueNode;
}LinkQueueCar;
voidInitStack(SeqStackCar*);
intInitQueue(LinkQueueCar*);
intArrival(SeqStackCar*,LinkQueueCar*);
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);
voidList(SeqStackCar,LinkQueueCar);
voidmain()
SeqStackCarEnter,Temp;
LinkQueueCarWait;
intch;
system("color4A");
InitStack(&Enter);
InitStack(&Temp);
InitQueue(&Wait);
printf("\n§※§※§※§※§※§欢迎使用停车场系统.§※§※§※§※§※§\t\n\n");
printf("\n\t################1.车辆到达登记.################\t\n");
printf("\n\t################2.车辆离开登记.################\t\n");
printf("\n\t################3.车辆列表显示.################\t\n");
printf("\n\t################4.退出系统.################\t\n\n");
printf("请选择:
scanf("%d",&ch);
if(ch>=1&&ch<=4)break;
elseprintf("\n输入有误,请重新选择:
1~4:
switch(ch)
case1:
Arrival(&Enter,&Wait);break;
case2:
Leave(&Enter,&Temp,&Wait);break;
case3:
List(Enter,Wait);break;
case4:
exit(0);
default:
break;
//自定义函数
voidInitStack(SeqStackCar*s){//栈的初始化
inti;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
intInitQueue(LinkQueueCar*Q){//队列的初始化
Q->head=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->head!
=NULL)
Q->head->next=NULL;
Q->rear=Q->head;
elsereturn(-1);
floatPRINTE(CarNode*p,introom){//车辆收费
printf("\n车辆离开便道的时间:
printf("\n其到达便道时间为:
%d:
%d",p->reach.hour,p->reach.min);
printf("\n离开便道时间为:
%d",p->leave.hour,p->leave.min);
%2.1f元",((B1-A1)*60+(B2-A2))*pricee);
return(((B1-A1)*60+(B2-A2))*pricee);
printf("\n其到达停车位时间为:
//车辆的到达登记
intArrival(SeqStackCar*Enter,LinkQueueCar*W){
if(Enter->top{Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[Enter->top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode*)malloc(sizeof(QueueNode));t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}} voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){//车辆的离开introom;CarNode*p,*t;QueueNode*q;if(Enter->top>0)//判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;elseprintf("\n输入有误,请重输:");}while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1)//再把临时栈里德车辆进停车场{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room);//调用计费函数计费。。if((W->head!=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);printf("%d:%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf
Enter->stack[Enter->top]=p;
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
=W->rear)&&Enter->top{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入%s号车进入车场的时间:",t->num);scanf("%d:%d",&(t->reach.hour),&(t->reach.min));//t->leave.hour=t->reach.hour;//t->leave.min=t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}elseprintf("\n便道里没有车.\n");}elseprintf("\n车场里没有车.");}voidList1(SeqStackCar*S)//显示车场里的车辆情况{inti;if(S->top>0){printf("\n车场:");printf("\n位置到达时间车牌号\n");for(i=1;i<=S->top;i++){printf("%d",i);printf("%d:%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);puts(S->stack[i]->num);}}elseprintf("\n车场里没有车");}voidList2(LinkQueueCar*W)//显示便道上的车辆情况{QueueNode*p;inti;p=W->head->next;if(W->head!=W->rear){printf("\n等待车辆的号码为:");for(i=1;(p!=NULL);i++){printf
printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);
printf("\n请输入%s号车进入车场的时间:
",t->num);
voidList1(SeqStackCar*S)//显示车场里的车辆情况
if(S->top>0)
printf("\n车场:
printf("\n位置到达时间车牌号\n");
for(i=1;i<=S->top;i++)
printf("%d",i);
printf("%d:
%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->num);
elseprintf("\n车场里没有车");
voidList2(LinkQueueCar*W)//显示便道上的车辆情况
QueueNode*p;
p=W->head->next;
if(W->head!
=W->rear)
printf("\n等待车辆的号码为:
for(i=1;(p!
=NULL);i++)
printf
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2