停车场项目需求
问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门
外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车
要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
(2)输入数据模拟管理过程,数据(入或出,车号)
功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
查询场内车辆信息、查询等候车辆信息、退出系统。
(1)linux系统编写(链表、栈、队列);
(2)进车登记:登记车牌号以及入场时间; (进栈时)
(3)出车登记:计算出停车时间,记录车辆车牌; (出栈时)
(4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场 (链表中查找)
(5)查询出入记录:所有车辆,包括已经离开的 (链表中查找)
(6)查询场内车辆信息:列出所有场内车辆信息 (链表中查找)
(7)查询等候车辆信息:显示等候车辆数量以及所有车牌号 (等待队列中查询)
(8)退出系统。
项目分析:
两个栈,1、停放栈(车牌号,出场时间,入场时间)[初始化,判断是否为空,出栈,入栈,查栈]
2、让路栈(车牌号)[初始化,出栈,入栈,判断是否为空]
一个队列,[初始化,出队列,入队列](车牌号)
一个链表,(车牌号,出入厂状态,入场时间,出场时间)[初始化,入链表,查找数据,遍历打印]
一个结构体数组存场内车辆(车牌号,入场时间)[增添数据,删除数据,打印所有数据。]
// 头文件
#ifndef _PARK_H
#define _PARK_H
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define SUCCESS 10001
#define FAILURE 10002
#define TRUE 10003
#define FALSE 10004
#define SIZE 5
struct list
{
char plate[10];
char sit[10];
time_t T1; // 入场时间
time_t T2; // 出场时间
struct list *next;
};
typedef struct list L; // ----------------------- list ---------------//
struct info
{
char plate[10]; // 栈的信息,车牌
};
typedef struct info SI;
struct Seqstack
{
int top; // 栈顶
SI *data;
};
typedef struct Seqstack ST; // ---------------- stack -----------------//
struct wait // 等待队列的信息
{
char plate[10]; // 车牌
struct wait *next;
};
typedef struct wait node;
struct linkqueue // 队列
{
node *front; // 队头指针
node *rear; // 队尾指针
};
typedef struct linkqueue Q; // ----------------- queue -------------//
void menu(); // ------ 操作显示函数 ------//
int listInit(L **l); // ------ 链表初始化 -------//
int stackInit(ST **s); // ------ 栈的初始化 -------//
int Initqueue(Q **q); // ------ 队列初始化 -------//
int push(ST *s,char *p); // ------ 入栈 ----------//
int Enterqueue(Q *q,char *p); // ------ 入队 ----------//
int Getfull(ST *s); // ------ 判断栈是否存满 -----//
int listInsert(L *l,char nam[],time_t t1,time_t t2); // --- 插入链表 ------- //
int stackEmpty(ST *s); // --- 栈空不空 --------------//
int pop(ST *s,char **e); // ---------- 出栈 ----------------//
int Gettop(ST *s); // ---------- 得到top大小 --------//
int EmptyQueue(Q *q); // ---------- 空队 ---------------//
int DeleteQueue(Q *q,char **e); // ----------- 出队 ---------------//
int car_in(L *l,ST *s,Q *q); // ----------- 进车登记 ------------//
int car_out(L *l, ST *s1, ST *s2, Q *q); // ----------- 出车登记 ------------//
int find_car(L *l); // 查询一辆车
int all_car(L *l); // 出入记录
int car_park(L *l); // 查询场内所有车
int car_wait(Q *q); // 查询等候的所有车辆
#endif
// 测试文件
#include "park.h"
int main()
{
char ch;
int ret,n = 0;
L *l;
ST *s1,*s2;
Q *q;
ret = listInit(&l);
if(FAILURE == ret)
{
printf("Init list Failure!\n");
}
if(stackInit(&s1) != SUCCESS || stackInit(&s2) != SUCCESS)
{
printf("Init stack Failure!\n");
}
ret = Initqueue(&q);
if(ret == FAILURE)
{
printf("Init queue Failure!\n");
}
while(1)
{
menu();
printf("请输入你的选择: ");
scanf(" %c",&ch);
switch(ch)
{
case '1':
{
ret = car_in(l,s1,q);
if(ret == FAILURE)
{
printf("进车登记失败\n");
}
else
{
printf("进车登记成功\n");
}
}
sleep(3);
break;
case '2':
{
ret = car_out(l,s1,s2,q);
if(ret == FAILURE)
{
printf("出车登记失败\n");
}
else
{
printf("出车登记成功\n");
}
}
sleep(3);
break;
case '3':
ret = find_car(l);
if(ret == FAILURE)
{
printf("查询车辆失败\n");
}
else
{
printf("查询车辆成功\n");
}
sleep(3);
break;
case '4':
ret = all_car(l);
if(ret == FAILURE)
{
printf("查询出入记录失败\n");
}
else
{
printf("查询出入记录成功\n");
}
sleep(3);
break;
case '5':
ret = car_park(l);
if(ret == FAILURE)
{
printf("查询场内车辆失败\n");
}
else
{
printf("查询场内车辆成功\n");
}
sleep(3);
break;
case '6':
ret = car_wait(q);
if(ret == FAILURE)
{
printf("查询等待车辆失败\n");
}
else
{
printf("查询等待车辆成功\n");
}
sleep(3);
break;
case '0':
printf("欢迎下次使用!\n");
break;
default :
printf("输入有误,请重新输入!\n");
break;
}
if('0' == ch)
{
printf("确定退出?确定请输入 1,否则请输 0\n");
scanf("%d",&n);
if(1 == n)
{
break;
}
}
}
return 0;
}
// 功能函数文件
#include "park.h"
void menu() // - - - - - - 操作显示函数 - - - - - - - - //
{
printf("==========================================\n");
printf("=== 菜单 ===\n");
printf("==========================================\n");
printf("=== ===\n");
printf("=== 0 : 退出系统 ===\n");
printf("=== 1 : 进车登记 ===\n");
printf("=== 2 : 出车登记 ===\n");
printf("=== 3 : 查询车辆信息 ===\n");
printf("=== 4 : 查询出入记录 ===\n");
printf("=== 5 : 查询场内车辆信息 ===\n");
printf("=== 6 : 查询等候车辆信息 ===\n");
printf("=== ===\n");
printf("==========================================\n");
printf("=== wcn 201808 ===\n");
printf("==========================================\n");
}
int listInit(L **l) // - - - - - - - 链表初始化 - - - - - ---- - //
{
*l = (L *)malloc(sizeof(L)*1);
if( NULL == (*l) )
{
return FAILURE;
}
(*l)->next = NULL;
return SUCCESS;
}
int stackInit(ST **s) // - - - - - - - 栈的初始化 - - - - - - - - - //
{
(*s) = (ST *)malloc(sizeof(ST)*1);
if( NULL == (*s) )
{
return FAILURE;
}
(*s)->top = -1;
(*s)->data = (SI *)malloc(sizeof(SI)*10);
if( NULL == (*s)->data )
{
return FAILURE;
}
return SUCCESS;
}
int Initqueue(Q **q) // - - - - - - - 队列初始化 - - - - - - - //
{
*q = (Q *)malloc(sizeof(Q)*1);
if( NULL == (*q) )
{
return FAILURE;
}
node *p = (node *)malloc(sizeof(node)*1);
if(NULL == p)
{
return FAILURE;
}
p->next = NULL;
(*q)->front = (*q)->rear = p;
return SUCCESS;
}
int push(ST *s,char *p) // - - - 入栈 - - -- - //
{
if(NULL == s)
{
return FAILURE;
}
s->top++;
strcpy(s->data[s->top].plate,p);
return SUCCESS;
}
int Enterqueue(Q *q,char *p) // - - - 入队 - - -- - //
{
if(NULL == q)
{
return FAILURE;
}
node *r = (node *)malloc(sizeof(node)*1);
if(NULL == r)
{
return FAILURE;
}
strcpy(r->plate,p);
r->next = NULL;
q->rear->next = r;
q->rear = r;
return SUCCESS;
}
int Getfull(ST *s) // - - - 判断栈是否存满 - - //
{
return (s->top == SIZE -1)? TRUE:FALSE;
}
int listInsert(L *l,char nam[],time_t t1,time_t t2) // - - - 插入链表 - - - - //
{
L *r,*p = l;
if(NULL == l)
{
return FAILURE;
}
r = (L *)malloc(sizeof(L)*1);
if(NULL == r)
{
return FAILURE;
}
strcpy(r->plate,nam);
strcpy(r->sit,"在场内");
r->T1 = t1;
r->T2 = t2;
r->next = p->next;
p->next = r;
return SUCCESS;
}
int stackEmpty(ST *s) // --- 栈空不空 --------//
{
return (s->top == -1)? TRUE:FALSE;
}
int pop(ST *s,char **e) // 出栈 //
{
if(s->top == -1 || NULL == s)
{
return FAILURE;
}
*e = (char *)malloc(sizeof(char)*10);
if(NULL == (*e))
{
return FAILURE;
}
strcpy(*e,s->data[s->top].plate);
s->top--;
return SUCCESS;
}
int Gettop(ST *s) // - - 得到top值 - - - - //
{
if(s->top == -1 || NULL == s)
{
return FAILURE;
}
else
{
return s->top;
}
}
int EmptyQueue(Q *q) // - - - 空队 - - - - - //
{
if(q==NULL)
{
return FAILURE;
}
return (q->front == q->rear)? TRUE:FALSE;
}
int DeleteQueue(Q *q,char **e) // - - - - -- 8出队 - - - //
{
node *p = q->front->next; // 队节点
if (NULL == q ) // 入参判断 并判断是否为空队列
{
return FAILURE;
}
*e = (char *)malloc(sizeof(char)*10);
if(NULL == (*e))
{
return FAILURE;
}
strcpy(*e,p->plate); //
q->front->next = p->next;
if (NULL == p->next)
{
q->rear = q->front;
}
free(p);
return SUCCESS;
}
int out(L *l,ST *s1,ST *s2,char *nam) // 出停栈,比对成功链表记,入让栈
{
time_t t;
char *p;
int k = 0;
L *r = l->next;
if(l == NULL || NULL == s1 || s2 == NULL)
{
return FAILURE;
}
while(stackEmpty(s1) != TRUE)
{
pop(s1,&p);
if(strcmp(p,nam) == 0)
{
break;
}
else
{
push(s2,p);
}
}
while(r)
{
if(strcmp(r->plate,nam) == 0)
{
time(&t);
strcpy(r->sit,"已离开");
r->T2 = t;
break;
}
r = r->next;
}
if(r == NULL)
{
printf("车场内没有来过此车\n");
}
return SUCCESS;
}
int out1(ST *s1,ST *s2) // 出让栈,空停止,入停栈
{
char *p;
int ret;
if(NULL == s1 || s2 == NULL)
{
return FAILURE;
}
while(stackEmpty(s2) != TRUE)
{
ret = pop(s2,&p); // 获取p
if(FAILURE == ret)
{
return FAILURE;
}
ret = push(s1,p); // p入栈
if(ret == FAILURE)
{
return FAILURE;
}
}
return SUCCESS;
}
int out2(L *l,ST *s,Q *q) // 停栈不满队来补满
{
time_t t1,t2;
char *a;
int ret;
while(Getfull(s) != TRUE && EmptyQueue(q) != TRUE)
{
time(&t1);
ret = DeleteQueue(q,&a);
if(FAILURE == ret)
{
return FAILURE;
}
ret = push(s,a);
if(FAILURE == ret)
{
return FAILURE;
}
ret = listInsert(l,a,t1,t2);
if(FAILURE == ret)
{
return FAILURE;
}
}
return SUCCESS;
}
// -------------- 6大功能区 ----------//
int car_in(L *l,ST *s,Q *q) //------ 进车登记 ------//
{
int ret;
char nam[10],ch;
time_t t1;
time_t t2;
if(l == NULL || s == NULL || q == NULL) // 入参判断
{
return FAILURE;
}
printf("请输入车牌:");
scanf("%s",nam);
printf("\n");
while(1)
{
if(Getfull(s) != TRUE)
{
ret = push(s,nam);
if(ret == SUCCESS)
{
time(&t1);
if(listInsert(l,nam,t1,t2) != SUCCESS)
{
printf("登记失败\n");
}
}
}
else
{
printf("停车场已满,此车在等待队列等候\n");
Enterqueue(q,nam);
}
while(1)
{
getchar();
printf("是否继续进车登记'y/n': ");
scanf(" %c",&ch);
printf("\n");
if('y' == ch)
{
printf("请输入车牌:");
scanf("%s",nam);
break;
}
else if('n' == ch)
{
break;
}
else
{
printf("输入错误,请输入 'y' 或 'n'\n");
}
}
if(ch == 'n')
{
break;
}
}
return SUCCESS;
}
int car_out(L *l,ST *s1,ST *s2,Q *q) // --------出车登记 -----//
{
char nam[10],*e,*t,ch; // e 记出栈车牌,ch 记出队车牌
int ret,k = 0;
L *p = l,*h = l;
if(NULL == l || NULL == s1 || NULL == s2 || NULL == q) // 入参判断
{
return FAILURE;
}
if(stackEmpty(s1) != FALSE) // 车场为空,不能出车
{
printf("车场为空,无车可出!\n");
return FAILURE;
}
printf("请输入要离开车的车牌:");
scanf("%s",nam);
printf("\n");
ret = out(l,s1,s2,nam);
if(FAILURE == ret)
{
return FAILURE;
}
ret = out1(s1,s2);
if(FAILURE == ret)
{
return FAILURE;
}
ret = out2(l,s1,q);
if(FAILURE == ret)
{
return FAILURE;
}
return SUCCESS;
}
int find_car(L *l) // 查询某一辆车辆信息
{
char nam[10];
time_t t;
struct tm *time1;
struct tm *time2;
int cost;
L *p = l->next;
if(NULL == l)
{
return FAILURE;
}
printf("请输入要查询的车牌:");
scanf("%s",nam);
printf("\n");
while(p)
{
if(strcmp(p->plate,nam) == 0)
{
if(strcmp(p->sit,"在场内") == 0)
{
time(&t);
time1 = localtime(&p->T1);
cost = difftime(t,p->T1);
printf("查询信息如下:\n");
printf("车牌号 是否在场内 入场时间(h.m.s) 停留时间(s)\n");
printf("%s %s ",p->plate,p->sit);
printf("%d.%d.%d ",time1->tm_hour,time1->tm_min,time1->tm_sec);
printf("%d\n",cost);
}
else
{
time1 = localtime(&p->T1);
cost = difftime(p->T2,p->T1);
printf("查询信息如下:\n");
printf("车牌号 是否在场内 入场时间 出场时间 停留时间(s)\n");
printf("%s %s ",p->plate,p->sit);
printf("%d.%d.%d ",time1->tm_hour,time1->tm_min,time1->tm_sec); // 入时
time2 = localtime(&p->T2);
printf("%d.%d.%d ",time2->tm_hour,time2->tm_min,time2->tm_sec); // 出时
printf("%d\n",cost);
}
break;
}
p = p->next;
}
if(p == NULL)
{
printf("%s 没有来过此车场\n",nam);
}
return SUCCESS;
}
int all_car(L *l) // 查询出入记录
{
L *p,*r;
time_t t;
int cost;
struct tm *time1;
struct tm *time2;
p = r = l->next;
if(NULL == l)
{
return FAILURE;
}
if(p == NULL)
{
printf("没有车辆出入信息");
return SUCCESS;
}
printf("在场内车辆信息如下:\n");
printf("车牌号 入场时间(h.m.s) 停留时间(s)\n");
while(p)
{
if(strcmp(p->sit,"在场内") == 0)
{
time(&t);
time1 = localtime(&p->T1);
cost = difftime(t,p->T1);
printf("%s ",p->plate);
printf("%d.%d.%d ",time1->tm_hour,time1->tm_min,time1->tm_sec);
printf("%d\n",cost);
}
p = p->next;
}
printf("已经离开车辆信息如下:\n");
printf("车牌号 入场时间 出场时间 停留时间(s)\n");
while(r)
{
if(strcmp(r->sit,"已离开") == 0)
{
time1 = localtime(&r->T1);
cost = difftime(r->T2,r->T1);
printf("%s ",r->plate);
printf("%d.%d.%d ",time1->tm_hour,time1->tm_min,time1->tm_sec); // 入时
time2 = localtime(&r->T2);
printf("%d.%d.%d ",time2->tm_hour,time2->tm_min,time2->tm_sec); // 出时
printf("%d\n",cost);
}
r = r->next;
}
return SUCCESS;
}
int car_park(L *l) // 查询场内车辆信息
{
int cost;
struct tm *time1;
time_t t;
L *p = l->next;
if(NULL == l)
{
return FAILURE;
}
printf("停车场内所有车辆信息如下:\n");
printf("车牌号 入 场 时 间 停留时间(s)\n");
while(p)
{
time(&t);
cost = difftime(t,p->T1);
time1 = localtime(&p->T1);
if(strcmp(p->sit,"在场内") == 0)
{
printf(" %s %d.%d.%d %d\n",p->plate,time1->tm_hour,time1->tm_min,time1->tm_sec,cost);
}
p = p->next;
}
return SUCCESS;
}
int car_wait(Q *q) // 查询等候车辆信息
{
if(NULL == q)
{
return FAILURE;
}
node *p = q->front->next;
printf("等待的车辆车牌号有:\n");
while(p)
{
printf("%s\n",p->plate);
p = p->next;
}
return SUCCESS;
}