停车场项目需求
问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门
外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车
要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
(2)输入数据模拟管理过程,数据(入或出,车号)
功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
查询场内车辆信息、查询等候车辆信息、退出系统。
(1)linux系统编写(链表、栈、队列);
(2)进车登记:登记车牌号以及入场时间;
(3)出车登记:计算出停车时间,记录车辆车牌;
(4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场
(5)查询出入记录:所有车辆,包括已经离开的
(6)查询场内车辆信息:列出所有场内车辆信息
(7)查询等候车辆信息:显示等候车辆数量以及所有车牌号
(8)退出系统。
分析,底层需要写以下内容:
两个栈,停放栈(车牌号,出场时间,入场时间)[初始化,判断是否为空,出栈,入栈,查栈] 让路栈(车牌号)[初始化,出栈,入栈,判断是否为空]
一个队列,[初始化,出队列,入队列](车牌号)
一个链表,(车牌号,出入厂状态,入场时间,出场时间)[初始化,入链表,查找数据,遍历打印]
Windows下代码
工程分为三个文件,分别是main.c fun.c pack.h
main.c:
#include<stdio.h>
#include"park.h"
#include<stdlib.h>
#include<time.h>
#include<string.h>
/*
main函数
功能:显示界面,判断用户要使用哪个功能。
入参:无
返回值:无
*/
void main()
{
int ret=0;
char number[10];
park_init();
//所有数据结构初始化
//存放用户输入的字符
while(1)
{
/*显示界面*/
printf("################## 停车场 v1.0 ##################\n");
printf("# #\n");
printf("#####################################################################\n");
printf("# #\n");
printf("# 1-----------------进车登记------------------- #\n");
printf("# #\n");
printf("# 2-----------------出车登记------------------- #\n");
printf("# #\n");
printf("# 3-----------------车辆查询------------------- #\n");
printf("# #\n");
printf("# 4-----------------出入记录------------------- #\n");
printf("# #\n");
printf("# 5-----------------场内车辆------------------- #\n");
printf("# #\n");
printf("# 6-----------------等候车辆------------------- #\n");
printf("# #\n");
printf("# 7-----------------退出系统------------------- #\n");
printf("# #\n");
printf("#####################################################################\n");
printf("# 201808 #\n");
printf("#####################################################################\n");
gets( number );
switch ( *number ) //选择需要什么功能
{
case '1': //进车登记
{
system("cls");
ret=car_in();
if(ret==FAILURE)
{
printf("输入错误!");
}
printf("入车成功!\n");
getchar();
system("cls");
}
break;
case '2': //出车登记
{
system("cls");
ret=car_out();
if(ret==FAILURE)
{
printf("输入错误!\n");
}
printf("出车成功!\n");
getchar();
system("cls");
}
break;
case '3': //查找车辆
{
system("cls");
ret=find_car();
if(ret==FAILURE)
{
printf("输入错误!\n");
}
//printf("-------------------------------------------------------------------------------------------------------------");
getchar();
system("cls");
}
break;
case '4': //出入记录
{
system("cls");
ret=record_all();
if(ret==FAILURE)
{
printf("输入错误!\n");
}
getchar();
system("cls");
}
break;
case '5': //场内车辆
{
system("cls");
ret=car_park();
if(ret==FAILURE)
{
printf("输入错误!\n");
}
getchar();
system("cls");
}
break;
case '6':
{
system("cls");
//等候车辆
ret=Car_wait();
if(ret==FAILURE)
{
printf("输入错误!\n");
}
getchar();
system("cls");
}
break;
case '7':
printf("欢迎下次使用\n");
break;
default:
system("cls");
printf( "操作错误,此项不存在!\n" );
getchar();
system("cls");
break;
}
if ( strcmp( number, "7" ) == 0 )
break;
}
}
park.h
#ifndef _PARK_H
#define _PAEK_H
#include <time.h>
#include <stdio.h>
#define SUCCESS 10000
#define FAILURE 10001
#define TRUE 10002
#define FALSE 10003
#define SIZE 6 //车场大小
/*汽车信息,节点结构体
*/
struct car_info
{
char name[10];
// 车牌
time_t time1;
// 入场时间
time_t time2;
// 出场时间
}
;
typedef struct car_info CAR_I;
/*停放,让路顺序栈结构体
需要的参数为 :车牌号,出场时间,入场时间
配套的子函数 :初始化,判断是否为空,出栈,入栈,查栈*/
struct sequencestack
{
int top;
CAR_I *date;
}
;
typedef struct sequencestack ST;
/*队列节点结构体
需要的参数为 :车牌号,下一个节点地址
*/
struct car_wait
{
char name[10];
struct car_wait *next;
}
;
typedef struct car_wait CAR_W;
/*等候链式队列结构
需要的参数为 :头指针,尾指针
配套的子函数 :初始化,出队列,入队列
*/
struct linkqueue
{
CAR_W *front;
CAR_W *rear;
}
;
typedef struct linkqueue LQ;
/*存放所有信息的链表
需要的参数为:车牌号,出入厂状态,入场时间,出场时间,下一个节点的地址
需要的函数为:初始化,入链表,查找数据,遍历打印
*/
struct all_info
{
char name[10];
char sit[10];
time_t time1;
// 入场时间
time_t time2;
// 出场时间
struct all_info *next;
}
;
typedef struct all_info A_INFO;
int car_in();
int car_out();
int find_car();
int record_all();
int car_park();
int Car_wait();
int STinit(ST **q);
int STempty(ST *q);
int STinsert(ST *q, char na[] ,time_t time);
int STout(ST *q,char *a, time_t *time);
int LQinit(LQ **q);
int LQinsert(LQ *q, char na[]);
int LQout(LQ *q, char *a);
int LLinit(A_INFO **q);
int LLinsert(A_INFO *q, int n, char na[], char s[], time_t timeA, time_t timeB);
int LLfind(A_INFO *q, char na[]);
int LLget(A_INFO *q, int n, A_INFO **k);
int LLtra(A_INFO *q);
int parkadd(CAR_I car[], char na[], time_t time);
int parkdel(CAR_I car[] ,char na[],time_t time);
int print(CAR_I car[]);
int park_init();
struct tm * local_time(time_t *tmpcal_ptr);
int exchange(A_INFO *q, char na[], char s[]);
#endif
fun.c
#include<stdio.h>
#include"park.h"
#include<stdlib.h>
#include<time.h>
#include<string.h>
int num = 0;
//场内车辆数
ST *stack_park;
//停放栈
ST *stack_exchange;
//交换栈
LQ *queue_wait;
//等候队列
A_INFO *all_car;
//存放所有信息的链表
/*
顺序栈初始化:
参数:结构体指针
*/
int STinit(ST **q)
{
if(q == NULL)
{
return FAILURE;
}
*q = (ST *)malloc(sizeof(ST)*1);
//为结构体指针分配空间
(*q)->top = -1;
(*q)->date = (CAR_I *)malloc(sizeof(CAR_I)*SIZE);
//为内容指针分配空间
return SUCCESS;
}
/*
顺序栈判断是否为空
参数:结构体指针
*/
int STempty(ST *q)
{
if(q == NULL)
{
return FAILURE;
}
return(q->top == -1)? TRUE:FALSE;
//空返回true 不空返回false
}
/*
顺序栈入栈
参数:结构体指针,车牌,入场时间
*/
int STinsert(ST *q, char na[] ,time_t time)
{
if(q == NULL || q->top >= SIZE-1)
{
return FAILURE;
}
strcpy( q->date[q->top+1].name, na );
q->date[q->top+1].time1 = time;
q->top++;
return SUCCESS;
}
/*
结构体出栈
参数:结构体指针,保存车牌的形参,保存入场时间的结构体指针
*/
int STout(ST *q,char *a, time_t *time)
{
if(q == NULL)
{
return FAILURE;
//错误返回failure
}
if(q->top == -1)
{
return FALSE;
//空返回false
}
strcpy(a, q->date[q->top].name);
//a被修改为出场的车牌
*time = q->date[q->top].time1;
//time被修改为入场时间
q->top--;
return SUCCESS;
}
/*
链式队列初始化
参数:队列的结构体指针
*/
int LQinit(LQ **q)
{
CAR_W (*p);
(*q) = (LQ *)malloc(sizeof(LQ));
if( (*q) == NULL )
{
return FAILURE;
}
p = (CAR_W *)malloc(sizeof(CAR_W));
if(p == NULL)
{
return FAILURE;
}
p->next = NULL;
(*q)->front = (*q)->rear =p;
return SUCCESS;
}
/*
链式队列入队
参数:队列的结构体指针,车牌
*/
int LQinsert(LQ *q, char na[])
{
CAR_W *p;
if (NULL == q)
{
return FAILURE;
}
p = (CAR_W *)malloc(sizeof(CAR_W));
if (NULL == p)
{
return FAILURE;
}
strcpy(p->name, na);
p->next = NULL;
q->rear->next = p;
q->rear = p;
return SUCCESS;
}
/*
链式队列出队
参数:队列结构体指针
*/
int LQout(LQ *q, char *a)
{
// char na[10];
CAR_W *p = q->front->next;
if (NULL == q )
{
return FAILURE;
}
if(q->rear == q->front)
{
return FALSE;
}
strcpy(a, p->name);
q->front->next = p->next;
if (NULL == p->next)
{
q->rear = q->front;
//用参数a保存出去的车牌
}
free(p);
return SUCCESS;
}
/*
链表初始化
参数:头指针
*/
int LLinit(A_INFO **q)
{
(*q) = (A_INFO *)malloc(sizeof(A_INFO));
if( (*q) == NULL)
{
return FAILURE;
}
(*q)->next = NULL;
return SUCCESS;
}
/*
链表插入(头插)
参数:头指针,插入的位置(1), 车牌, 状态, 入场时间, 出场时间
*/
int LLinsert(A_INFO *q, int n, char na[], char s[], time_t timeA, time_t timeB)
{
A_INFO *l;
A_INFO *p = q;
int k = 1;
if (NULL == q)
{
return FAILURE;
}
while(k < n && p != NULL)
{
p=p->next;
k++;
}
if(k > n || p == NULL)
{
return FAILURE;
}
l = (A_INFO *)malloc(sizeof(A_INFO)*1);
if (NULL == l)
{
return FAILURE;
}
strcpy(l->name, na);
strcpy(l->sit ,s);
l->time1 = timeA;
l->time2 = timeB;
l->next = p->next;
p->next = l;
return SUCCESS;
}
/*
链表定位
参数: 头指针,车牌
*/
int LLfind(A_INFO *q, char na[])
{
A_INFO *p;
int len;
if (NULL == q)
{
return FAILURE;
}
p = q->next;
len = 1;
while(p)
{
if(strcmp(p->name, na) == 0)
{
return len;
//找到返回位置
}
p = p->next;
len++;
}
return FALSE;
//未找到返回false
}
/*
链表查询
参数:头指针,位置
*/
int LLget(A_INFO *q, int n, A_INFO **k)
{
int i;
A_INFO *p = q;
if (NULL == q)
{
return FAILURE;
}
for (i = 0; i < n && p != NULL ; i++)
{
p = p->next;
}
if(!p)
{
return FAILURE;
}
(*k) = p;
//用k指针保存找到的结构体地址
return SUCCESS;
}
/*
链表遍历
参数:头指针
*/
int LLtra(A_INFO *q)
{
double cost;
struct tm *time1;
struct tm *time2;
time_t timenow;
A_INFO *p;
if (NULL == q)
{
return FAILURE;
}
p = q;
while (p->next)
{
p = p->next;
////////////////////记得改这里
time1 = local_time(&p->time1);
if(time1 != NULL)
{
printf("车牌:%s 状态:%s 入场时间:%d:%d:%d",p->name,p->sit, time1->tm_hour, time1->tm_min, time1->tm_sec);
time2 = local_time(&p->time2);
if(time2 != NULL)
{
cost = difftime(p->time2,p->time1);
printf(" 出场时间:%d:%d:%d", time2->tm_hour, time2->tm_min, time2->tm_sec);
printf(" 停车时间:%f秒\n",cost);
printf("-------------------------------------------------------------------------------------------------------------\n");
} else
{
time(&timenow);
cost = difftime(timenow,p->time1);
printf(" 停车时间为:%f秒\n" ,cost);
printf("-------------------------------------------------------------------------------------------------------------\n");
//return