停车场项目需求
问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门
外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车
要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
(2)输入数据模拟管理过程,数据(入或出,车号)
功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
查询场内车辆信息、查询等候车辆信息、退出系统。
(1)linux系统编写(链表、栈、队列);
(2)进车登记:登记车牌号以及入场时间;
(3)出车登记:计算出停车时间,记录车辆车牌;
(4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场
(5)查询出入记录:所有车辆,包括已经离开的
(6)查询场内车辆信息:列出所有场内车辆信息
(7)查询等候车辆信息:显示等候车辆数量以及所有车牌号
(8)退出系统。
//头文件
#ifndef _PARK_H_
#define _PARK_H_
#define MAXSIZE 2
#define FAILURE 10001
struct node
{
char id[20];
int month,day,hour,min,sec;
time_t start,end;
char info[10];
struct node *next;
};
typedef struct node Node;
typedef Node *LinkNode;
struct stack
{
LinkNode top;
int count;
};
typedef struct stack Stack;
struct queue
{
LinkNode front;
LinkNode rear;
int flag;
};
typedef struct queue Queue;
int settime(LinkNode n,time_t t);
int timecopy(LinkNode n, LinkNode p);
int InitStack(Stack *L);
int InitQueue(Queue *S);
int EnQueue(Queue *S, LinkNode i);
int EnStack(Stack *L, LinkNode i);
int EnCar(Stack *L, Queue *S, Queue *T);
int OutCar(Stack *L, Stack *P, Queue *S, Queue*T);
int Encar2(Stack *L, LinkNode S, Queue *T);
int SearchInfo(Stack L, Queue T);
int ShowInfo(Queue T);
int EnInfo(Stack L);
int WaitInfo(Queue S);
#endif
//接口函数
#include <stdio.h>
#include <stdlib.h>
#include "park.h"
#include <time.h>
#include <string.h>
int settime(LinkNode n,time_t t)
{
struct tm *pt;
time(&t);
pt = localtime(&t);
n->month = pt->tm_mon;
n->day = pt->tm_mday;
n->hour = pt->tm_hour;
n->min = pt->tm_min;
n->sec = pt->tm_sec;
}//设置时钟
int timecopy(LinkNode n, LinkNode p)
{
n->start = p->start;
n->month = p->month;
n->day = p->day;
n->hour = p->hour;
n->min = p->min;
n->sec = p->sec;
}//取时
int InitStack(Stack *L)
{
L->top = NULL;
L->count = 0;
}//初始化栈
int InitQueue(Queue *S)
{
S->front = (LinkNode)malloc(sizeof(Node));
S->rear = S->front;
S->rear->next = NULL;
S->flag = 0;
}//初始化队列
int EnQueue(Queue *S,LinkNode i)
{
S->rear->next = i;
S->rear = i;
i->next = NULL;
S->flag++;
}//进队
int EnStack(Stack *L, LinkNode i)
{
i->next = L->top;
L->top = i;
L->count++;
}//进栈
int EnCar(Stack *L, Queue *S, Queue *T)
{
time_t t;
struct tm *pt;
LinkNode n = (LinkNode)malloc(sizeof(Node));
LinkNode m = (LinkNode)malloc(sizeof(Node));
printf("\t\t\t\t");
printf("收费说明:每秒0.5元\n");
printf("\t\t\t\t");
printf("请您输入停车信息(车牌号):\n");
printf("\t\t\t\t");
scanf("%s",n->id);
if(L->count >= MAXSIZE)
{
printf("\t\t\t\t");
printf("停车场已满,请在队列等待。\n");
EnQueue(S,n);
return FAILURE;
}
time(&t);
n->start = t;
pt = localtime(&t);
settime(n,t);
printf("\t\t\t\t现在是%d月%d日%d时%d分%d秒\n",n->month,n->day,n->hour,n->min,n->sec);
timecopy(m,n);
strcpy(m->info,"Parking!");
strcpy(m->id, n->id);
EnQueue(T,m);
EnStack(L,n);
printf("\t\t\t\t");
printf("停车成功!\n");
}//入库
int OutCar(Stack *L, Stack *P, Queue *S,Queue *T)
{
long int ti;
LinkNode m = (LinkNode)malloc(sizeof(Node));
time_t t;
struct tm *pt;
char i[20];
printf("\t\t\t\t输入您的车牌号:\n");
printf("\t\t\t\t");
scanf("%s",i);
while(L->top)
{
LinkNode p= L->top;
if(strcmp((p->id),i) == 0)
{
break;
}
L->top = p->next;
EnStack(P,p);
}
if(L->top == NULL)
{
while(P->top)
{
LinkNode k = P->top;
P->top = k->next;
EnStack(L,k);
}
printf("\t\t\t\t此车不在停车场中!\n");
return 0;
}
LinkNode l = L->top;
time(&t);
l->end = t;
pt = localtime(&t);
settime(l,t);
ti = l->end - l->start;
printf("\t\t\t\t时间%d月%d日%d时%d分%d秒\n",l->month,l->day,l->hour,l->min,l->sec);
printf("\t\t\t\t停车总时长:%d 秒\n", ti);
printf("\t\t\t\t总共应收费:%d元\n", ti/2);
printf("\t\t\t\t********************************\n\n");
timecopy(m,l);
strcpy(m->info,"Left! ");
strcpy(m->id, l->id);
EnQueue(T,m);
L->top = l->next;
free(l);
L->count--;
while(P->top)
{
LinkNode k = P->top;
P->top = k->next;
EnStack(L,k);
}
if((S->flag) > 1)
{
printf("\t\t\t\t通知:队列%s可以停车!\n",S->front->next->id);
LinkNode j = S->front->next;
S->front->next = j->next;
Encar2(L,j,T);
S->flag--;
return;
}
else if(S->flag == 1)
{
printf("\t\t\t\t通知:等候的车辆%s可以进场停车!\n",S->front->next->id);
LinkNode j = S->front->next;
S->front->next = j->next;
S->rear = S->front;
Encar2(L,j,T);
S->flag--;
return 0;
}
else
return;
}//出库
int Encar2(Stack *L, LinkNode S, Queue *T)
{
LinkNode m = (LinkNode)malloc(sizeof(Node));
time_t t;
struct tm *pt;
printf("\t\t\t\t");
printf("收费说明:每秒0.5元\n");
time(&t);
S->start = t;
pt = localtime(&t);
settime(S,t);
printf("\t\t\t\t现在是%d月%d日%d时%d分%d秒\n",S->month,S->day,S->hour,S->min,S->sec);
timecopy(m,S);
strcpy(m->info,"Parking!");
strcpy(m->id, S->id);
EnQueue(T,m);
EnStack(L,S);
printf("\t\t\t\t停车成功!\n");
}//队列车入库
int SearchInfo(Stack L, Queue T)
{
char n[10];
printf("\t\t\t\t请输入查询的车牌号:\n");
printf("\t\t\t\t");
scanf("%s",n);
LinkNode p = T.front->next;
while(p)
{
if(strcmp(p->id,n) == 0)
{
break;
}
p = p->next;
}
if(p == NULL)
{
printf("\t\t\t\t此车没来过停车场!\n");
return;
}
LinkNode l = p;
printf("\t\t\t\t该车尚未离开\n");
printf("\t\t\t\t车牌号: %s 车辆信息: %s 时间:%d月%d日%d时%d分%d秒\n",l->id,l->info,l->month,l->day,l->hour,l-
>min,l->sec);
p = p->next;
if(p != NULL)
{
while(p)
{
if(strcmp(p->id,n) == 0)
{
break;
}
p = p->next;
}
printf("\t\t\t\t该车尚未离开\n");
printf("\t\t\t\t车牌号: %s 车辆信息: %s 时间:%d月%d日%d时%d分%d秒\n",p->id,p->info,p->month,p->day,p-
>hour,p->min,p->sec);
}
LinkNode q = L.top;
while(q)
{
if(strcmp(q->id,n) == 0)
{
printf("\t\t\t\t该车尚未离开\n");
break;
}
q = q->next;
}
if(q == NULL)
{
printf("\t\t\t\t该车已经离开!\n");
}
}//车牌查询信息
int ShowInfo(Queue T)
{
if(T.front->next == NULL)
{
printf("\t\t\t\t信息为空!\n");
return;
}
LinkNode q = T.front->next;
while(q)
{
printf("\t\t\t\t车牌号: %s 车辆信息: %s 时间:%d月%d日%d时%d秒%d秒\n",q->id,q->info,q->month,q->day,q-
>hour,q->min,q->sec);
q = q->next;
}
}//出入信息
int EnInfo(Stack L)
{
LinkNode p = L.top;
while(p != NULL)
{
printf("\t\t\t\t");
printf("车牌号: %s 开始停车时间:%d月%d日%d时%d分%d秒\n",p->id,p->month,p->day,p->hour,p->min,p->sec);
p = p->next;
}
}//库内车辆信息
int WaitInfo(Queue S)
{
printf("\t\t\t\t");
printf("现在有 %d 辆车在等待:\n",S.flag);
if(S.flag == 0)
{
return 0;
}
LinkNode p = S.front;
while(p->next != NULL)
{
printf("\t\t\t\t");
printf("车牌号: %s\n",p->next->id);
p = p->next;
}
}//等待队列
//主函数
#include <stdio.h>
#include <stdlib.h>
#include "park.h"
void Print()
{
printf("\t\t\t\t*******************************************************\n");
printf("\t\t\t\t****1.进车登记 2.出车登记 ****\n");
printf("\t\t\t\t****3.查询车辆信息 4.查询出入记录 ****\n");
printf("\t\t\t\t****5.查询场内车辆信息 6.查询等候车辆信息****\n");
printf("\t\t\t\t****7.退出系统 \n");
printf("\t\t\t\t*******************************************************\n");
}
int main()
{
Stack in,tmp;
Queue wait,record;
InitQueue(&record);
InitStack(&in);
InitStack(&tmp);
InitQueue(&wait);
int choice;
while(1)
{
Print();
printf("\t\t\t\t请选择功能\n");
printf("\t\t\t\t");
scanf("%d",&choice);
switch(choice)
{
case 1:
EnCar(&in,&wait,&record);
break;
case 2:
OutCar(&in,&tmp,&wait,&record);
break;
case 3:
SearchInfo(in,record);
break;
case 4:
ShowInfo(record);
break;
case 5:
EnInfo(in);
break;
case 6:
WaitInfo(wait);
break;
case 7:
exit(1);
break;
default:
printf("\t\t\t\t无效操作!\n");
}
}
return 0;
}
问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门
外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车
要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
(2)输入数据模拟管理过程,数据(入或出,车号)
功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
查询场内车辆信息、查询等候车辆信息、退出系统。
(1)linux系统编写(链表、栈、队列);
(2)进车登记:登记车牌号以及入场时间;
(3)出车登记:计算出停车时间,记录车辆车牌;
(4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场
(5)查询出入记录:所有车辆,包括已经离开的
(6)查询场内车辆信息:列出所有场内车辆信息
(7)查询等候车辆信息:显示等候车辆数量以及所有车牌号
(8)退出系统。
//头文件
#ifndef _PARK_H_
#define _PARK_H_
#define MAXSIZE 2
#define FAILURE 10001
struct node
{
char id[20];
int month,day,hour,min,sec;
time_t start,end;
char info[10];
struct node *next;
};
typedef struct node Node;
typedef Node *LinkNode;
struct stack
{
LinkNode top;
int count;
};
typedef struct stack Stack;
struct queue
{
LinkNode front;
LinkNode rear;
int flag;
};
typedef struct queue Queue;
int settime(LinkNode n,time_t t);
int timecopy(LinkNode n, LinkNode p);
int InitStack(Stack *L);
int InitQueue(Queue *S);
int EnQueue(Queue *S, LinkNode i);
int EnStack(Stack *L, LinkNode i);
int EnCar(Stack *L, Queue *S, Queue *T);
int OutCar(Stack *L, Stack *P, Queue *S, Queue*T);
int Encar2(Stack *L, LinkNode S, Queue *T);
int SearchInfo(Stack L, Queue T);
int ShowInfo(Queue T);
int EnInfo(Stack L);
int WaitInfo(Queue S);
#endif
//接口函数
#include <stdio.h>
#include <stdlib.h>
#include "park.h"
#include <time.h>
#include <string.h>
int settime(LinkNode n,time_t t)
{
struct tm *pt;
time(&t);
pt = localtime(&t);
n->month = pt->tm_mon;
n->day = pt->tm_mday;
n->hour = pt->tm_hour;
n->min = pt->tm_min;
n->sec = pt->tm_sec;
}//设置时钟
int timecopy(LinkNode n, LinkNode p)
{
n->start = p->start;
n->month = p->month;
n->day = p->day;
n->hour = p->hour;
n->min = p->min;
n->sec = p->sec;
}//取时
int InitStack(Stack *L)
{
L->top = NULL;
L->count = 0;
}//初始化栈
int InitQueue(Queue *S)
{
S->front = (LinkNode)malloc(sizeof(Node));
S->rear = S->front;
S->rear->next = NULL;
S->flag = 0;
}//初始化队列
int EnQueue(Queue *S,LinkNode i)
{
S->rear->next = i;
S->rear = i;
i->next = NULL;
S->flag++;
}//进队
int EnStack(Stack *L, LinkNode i)
{
i->next = L->top;
L->top = i;
L->count++;
}//进栈
int EnCar(Stack *L, Queue *S, Queue *T)
{
time_t t;
struct tm *pt;
LinkNode n = (LinkNode)malloc(sizeof(Node));
LinkNode m = (LinkNode)malloc(sizeof(Node));
printf("\t\t\t\t");
printf("收费说明:每秒0.5元\n");
printf("\t\t\t\t");
printf("请您输入停车信息(车牌号):\n");
printf("\t\t\t\t");
scanf("%s",n->id);
if(L->count >= MAXSIZE)
{
printf("\t\t\t\t");
printf("停车场已满,请在队列等待。\n");
EnQueue(S,n);
return FAILURE;
}
time(&t);
n->start = t;
pt = localtime(&t);
settime(n,t);
printf("\t\t\t\t现在是%d月%d日%d时%d分%d秒\n",n->month,n->day,n->hour,n->min,n->sec);
timecopy(m,n);
strcpy(m->info,"Parking!");
strcpy(m->id, n->id);
EnQueue(T,m);
EnStack(L,n);
printf("\t\t\t\t");
printf("停车成功!\n");
}//入库
int OutCar(Stack *L, Stack *P, Queue *S,Queue *T)
{
long int ti;
LinkNode m = (LinkNode)malloc(sizeof(Node));
time_t t;
struct tm *pt;
char i[20];
printf("\t\t\t\t输入您的车牌号:\n");
printf("\t\t\t\t");
scanf("%s",i);
while(L->top)
{
LinkNode p= L->top;
if(strcmp((p->id),i) == 0)
{
break;
}
L->top = p->next;
EnStack(P,p);
}
if(L->top == NULL)
{
while(P->top)
{
LinkNode k = P->top;
P->top = k->next;
EnStack(L,k);
}
printf("\t\t\t\t此车不在停车场中!\n");
return 0;
}
LinkNode l = L->top;
time(&t);
l->end = t;
pt = localtime(&t);
settime(l,t);
ti = l->end - l->start;
printf("\t\t\t\t时间%d月%d日%d时%d分%d秒\n",l->month,l->day,l->hour,l->min,l->sec);
printf("\t\t\t\t停车总时长:%d 秒\n", ti);
printf("\t\t\t\t总共应收费:%d元\n", ti/2);
printf("\t\t\t\t********************************\n\n");
timecopy(m,l);
strcpy(m->info,"Left! ");
strcpy(m->id, l->id);
EnQueue(T,m);
L->top = l->next;
free(l);
L->count--;
while(P->top)
{
LinkNode k = P->top;
P->top = k->next;
EnStack(L,k);
}
if((S->flag) > 1)
{
printf("\t\t\t\t通知:队列%s可以停车!\n",S->front->next->id);
LinkNode j = S->front->next;
S->front->next = j->next;
Encar2(L,j,T);
S->flag--;
return;
}
else if(S->flag == 1)
{
printf("\t\t\t\t通知:等候的车辆%s可以进场停车!\n",S->front->next->id);
LinkNode j = S->front->next;
S->front->next = j->next;
S->rear = S->front;
Encar2(L,j,T);
S->flag--;
return 0;
}
else
return;
}//出库
int Encar2(Stack *L, LinkNode S, Queue *T)
{
LinkNode m = (LinkNode)malloc(sizeof(Node));
time_t t;
struct tm *pt;
printf("\t\t\t\t");
printf("收费说明:每秒0.5元\n");
time(&t);
S->start = t;
pt = localtime(&t);
settime(S,t);
printf("\t\t\t\t现在是%d月%d日%d时%d分%d秒\n",S->month,S->day,S->hour,S->min,S->sec);
timecopy(m,S);
strcpy(m->info,"Parking!");
strcpy(m->id, S->id);
EnQueue(T,m);
EnStack(L,S);
printf("\t\t\t\t停车成功!\n");
}//队列车入库
int SearchInfo(Stack L, Queue T)
{
char n[10];
printf("\t\t\t\t请输入查询的车牌号:\n");
printf("\t\t\t\t");
scanf("%s",n);
LinkNode p = T.front->next;
while(p)
{
if(strcmp(p->id,n) == 0)
{
break;
}
p = p->next;
}
if(p == NULL)
{
printf("\t\t\t\t此车没来过停车场!\n");
return;
}
LinkNode l = p;
printf("\t\t\t\t该车尚未离开\n");
printf("\t\t\t\t车牌号: %s 车辆信息: %s 时间:%d月%d日%d时%d分%d秒\n",l->id,l->info,l->month,l->day,l->hour,l-
>min,l->sec);
p = p->next;
if(p != NULL)
{
while(p)
{
if(strcmp(p->id,n) == 0)
{
break;
}
p = p->next;
}
printf("\t\t\t\t该车尚未离开\n");
printf("\t\t\t\t车牌号: %s 车辆信息: %s 时间:%d月%d日%d时%d分%d秒\n",p->id,p->info,p->month,p->day,p-
>hour,p->min,p->sec);
}
LinkNode q = L.top;
while(q)
{
if(strcmp(q->id,n) == 0)
{
printf("\t\t\t\t该车尚未离开\n");
break;
}
q = q->next;
}
if(q == NULL)
{
printf("\t\t\t\t该车已经离开!\n");
}
}//车牌查询信息
int ShowInfo(Queue T)
{
if(T.front->next == NULL)
{
printf("\t\t\t\t信息为空!\n");
return;
}
LinkNode q = T.front->next;
while(q)
{
printf("\t\t\t\t车牌号: %s 车辆信息: %s 时间:%d月%d日%d时%d秒%d秒\n",q->id,q->info,q->month,q->day,q-
>hour,q->min,q->sec);
q = q->next;
}
}//出入信息
int EnInfo(Stack L)
{
LinkNode p = L.top;
while(p != NULL)
{
printf("\t\t\t\t");
printf("车牌号: %s 开始停车时间:%d月%d日%d时%d分%d秒\n",p->id,p->month,p->day,p->hour,p->min,p->sec);
p = p->next;
}
}//库内车辆信息
int WaitInfo(Queue S)
{
printf("\t\t\t\t");
printf("现在有 %d 辆车在等待:\n",S.flag);
if(S.flag == 0)
{
return 0;
}
LinkNode p = S.front;
while(p->next != NULL)
{
printf("\t\t\t\t");
printf("车牌号: %s\n",p->next->id);
p = p->next;
}
}//等待队列
//主函数
#include <stdio.h>
#include <stdlib.h>
#include "park.h"
void Print()
{
printf("\t\t\t\t*******************************************************\n");
printf("\t\t\t\t****1.进车登记 2.出车登记 ****\n");
printf("\t\t\t\t****3.查询车辆信息 4.查询出入记录 ****\n");
printf("\t\t\t\t****5.查询场内车辆信息 6.查询等候车辆信息****\n");
printf("\t\t\t\t****7.退出系统 \n");
printf("\t\t\t\t*******************************************************\n");
}
int main()
{
Stack in,tmp;
Queue wait,record;
InitQueue(&record);
InitStack(&in);
InitStack(&tmp);
InitQueue(&wait);
int choice;
while(1)
{
Print();
printf("\t\t\t\t请选择功能\n");
printf("\t\t\t\t");
scanf("%d",&choice);
switch(choice)
{
case 1:
EnCar(&in,&wait,&record);
break;
case 2:
OutCar(&in,&tmp,&wait,&record);
break;
case 3:
SearchInfo(in,record);
break;
case 4:
ShowInfo(record);
break;
case 5:
EnInfo(in);
break;
case 6:
WaitInfo(wait);
break;
case 7:
exit(1);
break;
default:
printf("\t\t\t\t无效操作!\n");
}
}
return 0;
}