停车场项目需求
问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门
外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车
要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1)建立三个数据结构分别是:停放队列、让路栈、等候队列。
(2)输入数据模拟管理过程,数据(入或出,车号)
功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
查询场内车辆信息、查询等候车辆信息、退出系统。
(1)linux系统编写(链表、栈、队列);
(2)进车登记:登记车牌号以及入场时间;
(3)出车登记:计算出停车时间,记录车辆车牌;
(4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场
(5)查询出入记录:所有车辆,包括已经离开的
(6)查询场内车辆信息:列出所有场内车辆信息
(7)查询等候车辆信息:显示等候车辆数量以及所有车牌号
(8)退出系统。
具体解释都写在注释里了,源码有点多,直接上了:
#ifndef _PARK_H
#define _PARK_H
#define FAILURE 10000
#define SUCCESS 10001
#define TEUE 10002
#define FALSE 10003
#define SIZE 5
#define NUM 100
#include "time.h"
/*定义存放车辆信息的结构体*/
struct CarInfo
{
char *carid;
char *storetime;
char *delivertime;
};
typedef struct CarInfo carinfo;
/*定义栈1的信息*/
struct Stack1
{
int top;
carinfo car[SIZE];
};
typedef struct Stack1 stack1;
/*定义栈2的信息*/
struct Stack2
{
int top;
carinfo car[SIZE];
};
typedef struct Stack2 stack2;
/*定义等待队列的信息*/
struct Queue
{
carinfo car[NUM];
int front;
int rear;
};
typedef struct Queue queue;
/*将出栈的车辆放入一个队列*/
struct Queue1
{
carinfo car[NUM];
int front;
int rear;
};
typedef struct Queue1 queue1;
int s1init(stack1 **q);
int s2init(stack2 **q);
int qinit(queue **q);
int q2init(queue1 **q);
int enterinfo(stack1 **q1, queue **q2);
int outinfo(stack1 **q1, stack2 **q2, queue **q3, queue1 **q4);
int searchcar(stack1 *q1, queue *q2);
int traverseinside(stack1 *q);
int traverseoutside(queue *q);
#endif
#include "park.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*初始化栈1
q为二级指针,存放S1地址*/
int s1init(stack1 **q)
{
*q = (stack1 *)malloc(sizeof(stack1));
if(NULL == *q)//入参判断
{
return FAILURE;
}
(*q)->top = -1;
return SUCCESS;
}
/*初始化栈2
q为二级指针,存放S2地址*/
int s2init(stack2 **q)
{
*q = (stack2 *)malloc(sizeof(stack2));
if(NULL == *q)//入参判断
{
return FAILURE;
}
(*q)->top = -1;
return SUCCESS;
}
/*初始化队列
q为二级指针,存放Q1地址*/
int qinit(queue **q)
{
*q = (queue *)malloc(sizeof(queue));
if(NULL == *q)//入参判断
{
return FAILURE;
}
(*q)->front = (*q)->rear = 0;//队列为空
return SUCCESS;
}
/*初始化队列1
q为二级指针,存放Q2地址*/
int q1init(queue1 **q)
{
*q = (queue1 *)malloc(sizeof(queue1));
if(NULL == *q)//入参判断
{
return FAILURE;
}
(*q)->front = (*q)->rear = 0;//队列为空
return SUCCESS;
}
//实现车辆进栈,栈满进入队列排队
//q1,q2为二级指针存放S1,Q1地址
//注意:此时top已经为栈1下标,而非top+1
int enterinfo(stack1 **q1, queue **q2)
{
if(NULL == *q1 || NULL == *q2)//入参判断
{
return FAILURE;
}
printf("车牌号:\n");
if((*q1)->top + 1 < 5)//栈1未满,直接进车
{
int i;
time_t timep;
time(&timep);
(*q1)->car[(*q1)->top + 1].carid = (char *)malloc(sizeof(char));
(*q1)->car[(*q1)->top + 1].storetime = (char *)malloc(sizeof(char)*64);//!!!!重点!!!!这个话分配空间一定要乘大一点!!!!!!
strcpy((*q1)->car[(*q1)->top + 1].storetime, ctime(&timep));
scanf("%s", (*q1)->car[(*q1)->top + 1].carid);
printf("%s\n", (*q1)->car[(*q1)->top + 1].storetime);
printf("进入车库成功!\n");
(*q1)->top++;//栈头上移一位
return;
}
if((*q1)->top == 4)//栈1已满,开始分配进入队列
{
if (((*q2)->rear + 1) % SIZE == (*q2)->front) //队满
{
return FAILURE;
}
(*q2)->car[(*q2)->rear].carid = (char *)malloc(sizeof(char));
scanf("%s", (*q2)->car[(*q2)->rear].carid);
printf("车位已满,进入排队队列!\n");
(*q2)->rear = ((*q2)->rear + 1) % NUM;//队尾后移一位
printf("进入排队队列成功!\n");
printf("当前等待序列号为:%d\n", (*q2)->rear);
}
}
//实现车库内车辆出栈,等待车辆按顺序进栈
//q1,q2,q3为二级指针存放S1,S2,Q1地址
/*参数:ptr,存放输入的车牌号
i,为结构体数组内成员分配空间的次数
n,同理
*/
//调用系统时间函数
int outinfo(stack1 **q1, stack2 **q2, queue **q3, queue1 **q4)
{
time_t t = time(NULL);
char *ptr;
int i = 0,n;
ptr = (char *)malloc(sizeof(char));
if(NULL == ptr)
{
return FAILURE;
}
if(NULL == *q1 || NULL == *q2 || NULL == *q3 || NULL == *q4)
{
return FAILURE;
}
printf("请输入出库的车牌号!\n");
scanf("%s", ptr);
if(strcmp((*q1)->car[0].carid, ptr) == 0)//栈底出栈!
{
for(n = 0; n < 5; n++)//!!!!!!重点!!!!一定要给栈2成员全部分配空间!!!!
{
(*q2)->car[(*q2)->top + 1 + n].carid = (char *)malloc(sizeof(char));
}
while((*q1)->top !=- 1)//未全部出栈
{
strcpy((*q2)->car[(*q2)->top + 1].carid, (*q1)->car[(*q1)->top].carid);
(*q2)->top++;
(*q1)->top--;
}
(*q4)->car[(*q1)->top].delivertime = (char *)malloc(sizeof(char)*64);
strcpy((*q4)->car[0].delivertime, ctime(&t));
printf("%s", (*q1)->car[0].delivertime);
(*q4)->car[(*q4)->rear].carid = (char *)malloc(sizeof(char));
strcpy((*q4)->car[(*q4)->rear].carid, (*q1)->car[(*q1)->top + 1].carid);
(*q4)->car[(*q4)->rear].storetime = (char *)malloc(sizeof(char));
strcpy((*q4)->car[(*q4)->rear].storetime, (*q1)->car[(*q1)->top + 1].storetime);
(*q4)->rear++;
(*q2)->top--;//删除栈顶
while((*q2)->top != -1)//栈2中车辆返回栈1
{
strcpy(((*q1)->car[(*q1)->top + 1].carid), (*q2)->car[(*q2)->top].carid);
(*q2)->top--;
(*q1)->top++;
}
return SUCCESS;
}
while(strcmp((*q1)->car[i].carid, ptr) != 0)//不是栈底出栈,从第二个开始寻找需要出栈的车辆,找到为止!
{
i++;
if(strcmp((*q1)->car[i].carid, ptr) == 0)//找到目标车辆!
{
for(n = 0; n < 5; n++)//栈2再次分配空间!
{
(*q2)->car[(*q2)->top + 1 + n].carid = (char *)malloc(sizeof(char));
}
while((*q1)->top != i - 1)//目标车辆及目标车辆以后的车辆 全部出栈,进入栈2
{
strcpy((*q2)->car[(*q2)->top + 1].carid, (*q1)->car[(*q1)->top].carid);
(*q2)->top++;
(*q1)->top--;
}
(*q4)->car[(*q4)->rear].delivertime = (char *)malloc(sizeof(char)*64);
strcpy((*q4)->car[(*q4)->rear].delivertime, ctime(&t));
printf("%s", (*q4)->car[(*q4)->rear].delivertime);
(*q4)->car[(*q4)->rear].storetime = (char *)malloc(sizeof(char)*64);
strcpy((*q4)->car[(*q4)->rear].storetime, (*q1)->car[i].storetime);
(*q4)->car[(*q4)->rear].carid = (char *)malloc(sizeof(char));
strcpy((*q4)->car[(*q4)->rear].carid, (*q1)->car[i].carid);
(*q4)->rear++;
(*q2)->top--;//删除栈2头元素
while((*q2)->top != -1)//将栈2全部元素返回栈1
{
strcpy(((*q1)->car[(*q1)->top + 1].carid), (*q2)->car[(*q2)->top].carid);
(*q2)->top--;
(*q1)->top++;
}
printf("车牌号为%s的车辆出库成功!\n", ptr);
while((*q1)->top != 4 && (*q3)->rear != (*q3)->front)//!!!重点!!!因为删除了出栈车辆,所以将队列中最小号等候位进栈1
{
strcpy((*q1)->car[(*q1)->top + 1].carid, (*q3)->car[(*q3)->front].carid);
(*q3)->front++;
(*q1)->top++;
printf("车牌号为%s的车辆进库!\n", (*q1)->car[(*q1)->top].carid);
(*q1)->car[(*q1)->top].storetime = (char *)malloc(sizeof(char)*64);
(*q1)->car[(*q1)->top].storetime = ctime(&t);
printf("%s", (*q1)->car[(*q1)->top].storetime);
}
return SUCCESS;
}
}
}
//查询目标车辆信息
//i为循环次数
int searchcar(stack1 *q1, queue *q2)
{
char *ptr;
int i;
ptr = (char *)malloc(sizeof(char));
if(NULL == q1 || NULL == q2)
{
return FAILURE;
}
printf("请输入需要查询车辆的车牌号!\n");
scanf("%s", ptr);
for(i = 0; i <= q1->top; i++)
{
if(strcmp(q1->car[i].carid, ptr) == 0)
{
printf("车牌号:%s\n", q1->car[i].carid);
printf("入库时间为%s", (q1)->car[i].storetime);
return 1;
}
}
while(q2->rear != q2->front)
{
if(strcmp(q2->car[q2->front].carid, ptr) == 0)
{
printf("车牌号:%s\n", q2->car[q2->front].carid);
return 1;
}
q2->front++;
}
printf("目标车辆不存在!\n");
}
//查询车辆出库记录
////用i代替q->front,否则先查询,再进队,会出错
int recordcar(queue1 *q)
{
if(NULL == q)
{
return FAILURE;
}
int i;
i = q->front;
while(i != q->rear)
{
printf("车牌号为%s车辆出库\n", q->car[i].carid);
printf("入库时间为%s\n", q->car[i].storetime);
printf("出库时间为%s\n", q->car[i].delivertime);
i++;
}
}
//遍历栈1中目前车辆信息
//用i代替q->top,否则先查询,再进栈,会出错
int traverseinside(stack1 *q)
{
if(NULL == q)
{
return FAILURE;
}
int i;
for(i = 0; i <= q->top; i++)
{
printf("车牌号:%s\n", q->car[i].carid);
printf("入库时间为%s\n", (q)->car[i].storetime);
}
return 0;
}
//遍历队列中目前车辆信息
//用i代替q->front,否则先查询,再进队,会出错
int traverseoutside(queue *q)
{
if(NULL == q)
{
return FAILURE;
}
int i;
i = q->front;
while(i != q->rear)
{
printf("车牌号为%s的车辆正在等候\n", q->car[i].carid);
i++;
}
}
#include "park.h"
#include <stdio.h>
#include <stdlib.h>
int meun()
{
int n;
printf("********************作者:杨卓越********************************\n");
printf("***************************************************************\n");
printf(" 菜单\n");
printf("***************************************************************\n");
printf("\n");
printf(" 1:进车登记\n");
printf(" 2:出车登记\n");
printf(" 3:查询车辆信息\n");
printf(" 4:查询出入记录\n");
printf(" 5:查询场内车辆信息\n");
printf(" 6:查询等候车辆信息\n");
printf(" 0:退出系统\n");
printf("***************************************************************\n");
printf("\n");
printf("请输入您的选择\n");
scanf("%d", &n);
return n;
}
/*主函数实现功能:enterinfo() 登记进入车辆信息
outinfo() 登记出栈车辆信息
searchcar() 查询目标车辆信息
record() 查询出入记录
traverseinside() 查询场内车辆信息
traverseoutside() 查询等候车辆信息
*/
int main()
{
stack1 *S1;
stack2 *S2;
queue *Q1;
queue1 *Q2;
int ret;
/*判断s1是否初始化成功*/
ret = s1init(&S1);
if(ret == FAILURE)
{
printf("s1init failure!\n");
}
else
{
printf("s1init success!\n");
}
/*判断s2是否初始化成功*/
ret = s2init(&S2);
if(ret == FAILURE)
{
printf("s2init failure!\n");
}
else
{
printf("s2init success!\n");
}
/*判断Q1是否初始化成功*/
ret = qinit(&Q1);
if(ret == FAILURE)
{
printf("q1init failure!\n");
}
else
{
printf("q1init success!\n");
}
/*判断Q2是否初始化成功*/
ret = q1init(&Q2);
if(ret == FAILURE)
{
printf("q1init failure!\n");
}
else
{
printf("q1init success!\n");
}
//进入菜单选择界面
while(1)
{
int n = 0;
n = meun();
switch(n)
{
case 1:
ret = enterinfo(&S1, &Q1);
if(ret == FAILURE)
{
printf("enter failure!\n");
}
else
{
printf("enter success!\n");
}
break;
case 2:
ret = outinfo(&S1, &S2, &Q1, &Q2);
if(ret == FAILURE)
{
printf("out failure!\n");
}
else
{
printf("out success!\n");
}
break;
case 3:
ret = searchcar(S1, Q1);
if(ret == FAILURE)
{
printf("search failure!\n");
}
break;
case 4:
ret = recordcar(Q2);
if(ret == FAILURE)
{
printf("record FAILURE!\n");
}
break;
case 5:
ret = traverseinside(S1);
if(ret == FAILURE)
{
printf("error!\n");
}
break;
case 6:
ret = traverseoutside(Q1);
if(ret == FAILURE)
{
printf("error!\n");
}
break;
case 0:
exit(1);
}
}
}