停车场项目

停车场项目需求

问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门
          外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车
          要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
          (1)建立三个数据结构分别是:停放队列、让路栈、等候队列。
          (2)输入数据模拟管理过程,数据(入或出,车号)

功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
          查询场内车辆信息、查询等候车辆信息、退出系统。
          (1)linux系统编写(链表、栈、队列);
          (2)进车登记:登记车牌号以及入场时间;
          (3)出车登记:计算出停车时间,记录车辆车牌;
          (4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场
          (5)查询出入记录:所有车辆,包括已经离开的
          (6)查询场内车辆信息:列出所有场内车辆信息
          (7)查询等候车辆信息:显示等候车辆数量以及所有车牌号
          (8)退出系统。

具体解释都写在注释里了,源码有点多,直接上了:

#ifndef _PARK_H
#define _PARK_H

#define FAILURE 10000
#define SUCCESS 10001
#define TEUE	10002
#define FALSE   10003
#define SIZE    5
#define NUM		100

#include "time.h"

/*定义存放车辆信息的结构体*/

struct CarInfo
{
	char *carid;
	char *storetime;
	char *delivertime;
};
typedef struct CarInfo carinfo;


/*定义栈1的信息*/
struct Stack1
{
	int top;
	carinfo car[SIZE];
};
typedef struct Stack1 stack1;


/*定义栈2的信息*/
struct Stack2
{
	int top;
	carinfo car[SIZE];
};
typedef struct Stack2 stack2;

/*定义等待队列的信息*/
struct Queue
{
	carinfo car[NUM];
	int front;
	int rear;
};
typedef struct Queue queue;

/*将出栈的车辆放入一个队列*/
struct Queue1
{
	carinfo car[NUM];
	int front;
	int rear;
};
typedef struct Queue1 queue1;




int s1init(stack1 **q);
int s2init(stack2 **q);
int qinit(queue **q);
int q2init(queue1 **q);
int enterinfo(stack1 **q1, queue **q2);
int outinfo(stack1 **q1, stack2 **q2, queue **q3, queue1 **q4);
int searchcar(stack1 *q1, queue *q2);
int traverseinside(stack1 *q);
int traverseoutside(queue *q);

#endif
#include "park.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*初始化栈1
  q为二级指针,存放S1地址*/
  
int s1init(stack1 **q)
{
	*q = (stack1 *)malloc(sizeof(stack1));
	
	if(NULL == *q)//入参判断
	{
		return FAILURE;
	}
	
	(*q)->top = -1;
	
	return SUCCESS;
}

/*初始化栈2
  q为二级指针,存放S2地址*/
  
int s2init(stack2 **q)
{
	*q = (stack2 *)malloc(sizeof(stack2));
	
	if(NULL == *q)//入参判断
	{
		return FAILURE;
	}
	
	(*q)->top = -1;
	
	return SUCCESS;
}

/*初始化队列
	q为二级指针,存放Q1地址*/
	
int qinit(queue **q)
{
	*q = (queue *)malloc(sizeof(queue));
	
	if(NULL == *q)//入参判断
	{
		return FAILURE;
	}
	
	(*q)->front = (*q)->rear = 0;//队列为空
	
	return SUCCESS;
	
}
/*初始化队列1
	q为二级指针,存放Q2地址*/
	
int q1init(queue1 **q)
{
	*q = (queue1 *)malloc(sizeof(queue1));
	
	if(NULL == *q)//入参判断
	{
		return FAILURE;
	}
	
	(*q)->front = (*q)->rear = 0;//队列为空
	
	return SUCCESS;
}

//实现车辆进栈,栈满进入队列排队
//q1,q2为二级指针存放S1,Q1地址
//注意:此时top已经为栈1下标,而非top+1

int enterinfo(stack1 **q1, queue **q2)
{
	if(NULL == *q1 || NULL == *q2)//入参判断
	{
		return FAILURE;
	}
	
	printf("车牌号:\n");
	if((*q1)->top + 1 < 5)//栈1未满,直接进车
	{	
		int i;
		time_t timep;
		time(&timep);
		(*q1)->car[(*q1)->top + 1].carid = (char *)malloc(sizeof(char));
		(*q1)->car[(*q1)->top + 1].storetime = (char *)malloc(sizeof(char)*64);//!!!!重点!!!!这个话分配空间一定要乘大一点!!!!!!
		
		strcpy((*q1)->car[(*q1)->top + 1].storetime, ctime(&timep));
		scanf("%s", (*q1)->car[(*q1)->top + 1].carid);
		
		printf("%s\n", (*q1)->car[(*q1)->top + 1].storetime);

		printf("进入车库成功!\n");
		(*q1)->top++;//栈头上移一位
		return;
	}

	if((*q1)->top == 4)//栈1已满,开始分配进入队列
	{
		if (((*q2)->rear + 1) % SIZE == (*q2)->front) //队满
		{
			return FAILURE;
		}
		
		(*q2)->car[(*q2)->rear].carid = (char *)malloc(sizeof(char));
		scanf("%s", (*q2)->car[(*q2)->rear].carid);
		printf("车位已满,进入排队队列!\n");
		
		(*q2)->rear = ((*q2)->rear + 1) % NUM;//队尾后移一位
		printf("进入排队队列成功!\n");
		printf("当前等待序列号为:%d\n", (*q2)->rear);
	}
}

//实现车库内车辆出栈,等待车辆按顺序进栈
//q1,q2,q3为二级指针存放S1,S2,Q1地址
/*参数:ptr,存放输入的车牌号
		i,为结构体数组内成员分配空间的次数
		n,同理
*/
//调用系统时间函数		

int outinfo(stack1 **q1, stack2 **q2, queue **q3, queue1 **q4)
{
    time_t t = time(NULL);
	char *ptr;
	int i = 0,n;
	ptr = (char *)malloc(sizeof(char));
	
	if(NULL == ptr)
	{
		return FAILURE;
	}
	
	if(NULL == *q1 || NULL == *q2 || NULL == *q3 || NULL == *q4)
	{
		return FAILURE;
	}
	
	printf("请输入出库的车牌号!\n");
	scanf("%s", ptr);
	
	if(strcmp((*q1)->car[0].carid, ptr) == 0)//栈底出栈!
	{
		for(n = 0; n < 5; n++)//!!!!!!重点!!!!一定要给栈2成员全部分配空间!!!!
		{	
			(*q2)->car[(*q2)->top + 1 + n].carid = (char *)malloc(sizeof(char));
		}
			
		
		while((*q1)->top !=- 1)//未全部出栈
		{
				
			strcpy((*q2)->car[(*q2)->top + 1].carid, (*q1)->car[(*q1)->top].carid);
			(*q2)->top++;
			(*q1)->top--;
		}
		
		(*q4)->car[(*q1)->top].delivertime = (char *)malloc(sizeof(char)*64);
		strcpy((*q4)->car[0].delivertime, ctime(&t));
		printf("%s", (*q1)->car[0].delivertime);
		
		(*q4)->car[(*q4)->rear].carid = (char *)malloc(sizeof(char));
		strcpy((*q4)->car[(*q4)->rear].carid, (*q1)->car[(*q1)->top + 1].carid);
		
		(*q4)->car[(*q4)->rear].storetime = (char *)malloc(sizeof(char));
		strcpy((*q4)->car[(*q4)->rear].storetime, (*q1)->car[(*q1)->top + 1].storetime);
		(*q4)->rear++;
		
		(*q2)->top--;//删除栈顶
			
		while((*q2)->top != -1)//栈2中车辆返回栈1
		{
			strcpy(((*q1)->car[(*q1)->top + 1].carid), (*q2)->car[(*q2)->top].carid);
			(*q2)->top--;
			(*q1)->top++;
		}
		return SUCCESS;
	}
	
	while(strcmp((*q1)->car[i].carid, ptr) != 0)//不是栈底出栈,从第二个开始寻找需要出栈的车辆,找到为止!
	{
		i++;
		if(strcmp((*q1)->car[i].carid, ptr) == 0)//找到目标车辆!
		{
			for(n = 0; n < 5; n++)//栈2再次分配空间!
			{	
				(*q2)->car[(*q2)->top + 1 + n].carid = (char *)malloc(sizeof(char));
			}
			
			while((*q1)->top != i - 1)//目标车辆及目标车辆以后的车辆 全部出栈,进入栈2
			{
				strcpy((*q2)->car[(*q2)->top + 1].carid, (*q1)->car[(*q1)->top].carid);
				(*q2)->top++;
				(*q1)->top--;
			}
			
			(*q4)->car[(*q4)->rear].delivertime = (char *)malloc(sizeof(char)*64);
			strcpy((*q4)->car[(*q4)->rear].delivertime, ctime(&t));
			printf("%s", (*q4)->car[(*q4)->rear].delivertime);
			
			
			(*q4)->car[(*q4)->rear].storetime = (char *)malloc(sizeof(char)*64);
			strcpy((*q4)->car[(*q4)->rear].storetime, (*q1)->car[i].storetime);
			
			(*q4)->car[(*q4)->rear].carid = (char *)malloc(sizeof(char));
			strcpy((*q4)->car[(*q4)->rear].carid, (*q1)->car[i].carid);
			(*q4)->rear++;
			
			(*q2)->top--;//删除栈2头元素
			
			while((*q2)->top != -1)//将栈2全部元素返回栈1
			{
				strcpy(((*q1)->car[(*q1)->top + 1].carid), (*q2)->car[(*q2)->top].carid);
				(*q2)->top--;
				(*q1)->top++;
			}
			
			printf("车牌号为%s的车辆出库成功!\n", ptr);
			
			while((*q1)->top != 4 && (*q3)->rear != (*q3)->front)//!!!重点!!!因为删除了出栈车辆,所以将队列中最小号等候位进栈1
			{
					strcpy((*q1)->car[(*q1)->top + 1].carid, (*q3)->car[(*q3)->front].carid);
					(*q3)->front++;
					(*q1)->top++;
					
					printf("车牌号为%s的车辆进库!\n", (*q1)->car[(*q1)->top].carid);
					
					(*q1)->car[(*q1)->top].storetime = (char *)malloc(sizeof(char)*64);
					(*q1)->car[(*q1)->top].storetime = ctime(&t);
					printf("%s", (*q1)->car[(*q1)->top].storetime);
			}
			return SUCCESS;
		}	
	}	
}

//查询目标车辆信息
//i为循环次数
int searchcar(stack1 *q1, queue *q2)
{
	char *ptr;
	int i;
	ptr = (char *)malloc(sizeof(char));
	
	if(NULL == q1 || NULL == q2)
	{
		return FAILURE;
	}
	
	printf("请输入需要查询车辆的车牌号!\n");
	scanf("%s", ptr);
	
	for(i = 0; i <= q1->top; i++)
	{	
		if(strcmp(q1->car[i].carid, ptr) == 0)
		{
			printf("车牌号:%s\n", q1->car[i].carid);
			printf("入库时间为%s", (q1)->car[i].storetime);
			return 1;
		}	
	}
	
	while(q2->rear != q2->front)
	{
		if(strcmp(q2->car[q2->front].carid, ptr) == 0)
		{
			printf("车牌号:%s\n", q2->car[q2->front].carid);
			return 1;
		}
		q2->front++;
	}
	printf("目标车辆不存在!\n");
}

//查询车辆出库记录
////用i代替q->front,否则先查询,再进队,会出错
int recordcar(queue1 *q)
{
	if(NULL == q)
	{
		return FAILURE;
	}
	int i;
	i = q->front;
	
	while(i != q->rear)
	{
		printf("车牌号为%s车辆出库\n", q->car[i].carid);
		printf("入库时间为%s\n", q->car[i].storetime);
		printf("出库时间为%s\n", q->car[i].delivertime);
		i++;
	}
}		

//遍历栈1中目前车辆信息
//用i代替q->top,否则先查询,再进栈,会出错
int traverseinside(stack1 *q)
{
	if(NULL == q)
	{
		return FAILURE;
	}
	
	int i;
	for(i = 0; i <= q->top; i++)
	{
		printf("车牌号:%s\n", q->car[i].carid);
		printf("入库时间为%s\n", (q)->car[i].storetime);
	}
	return 0;
}

//遍历队列中目前车辆信息
//用i代替q->front,否则先查询,再进队,会出错
int traverseoutside(queue *q)
{
	if(NULL == q)
	{
		return FAILURE;
	}
	int i;
	i = q->front;
	while(i != q->rear)
	{
		printf("车牌号为%s的车辆正在等候\n", q->car[i].carid);
		i++;
	}
}
#include "park.h"
#include <stdio.h>
#include <stdlib.h>

int meun()
{
	int n;
    printf("********************作者:杨卓越********************************\n");
	printf("***************************************************************\n");
	printf("                      菜单\n");
	printf("***************************************************************\n");
	printf("\n");
	printf("                    1:进车登记\n");
	printf("                    2:出车登记\n");
	printf("                    3:查询车辆信息\n");
	printf("                    4:查询出入记录\n");
	printf("                    5:查询场内车辆信息\n");
	printf("                    6:查询等候车辆信息\n");
	printf("                    0:退出系统\n");
	printf("***************************************************************\n");
	printf("\n");
	printf("请输入您的选择\n");
	scanf("%d", &n);
	return n;
}

/*主函数实现功能:enterinfo()            登记进入车辆信息
				  outinfo()              登记出栈车辆信息
				  searchcar()              查询目标车辆信息
				  record()	               查询出入记录
				  traverseinside()	       查询场内车辆信息
			      traverseoutside()	       查询等候车辆信息
*/
int main()
{

	stack1 *S1;
	stack2 *S2;
	queue  *Q1;
	queue1 *Q2;
	
	int ret;
	
	/*判断s1是否初始化成功*/
	ret = s1init(&S1);
	if(ret == FAILURE)
	{
		printf("s1init failure!\n");
	}
	else
	{
		printf("s1init success!\n");
	}
	
	/*判断s2是否初始化成功*/
	ret = s2init(&S2);
	if(ret == FAILURE)
	{
		printf("s2init failure!\n");
	}
	else
	{
		printf("s2init success!\n");
	}
	
	/*判断Q1是否初始化成功*/
	ret = qinit(&Q1);
	if(ret == FAILURE)
	{
		printf("q1init failure!\n");
	}
	else
	{
		printf("q1init success!\n");
	}
	
	/*判断Q2是否初始化成功*/
	ret = q1init(&Q2);
	if(ret == FAILURE)
	{
		printf("q1init failure!\n");
	}
	else
	{
		printf("q1init success!\n");
	}
	
	//进入菜单选择界面
	while(1)
	{
		int n = 0;
		n = meun();
		switch(n)
		{
			case 1:
				ret = enterinfo(&S1, &Q1);
				
				if(ret == FAILURE)
				{
					printf("enter failure!\n");
				}
				else
				{
					printf("enter success!\n");
				}
				
				break;
				
			case 2:
				ret = outinfo(&S1, &S2, &Q1, &Q2);
				
				if(ret == FAILURE)
				{
					printf("out failure!\n");
				}
				else
				{
					printf("out success!\n");
				}
				
				break;
				
			case 3:
				ret = searchcar(S1, Q1);
				
				if(ret == FAILURE)
				{
					printf("search failure!\n");
				}
			
				break;
				
			case 4:
				ret = recordcar(Q2);
				
				if(ret == FAILURE)
				{
					printf("record FAILURE!\n");
				
				}
				
				break;
				
			case 5:
				ret = traverseinside(S1);
				
				if(ret == FAILURE)
				{
					printf("error!\n");
				}
				
				break;
				
			case 6:
				ret = traverseoutside(Q1);
				
				if(ret == FAILURE)
				{
					printf("error!\n");
				}
				
				break;
				
			case 0:
				exit(1);
		}			
	}			
}

 

 

 

    原文作者:停车场模拟问题
    原文地址: https://blog.csdn.net/yzy970611/article/details/81709951
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞