LinuxC练习:停车场项目:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门 外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中

基本功能要求:
          (1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
          (2)输入数据模拟管理过程,数据(入或出,车号)


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

  (8)退出系统。

Car.h

#ifndef _CAR_H_
#define _CAR_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
enum
{
	SUCCESS = 10000,
	FAILURE,
	TRUE,
	FALSE,
};

struct carinfo
{
	char *carnum;

	char *entertime;
	char *outtime;

	long int enterseconds;
	long int outseconds;

	int enterflag;
	int outflag; 
	int waitflag;

	int fee;

	struct carinfo *next;

};

typedef struct carinfo CarInfo;

struct carstack
{
	CarInfo *top;
	int length;
};
typedef struct carstack CarStack;

struct carqueue
{
	CarInfo *front;
	CarInfo *rear;
};
typedef struct carqueue CarQueue;

int Welcome();
int Login();
int CarMenue();
int CheckCarnumStack(CarStack *cs1, char *carnum);
int CheckCarnumQueue(CarQueue *cq, char *carnum);
int ShowByCarnum(CarStack *s, CarStack *s1, CarQueue *q, void(p)(CarInfo *));
int InitCarStack(CarStack **s);
int Push(CarStack *s, CarInfo *c);
CarInfo *Pop(CarStack *s);
int EnterCarPark(CarStack *s, CarQueue *q);
int LeaveCarPark(CarStack *s, CarStack *s1,CarStack *s2, CarQueue *q);
int TraverseCarStack(CarStack *s, void (*p)(CarInfo *));
int EmptyCarStack(CarStack *s);
int InitCarQueue(CarQueue **q);
int EnterCarQueue(CarQueue *q, CarStack *s);
int EmptyCarQueue(CarQueue *q);
int LengthCarQueue(CarQueue *q);
CarInfo *DeleteCarQueue(CarQueue *q);
int TraverseCarQueue(CarQueue *q, void (*p)(CarInfo *));

#endif
Car.c
#include "Car.h"

int Welcome()
{
	system("clear");
	printf("\t\t\t************************************************************\n");
	printf("\t\t\t------------------------------------------------------------\n");
	printf("\t\t\t****************Welcome To  CarPark  System*****************\n");
	printf("\t\t\t------------------------------------------------------------\n");
	printf("\t\t\t*******************Made By Autumn Sun***********************\n");
	printf("\t\t\t------------------------------------------------------------\n");
	printf("\t\t\t************************************************************\n");
	sleep(2);
	return 0;
}

int Login()
{
	system("clear");
	char *LoginName = (char *)malloc(sizeof(char) * 20);
	char *LoginPassword = (char *)malloc(sizeof(char) * 20);
	if(NULL == LoginName || NULL == LoginPassword)
	{
		printf("NULL ERROR\n");
		exit(1);
	}
	int ret;
	printf("请输入登录名\n");
	scanf("%s", LoginName);
	printf("请输入登录密码\n");
	scanf("%s", LoginPassword);
	ret = strcmp(LoginName, LoginPassword);
	if(ret != 0)
	{
		return FAILURE;
	}
	else
	{
		return SUCCESS;
	}

}



int CarMenue()
{
	printf("\t\t\t1、显示车库             2、显示等候\n");
	printf("\t\t\t3、进入车库             4、离开车库\n");
	printf("\t\t\t5、查询所有             6、推出系统\n");
	return 0;
}

int CheckCarnumStack(CarStack *cs1, char *carnum)
{
	int flag = 0;
	if(NULL == cs1)
	{
		return FAILURE;
	}

	CarInfo *q = cs1 -> top;
	while(q)
	{
		if(0 == strcmp(q -> carnum, carnum))
		{
			flag = 1;
		}
		q = q ->next;
	}
	

	if(flag == 0)
	{
		return FALSE;
	}
	else
	{
		return TRUE;
	}


}

int CheckCarnumQueue(CarQueue *cq, char *carnum)
{
	if(NULL == cq)
 	{
     	return FAILURE;
 	}
	int flag = 0;
	CarInfo *q1 = cq -> front -> next;
	while(q1)
	{
		if(0 == strcmp(q1 -> carnum, carnum))
		{
			flag = 1;
		}
		q1 = q1 -> next;
	}
	if(flag == 0)
	{
		return FALSE;
	}
	else
	{
		return TRUE;
	}


}



int ShowByCarnum(CarStack *s, CarStack *s1, CarQueue *q, void(p)(CarInfo *))
{
	CarInfo *tmp1 = s -> top;
	CarInfo *tmp2 = s1 -> top;
	CarInfo *tmp3 = q -> front -> next;
	char *carnum = (char *)malloc(sizeof(char) * 20);
	if(NULL == carnum)
	{
		printf("NULL ERROR\n");
		return FAILURE;
	}
	printf("请输入要离开的车牌号\n");
	scanf("%s", carnum);
	while(tmp1)
	{
		if(strcmp(tmp1 -> carnum, carnum) == 0)
		{
			printf(" 状态:在停车场\n");
			p(tmp1);

		}
		tmp1 = tmp1 -> next;
	}

	while(tmp2)
	{
		if(strcmp(tmp2 -> carnum, carnum) == 0)
		{
			printf("状态:已经离开\n");
			p(tmp2);
		}
		tmp2 = tmp2 -> next;
	}

	while(tmp3)
	{
		if(strcmp(tmp3 -> carnum, carnum) == 0)
		{
			printf("状态:正在等候\n");
			p(tmp3);
		}
		tmp3 = tmp3 -> next;
	}
	return SUCCESS;
}

CarQueue.c
#include "Car.h"

int InitCarQueue(CarQueue **q)//初始化等候区
{
	if (NULL == q)
	{
		return FAILURE;
	}

	(*q) = (CarQueue *)malloc(sizeof(CarQueue));
	if ((*q) == NULL)
	{
		return FAILURE;
	}

	CarInfo *n = (CarInfo *)malloc(sizeof(CarInfo));
	if (NULL == n)
	{
		return FAILURE;
	}

	n->next = NULL;

	(*q)->rear = (*q)->front = n;

	return SUCCESS;
		
}

int EnterCarQueue(CarQueue *q, CarStack *s)// 将车辆进入等候区
{
	if (NULL == q)
	{
		return FAILURE;
	}
	
	int ret, ret1;
	CarInfo *n = (CarInfo *)malloc(sizeof(CarInfo));
	n -> carnum = (char *)malloc(sizeof(char) * 10);
	n -> entertime = (char *)malloc(sizeof(char) * 20);
	n -> outtime = (char *)malloc(sizeof(char) * 20);
	n -> waitflag = 1;
	char *carnum = (char *)malloc(sizeof(char) * 10);
	if (NULL == n || NULL == n -> carnum || NULL == n -> entertime || NULL == n -> outtime || NULL == carnum)
	{
		return FAILURE;
	}

	printf("请输入车牌号\n");
	scanf("%s", carnum);
	ret = CheckCarnumStack(s, carnum);
	ret1 = CheckCarnumQueue(q, carnum);
	while(TRUE == ret || TRUE == ret1)
	{
		printf("请重新输入车牌号\n");
		memset(carnum, 0, 10);
		scanf("%s", carnum);
		ret = CheckCarnumStack(s, carnum);
		ret1 = CheckCarnumQueue(q, carnum);

	}
	strcpy(n ->carnum, carnum);
	strcpy(n -> entertime, " ");
	strcpy(n -> outtime, " ");
	n -> fee = 0;
	n -> enterflag = 0;
	n -> outflag = 0;
	n->next = NULL;
	q->rear->next = n;
	q->rear = n;

	return SUCCESS;
}

int EmptyCarQueue(CarQueue *q)//判断等候区是否有车
{
	if (NULL == q)
	{
		return FAILURE;
	}

	return (q->rear == q->front) ? TRUE : FALSE; 
}

int LengthCarQueue(CarQueue *q)//求得等候区车辆数
{
	if (NULL == q)
	{
		return FAILURE;
	}

	CarInfo *p = q->front;
	int length = 0;

	while (p != q->rear)
	{
		p = p->next;
		length++;
	}

	return length;
}
//将车从等候区出去,返回车辆信息
CarInfo *DeleteCarQueue(CarQueue *q)
{
	if (NULL == q || q->rear == q->front)
	{	
		return NULL;
	}

	CarInfo *p = q->front->next;
	q->front->next = p->next;
		
	if (p == q->rear)
	{
		q->rear = q->front;
	}
	
	return p;
}

int TraverseCarQueue(CarQueue *q, void (*p)(CarInfo *))//现实等候区所有车辆
{
	if (NULL == q || p == NULL)
	{
		return FAILURE;
	}
	
	int length = LengthCarQueue(q);
	printf("目前有%d在等候区\n", length);
	
	CarInfo *n = q->front->next;
	while (n)
	{
		p(n);
		n = n->next;
	}
	
	return SUCCESS;
}

CarStack.c
#include "Car.h"

int InitCarStack(CarStack **s)//初始化车库
{
	*s = (CarStack *)malloc(sizeof(CarStack));
	if (NULL == (*s))
	{
		return FAILURE;
	}

	(*s)->top = NULL;
	(*s)->length = 0;	

	return SUCCESS;
}

int Push(CarStack *s, CarInfo *c)
{
	if(NULL == s)
	{
		return FAILURE;
	}

	c -> next = s -> top;
	s -> top = c;
	s -> length ++;
	return SUCCESS;
}

CarInfo *Pop(CarStack *s)
{
	if(NULL == s || NULL == s -> top)
	{
		return NULL;
	}
	
	CarInfo *c = s -> top;
	s -> top = c -> next;
	s -> length --;
	
	//tmp = c;
	//tmp -> next = NULL; 
	return c;
}


int EnterCarPark(CarStack *s, CarQueue *q)//将车牌号添加进车库
{
	if (NULL == s || NULL == q)
	{
		return FAILURE;
	}

	CarInfo *p = (CarInfo *)malloc(sizeof(CarInfo));
	p -> carnum = (char *)malloc(sizeof(char) * 10);
	p -> entertime = (char *)malloc(sizeof(char) * 20);
	p -> outtime = (char *)malloc(sizeof(char) * 20);
	char *carnum = (char *)malloc(sizeof(char) * 10);
	if (NULL == p|| NULL == p -> carnum || NULL == p -> entertime || NULL == p -> outtime || NULL == carnum)
	{
		return FAILURE;
	}
	int ret, ret1;
	//获取时间
	time_t timep;

	if(s -> length > 5)//如果车库满了则将车转到等候区
	{
		printf("停车场已经满了,请进入等候区\n");
		ret = EnterCarQueue(q, s);
		if(SUCCESS == ret)
		{
			printf("进入等候区成功\n");
		}
		else
		{
			printf("进入等候区失败\n");
		}
	}
	else if(s -> length <= 5 && EmptyCarQueue(q) == TRUE)//如果等候区没有车且车库没有满
	{
		printf("请输入车牌号\n");
		scanf("%s", carnum);
		
		ret = CheckCarnumStack(s, carnum);
		ret1 = CheckCarnumQueue(q, carnum);
		while(TRUE == ret || TRUE == ret1)
		{
			system("clear");
			printf("请重新输入车牌号\n");
			memset(carnum, 0, 10);
			scanf("%s", carnum);
			ret = CheckCarnumStack(s, carnum);
			ret1 = CheckCarnumQueue(q, carnum);

		}
		strcpy(p -> carnum, carnum);
		p -> outseconds = 0;
		strcpy(p -> outtime, " ");
		p -> fee = 0;
		p -> enterseconds = time(&timep);//获取描述
		strcpy(p -> entertime, ctime(&timep));
		p -> enterflag = 1;
		p -> outflag = 0;
		p -> waitflag  =1;
		printf("入场时间:%s\n", p -> entertime);
		Push(s, p);		
	}
	return SUCCESS;
}

						                     			 //出车时如果等候区有车则将等候区的第一辆车进入到车库中、length不变
  						                       //如果等候区没有车,则length --;
int LeaveCarPark(CarStack *s, CarStack *s1,CarStack *s2, CarQueue *q)//s为停车场,s1为方便停车的区域, s2为记录离开的车子
{
	char *carnum = (char *)malloc(sizeof(char) * 10);
	CarInfo *tmp ;
	CarInfo *tmp1;
	CarInfo *tmp2;
	CarInfo *tmp3;
	CarInfo *tmp4;
	int ret, ret2;

	if (NULL == s || NULL == s->top || NULL == carnum)
	{
		return FAILURE;
	}
	printf("请输入要离开的车牌号\n");
	scanf("%s", carnum);
	ret = CheckCarnumStack(s, carnum);
	while(FALSE == ret)
	{
		printf("请重新输入\n");
		memset(carnum, 0, 10);
		scanf("%s", carnum);
		ret = CheckCarnumStack(s, carnum);
		 
	}
	tmp = s -> top;
	while(tmp)
	{
		 
		 if(strcmp(tmp -> carnum, carnum) == 0)
		 {
		 	tmp1 = tmp;
			break;
		 }
		 tmp4 = Pop(s);
		 if(NULL == tmp4)
		 break;
		 Push(s1, tmp4);
		 
		 tmp = s -> top;
	}
	
	time_t timep;
	time(&timep);
	tmp1 -> outseconds = time(&timep);
	strcpy(tmp1 -> outtime, ctime(&timep));
	tmp1 -> fee = (tmp1 -> outseconds - tmp1 -> enterseconds) * 1;//一分钟一元
	tmp1 -> outflag = 1;
	tmp1 -> enterflag = 0;
	printf("应缴费用:%d\n", tmp1 -> fee);
	printf("离开时间:%s\n", tmp1 -> outtime);
	Pop(s);
	Push(s2, tmp1);
	tmp2 = s1 -> top;
	while(tmp2)
	{
		tmp4 = Pop(s1);
		if(NULL == tmp4)
		break;
		Push(s, tmp4);
		tmp2 = s1 -> top;
	}
	//如果等候区有车将第一辆车开进停车场
	if(FALSE == EmptyCarQueue(q))
	{
		tmp3 = DeleteCarQueue(q);
		
		if(s -> length <= 5)
		{
			
			tmp3 -> enterseconds = time(&timep);
			strcpy(tmp3 -> entertime, ctime(&timep));
			tmp3 -> enterflag = 1;
			tmp3 -> waitflag = 0;
			
			ret2 = Push(s, tmp3);
			if(SUCCESS == ret2)
			{
				printf("等候区车牌%s正在进入停车场\n", tmp3 -> carnum);
				printf("入场时间:%s\n", tmp3 -> entertime);
				printf("从等候区成功进入停车场\n");
				return SUCCESS;
			}
			else
			{
				return FAILURE;
			}
		}	
	}
	return SUCCESS;
}


int TraverseCarStack(CarStack *s, void (*p)(CarInfo *))//显示所有停车场车辆的信息
{
	if (NULL == s)
	{
		printf("1\n");
		return FAILURE;
		
	}
	//printf("2\n");
	printf("目前停车场有%d正在使用\n", s -> length);
	//printf("1\n");
	CarInfo *q = s->top;
	while (q)
	{
		p(q);
		q = q->next;
	}
	while(getchar() != '\n');
	return SUCCESS;

}


int EmptyCarStack(CarStack *s)//判断停车场是否为空
{
	if (NULL == s)
	{
		return FAILURE;
	}

	return (NULL == s->top) ? TRUE : FALSE;
}

test.c
#include"Car.h"

void visit(CarInfo *c)
{
	printf("\t\t\t车牌号:%s进库时间:%s出库时间:%s应缴费用:%d\n", c -> carnum, c -> entertime, c -> outtime, c -> fee);
	printf("\t\t\t--------------------------------------------------------------------\n");
	printf("\t\t\t--------------------------------------------------------------------\n");
}

int main()
{
	int ret, choice;
	CarStack *cs1;//车库
	CarStack *cs2;//用于临时存放
	CarStack *cs3;//用于存放离开的车辆信息
	CarQueue *cq;
	if(FAILURE == InitCarStack(&cs1) || FAILURE == InitCarStack(&cs2) || FAILURE == InitCarStack(&cs3) || FAILURE == InitCarQueue(&cq))
	{
		printf("Init Failure\n");
		exit(1);
	}
	else
	{
		Welcome();
		ret = Login();
		while( FAILURE == ret)
		{
			system("clear");
			printf("请重新登录\n");
			ret = Login();
		}
		
		while(1)
		{
			CarMenue();
			printf("\n");
			printf("请输入选项\n");
			scanf("%d", &choice);
			system("clear");
			switch(choice)
			{
				case 1: TraverseCarStack(cs1, visit);
						break;
				case 2: TraverseCarQueue(cq, visit);
						break;
				case 3: EnterCarPark(cs1, cq);
						break;
				case 4:	LeaveCarPark(cs1, cs2, cs3, cq);
						break;
				case 5: ShowByCarnum(cs1, cs3, cq, visit);
						break;
				case 6:	exit(1);
						break;
				default: printf("1111\n");
						return 0;

			}
		}
	}


	return 0;
}


  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
设有一个可以停放n汽车狭长停车场,它只有一个大门可以车辆进出车辆到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达第一辆放在停车场的最里面)。如果停车场已放n辆车,则后来的只能在停车场大门便上等待,一旦停车场有车,则排在便上的第一辆进入停车场停车场内如有某辆车要开,在它之后进入停车场都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场留的时间长短交费。如果留在便上的未进停车场就要离去,允许其离去,不收费,并且仍然保持在便上等待的车辆次序。编制一程序模拟该停车场的管理。(2) 实现要求:要求程序输出每辆车到达后的位置(停车场便上),以及某辆车离开停车场时应交纳的费用和它在停车场留的时间。(2) 实现提示:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(’A’,1,5)表示1号牌照在5时刻到达,而(’D’,5,20)表示5号牌照在20时刻离去。整个程序可以在输入信息为(’E’,0,0)时结束。本题可用顺序存储结构和链式存储结构来实现。本人的一个数据结构课程设计(用C++源码实现,大家学习参考之用,有不妥之处望指正)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值