#define _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
#define ElemType int
#define null 0
#define MAXSIZE 100
#define TempSpace 10
typedef struct Link {//定义停车场链表结构体
ElemType data; //定义数据域
struct Link* next; //定义指针域
}Link;
Link* head;
Link* end;
void List_init(Link* head)//初始化链表
{
head = (Link*)malloc(sizeof(Link));
head->next = NULL;
}
void AddList(Link lot,ElemType a)//停车场单链表增加结点
{
//创建一个节点
Link temp = (Link*)malloc(sizeof(struct Link)); //此处注意强制类型转换
Link* rear = (Link*)malloc(sizeof(struct Link));//头结点
rear = lot;
while (rear->next!=NULL) {
rear = rear->next;
}
//节点数据进行赋值
temp->data = a;
temp->next = NULL;
rear->next = temp;
//连接分两种情况1.一个节点都没有2.已经有节点了,添加到尾巴上
//if (NULL == head)
//{
// head = temp;
//end = temp;
//}
//else
//{
//end->next = temp;
//end = temp; //尾结点应该始终指向最后一个
//}
//end = temp; //尾结点应该始终指向最后一个
}
void LeaveStop(Link* L, ElemType x, ElemType n) {//删除指定元素的结点
Link* p;
Link* q;
p = L->next;
for (int i=0; i <= x; i++)
{
if (p->data == n)
{
q = p->next;
p->next = q->next;
free(q);
}
else {
p = p->next;
}
}
}
typedef struct Node ///定义等候车道队列的结点
{
ElemType data;
struct Node* next;
}Node;
typedef struct LQueue // 定义等候车道队列
{
Node* front;//队头结点
Node* rear;//队尾结点
}LQueue;
void init(LQueue* que) //初始化队列(只需初始化LQueue,即队头结点与队尾结点)
{
que = (LQueue*)malloc(sizeof(LQueue));
que->front = NULL;
que->rear = NULL;
}
int isEmpty(LQueue* que) //等候车道是否满了
{
if (que->front == NULL && que->rear == NULL)
{
return 1;
}
else {
return 0;
}
}
void push(LQueue& que, ElemType x) //等候车道入队
{
Node* node = (Node*)malloc(sizeof(Node));
node->data = x;
node->next = NULL;
que.rear = node;
}
void pop(LQueue* que, ElemType x) //等候车道出队
{
Node* temp = (Node*)malloc(sizeof(Node));
temp = que->front;
x = que->front->data;
que->front = que->front->next;
free(temp);//释放p结点
}
int waitingArea(LQueue Q, int carnum) //判断车是否在等候区
{
if (Q.front = Q.rear)
return 0;//等候区没有车
while (Q.front != null) {
if (Q.front->data == carnum)
return 1;
Q.front = Q.front->next;
}
return 0;
}
int main()
{
ElemType number;
int selection = 1;//定义操作选项
int choice1 = 1; //是否进入停车场的选项
int choice2 = 1;//选择离开停车场出口的选项
int choice3 = 1;//选择从哪个入口进入停车场的选项
int choice4 = 1;//选择从哪个便车道离开的选项
int parking_car = 0;//正在停车场内停的车的数量
int waiting_car_south = 0;//正在南出口等候车道的车辆数量
int waiting_car_north = 0;//正在北出口等候车道的车辆数量
int parking_max = 100;//最多可以停放多少车辆
int flag = 1;//用于执行循环的整数值
LQueue park_north;
init(&park_north);//初始化北等候通道
LQueue park_south;
init(&park_south);//初始化南等候通道
Link lot;
List_init(&lot); //初始化停车场
printf("*******************欢迎使用停车场管理系统,按任意键进入主菜单******************\n");
printf("");
do
{
getchar();
system("cls");
printf("*******************欢迎使用停车场管理系统,按任意键进入主菜单\n");
printf(" 主菜单 \n");
printf(" *1* 汽车入场 \n");
printf(" *2* 汽车离场 \n");
printf(" *3* 车位查询 \n");
printf(" *4* 离开车道 \n");
printf(" *0* 退出系统 \n");
printf(" 请按提示输入数字:\n");
scanf("%d", &selection);
switch (selection)
{
case 1://汽车入场的选项
system("cls");
printf("***********************************汽车入场************************************\n");
if (parking_car < MAXSIZE)//停车场有空位
{
printf(" 请输入您的车辆编号:\n");
scanf("%d", &number);
AddList(&lot,number);
printf(" 欢迎您进入本停车场!\n");
parking_car++;//停车场内部车辆
getchar();
break;
}
else if ((waiting_car_south < TempSpace || waiting_car_north < TempSpace) && parking_car == MAXSIZE)//停车场没有空位,但等候车位有空位
{
int car_num = waiting_car_south + waiting_car_north;
printf("***********当前停车场已停满,有%d辆车在等待,请问是否愿意进入等候车道**********\n", &car_num);
printf(" *1*\t愿意等待 *0*\t离开停车场\n");
getchar();
while (flag == 1)//进入choice1的循环
{
scanf("%d", &choice1);
getchar();
switch (choice1)
{
case 1:
printf(" 请您进入等候车道等待\n");//需要加入选择哪个入口的switch
getchar();
printf("***********************************请选择进入停车场的入口************************\n");
printf(" *1*\t南入口 *2*\t北入口\n");
scanf("%d", &choice3);
switch (choice3)
{
case 1:
printf(" 您进入南入口等待,您排在等待通道的第%d位\n", &waiting_car_south);
printf(" 请输入您的车辆编号:\n");
scanf("%d", number);
push(park_south, number);
waiting_car_south++;
printf("*******************按任意键再次进入主菜单******************\n");
getchar();
break;
case 2:
printf(" 您进入北入口等待,您排在等待通道的第%d位\n", &waiting_car_north);
printf(" 请输入您的车辆编号:\n");
scanf("%d", number);
push(park_north, number);
waiting_car_north++;
printf("*******************按任意键再次进入主菜单******************\n");
getchar();
break;
}
flag = 0;
break;
case 2:
printf(" 您已离开停车场\n");
getchar();
flag = 0;
break;
default:
printf(" 2输入错误,请您重新输入!\n");
getchar();
break;
}
}
}
else if (waiting_car_south == TempSpace && waiting_car_north == TempSpace && parking_car == MAXSIZE)//停车场没有空位,但等候车位有空位
{
printf(" 车位已满请重新选择功能\n");
getchar();
break;
}
break;
case 2://汽车离场的选项
if (parking_car > 0)
{
system("cls");
printf("***********************************请选择离开停车场的出口************************\n");
printf(" *1*\t南出口 *2*\t北出口\n");
while (flag == 1)//进入choice2的循环
{
scanf("%d", &choice2);
printf(" 请输入您的车辆编号:\n");
scanf("%d", number);
switch (choice2)
{
case 1:
if (isEmpty(&park_south))
{
printf(" 您已离开停车场\n");
LeaveStop(&lot, MAXSIZE, number);
parking_car--;
}
else
{
printf(" 南出口现在有%d辆车正在等候\n", waiting_car_south);
waiting_car_south++;
parking_car--;
push(park_south, number);
flag = 0;
getchar();
}
break;
case 2:
if (isEmpty(&park_north))
{
printf(" 您已离开停车场\n");
LeaveStop(&lot, MAXSIZE, number);
parking_car--;
}
else
{
printf(" 北出口现在有%d辆车正在等候\n", waiting_car_north);
waiting_car_north++;
parking_car--;
push(park_north, number);
flag = 0;
getchar();
}
break;
default:
printf(" 3输入错误,请您重新输入!\n");
getchar();
break;
}
}
}
else
{
printf(" 停车场内没有车辆\n");
printf(" 请重新选择功能\n");
getchar();
break;
}
break;
case 3://车位查询
system("cls");
printf("**********************************停车场信息************************************\n");
if (parking_car == MAXSIZE)//停车场已经停满
{
printf(" 停车场已经停满\n");
getchar();
break;
}
else//停车场车辆未满
{
printf(" 现在停车场中有%d辆汽车,有%d个可用车位\n", parking_car, parking_max - parking_car);
printf(" 南出口现在有%d辆车正在等候\n", waiting_car_south);
printf(" 北出口现在有%d辆车正在等候\n", waiting_car_north);
getchar();
break;
}
case 4:
printf("***********************************请选择离开停车场的出口************************\n");
printf(" *1*\t南出口 *2*\t北出口\n");
while (flag == 1)//进入choice2的循环
{
scanf("%d", &choice4);
switch (choice4)
{
case 1:
if (isEmpty(&park_south) == 1)
{
printf(" 等候车道为空,请您重新输入!\n");
getchar();
break;
}
else
{
printf(" 请输入您的车辆编号:\n");
scanf("%d", &number);
if (waitingArea(park_south, number) == 1)
{
pop(&park_south, number);
waiting_car_south--;
printf(" 您已离开南出口\n");
getchar();
break;
}
else
{
printf(" 该车辆并不在南出口:\n");
getchar();
break;
}
}
case 2:
if (isEmpty(&park_north) == 1)
{
printf(" 等候车道为空,请您重新输入!\n");
getchar();
break;
}
else
{
if (waitingArea(park_north, number) == 1)
{
pop(&park_north, number);
waiting_car_north--;
printf(" 您已离开南出口\n");
getchar();
break;
}
else
{
printf(" 该车辆并不在南出口:\n");
getchar();
break;
}
}
default:
printf(" 输入错误,请您重新输入!\n");
getchar();
break;
}
}
case 0://离开停车场
system("cls");
printf(" 请输入您的车辆编号:\n");
scanf("%d", &number);
LeaveStop(&lot, MAXSIZE, number);
printf(" 您已离开停车场\n");
parking_car--;
getchar();
break;
default:
printf(" 输入错误,请您重新输入!\n");
getchar();
break;
}
} while (choice1 != 0);
return 0;
}