停车场项目需求
问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
(2)输入数据模拟管理过程,数据(入或出,车号)
.
功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
查询场内车辆信息、查询等候车辆信息、退出系统。
(1)linux系统编写(链表、栈、队列);
(2)进车登记:登记车牌号以及入场时间;
(3)出车登记:计算出停车时间,记录车辆车牌;
(4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场
(5)查询出入记录:所有车辆,包括已经离开的
(6)查询场内车辆信息:列出所有场内车辆信息
(7)查询以及所有车牌号
(8)退出系统。
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
#define maxsize 3
typedef int ElemType;
/**************************链表*******************************/
struct node
{
int carnum;
int timecome;
int timeleft;
struct node *next;
};
typedef struct node Node;
typedef Node *LinkList;
void ListInit(LinkList *L);
void ListInsert(LinkList *L,ElemType a,ElemType b);
void ListDelete(LinkList L,ElemType a,ElemType b);
void ListTraverse(LinkList L);
/***********************************************************************/
/****************************链栈**************************************/
struct stacknode
{
int number;
struct stacknode *next;
};
typedef struct stacknode StackNode;
typedef StackNode* LinkNode;
struct stack
{
LinkNode top;
int count;
};
typedef struct stack Stack;
void StackInit(Stack **s);
void StackPush(Stack *s,ElemType e);
int GetTop(Stack *s);
int StackPop(Stack *s);
int StackLength(Stack *s);
/***************************************************************/
/****************************顺序队列********************************/
struct queue
{
ElemType data[maxsize];
int front;
int rear;
};
typedef struct queue SeQueue;
void QueueInit(SeQueue *sq);
void InQueue(SeQueue *sq,ElemType e);
int OutQueue(SeQueue *sq);
int QueueLength(SeQueue sq);
/**************************************************************/
#endif
/**********************链表功能函数*************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"LinkList.h"
void ListInit(LinkList *L)
{
(*L)=(LinkList)malloc(sizeof(Node));
if(NULL == (*L))
{
printf("ListInit fail\n");
}
(*L)->next=NULL;
}
void ListInsert(LinkList *L,ElemType a,ElemType b)
{
LinkList p=(*L);
LinkList n=(LinkList)malloc(sizeof(Node));
if(NULL == n)
{
printf("ListInsert failure!\n");
}
n->carnum = a;
n->timecome = b;
n->next=p->next;
p->next=n;
}
void ListTraverse(LinkList L)
{
LinkList p = L->next;
if(NULL == p)
{
printf("no record\n");
}
else
{
printf("car number cometime lefttime\n");
while(p)
{
printf("%5d %10d %10d\n",p->carnum,p->timecome,p->timeleft);
p = p->next;
}
}
}
void ListDelete(LinkList L,ElemType a,ElemType b)
{
LinkList p=(L);
while(p->carnum != a)
{
p = p->next;
if(p->carnum == a)
{
p->timeleft = b;
}
}
}
/********************************链栈功能函数***************************/
#include<stdio.h>
#include<stdlib.h>
#include"LinkList.h"
void StackInit(Stack **s)
{
(*s)=(Stack *)malloc(sizeof(Stack));
if(NULL == (*s))
{
printf("StackInit Fail\n");
}
(*s)->top = NULL;
(*s)->count = 0;
}
void StackPush(Stack *s,ElemType e)
{
StackNode *p = (StackNode *)malloc(sizeof(StackNode));
if(NULL == p)
{
printf("StackPush fail\n");
}
p->number=e;
p->next = s->top;
s->top = p;
s->count++;
}
int StackLength(Stack *s)
{
return s->count;
}
int GetTop(Stack *s)
{
if(NULL == s->top)
{
printf("Stack Get Top Fail!\n");
}
int e;
e = s->top->number;
return e;
}
int StackPop(Stack *s)
{
if(NULL == s->top)
{
printf("Stack Pop fail!\n");
}
LinkNode p;
int e;
p = s->top;
s->top = p->next;
e = p->number;
free(p);
s->count--;
return e;
}
/******************************顺序队列功能函数*******************************/
#include<stdio.h>
#include"LinkList.h"
void QueueInit(SeQueue *s)
{
s->rear = s->front = 0;
}
void InQueue(SeQueue *s,ElemType e)
{
if((s->rear +1)%maxsize == s->front)
{
printf("full\n");
}
else
{
s->data[s->rear] = e;
s->rear = (s->rear + 1)%maxsize;
}
}
int QueueLength(SeQueue s)
{
return ((s.rear - s.front + maxsize)%maxsize);
}
int OutQueue(SeQueue *s)
{
ElemType e;
if(s->rear == s->front)
{
printf("OutQueue failure\n");
}
e = s->data[s->front];
s->front = (s->front + 1)%maxsize;
return e;
}
/********************************主函数***********************************/
#include<stdio.h>
#include<stdlib.h>
#include"LinkList.h"
int StackTraverse(Stack *s)
{
LinkNode p;
p = s->top;
if(NULL == s->top)
{
printf("no car inside!\n");
}
else
{ printf("car number\n");
while(p != NULL)
{
printf("%5d\n",p->number);
p = p->next;
}
}
}
void QueueTraverse(SeQueue s)
{
ElemType e;
int i=0;
if(s.data[s.front]==s.data[s.rear])
{
printf("no car wait here!\n");
}
else
{
printf("%d car are waiting for:\n",QueueLength(s));
while(i<QueueLength(s))
{
e = s.data[s.front + i];
printf("%d\n",e);
i++;
}
}
}
int main()
{
int t=0;
int number,cometime,lefttime,stoptime,cost,ti;
int num,i,j,find,mada;
LinkList list;
ListInit(&list);
Stack *stop;
StackInit(&stop);
Stack *road;
StackInit(&road);
SeQueue wait;
QueueInit(&wait);
do
{
printf("----------------------------------\n");
printf("| 1.in register |\n");
printf("----------------------------------\n");
printf("----------------------------------\n");
printf("| 2.out register |\n");
printf("----------------------------------\n");
printf("----------------------------------\n");
printf("| 3.find car |\n");
printf("----------------------------------\n");
printf("----------------------------------\n");
printf("| 4.access records |\n");
printf("----------------------------------\n");
printf("----------------------------------\n");
printf("| 5.list car(inside) |\n");
printf("----------------------------------\n");
printf("----------------------------------\n");
printf("| 6.list car(wait) |\n");
printf("----------------------------------\n");
printf("----------------------------------\n");
printf("| 7.exit |\n");
printf("----------------------------------\n");
printf("Please input your choice:\n");
scanf("%d",&num);
switch(num)
{
case 1:
if(StackLength(stop)<3)
{
printf("Please input carnumber:\n");
scanf("%d",&number);
printf("Please input cometime:\n");
scanf("%d",&cometime);
printf("car number come time\n");
printf("%5d %10d\n ",number,cometime);
ListInsert(&list,number,cometime);
StackPush(stop,number);
}
else
{
printf("the parking lot is full!\n");
if(QueueLength(wait)<maxsize)
{
printf("would you like to wait?\n");
printf(" (1) YES (2)NO\n");
scanf("%d",&i);
switch(i)
{
case 1:
printf("Please input carnumber:\n");
scanf("%d",&j);
InQueue(&wait,j);
break;
case 2:
printf("You say : fuck you\n");
break;
}
}
else
{
printf("the waiting place is full!\n");
}
}
break;
case 2:
if(0 == StackLength(stop))
{
printf("there is no car here!\n");
}
else
{
printf("Please input car number:\n");
scanf("%d",&number);
while(number != GetTop(stop))
{
StackPush(road,StackPop(stop));
}
if(number == GetTop(stop))
{
printf("Please input leave time:\n");
scanf("%d",&lefttime);
printf("car number stoptime money\n");
LinkList t = list;
while(t->carnum != number)
{
t=t->next;
}
if(t->carnum == number)
{
ti=t->timecome;
}
stoptime=lefttime-ti;
cost = stoptime * 15;
printf("%d %10d %10d\n",number,stoptime,cost);
ListDelete(list,number,lefttime);
StackPop(stop);
}
while(StackLength(road)!=0)
{
StackPush(stop,StackPop(road));
}
if(StackLength(stop)<3)
{
if(QueueLength(wait)!=0)
{
mada=OutQueue(&wait);
StackPush(stop,mada);
ListInsert(&list,mada,lefttime);
}
}
}
break;
case 3:
printf("Please input car number!\n");
scanf("%d",&find);
LinkList p = list->next;
LinkNode q = stop->top;
if(NULL == p)
{
printf("this is a new lot!\n");
}
else
{
while(p!=NULL && p->carnum != find)
{
p = p->next;
if(NULL == p)
{
printf("this car never come here!\n");
}
}
if(p!=NULL && p->carnum == find)
{
printf("this car came here!\n");
if(p->timeleft)
{
printf("this car stop %d hour.\n",p->timeleft - p->timecome);
}
if(q!=NULL)
{
while(q!=NULL && q->number != find)
{
q = q->next;
if(q == NULL)
{
printf("this car has left!\n");
}
if(q!=NULL && q->number == find)
{
printf("this car is stil here!\n");
if(p->timeleft)
{
printf("this car stop %d hour.\n",p->timeleft - p->timecome);
}
}
}
}
else
{
printf("this car has left!\n");
}
}
}
break;
case 4:
ListTraverse(list);
break;
case 5:
StackTraverse(stop);
break;
case 6:
QueueTraverse(wait);
break;
case 7:
t=1;
break;
default:
printf("error!!!\n");
return ;
}
}while(!t);
return 0;
}