⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tccgl.h

📁 数据结构课程设计,实现一个停车场管理模拟的小程序,主要是对栈和队列的经典操作
💻 H
📖 第 1 页 / 共 3 页
字号:
//返回值:	类型(enum Status)
//			TRUE				"栈非空,并成功显示"
//			FALSE			"栈为空"
Status List_Stack(SqStack *S)
{	//列出停车场中汽车牌号,汽车型号,进入时间
	CarInfo* temp;		//临时变量,未分配空间
	char CarKindKey;	//汽车类型
	float CarSize;		//汽车占地空间
	temp=S->top-1;
	if(StackEmpty(S)==TRUE)
	{	//若栈为空
		system("cls");
		sleep(1);
		printf("**************************************停车场************************************");
		printf("停车场中没有汽车\n");
		printf("\n--------------------------------------------------------------------------------\n");
		sleep(2);
		return FALSE;	//如果栈为空则返回FALSE
	}//if(Sta
	else
	{	//若栈非空
		system("cls");	//清屏
		sleep(1);
		printf("**************************************停车场************************************");
		printf("汽车牌号\t   汽车型号\t   所占空间\t   进入停车场时间\n");
		sleep(2);
		while(temp!=S->base-1)
		{	//访问栈的全部内容
			if(temp->CarKind==A)
			{	//车型为A
				CarKindKey='A';									//显示为A型车
				CarSize=2;								//所占空间为2
			}//if
			else if(temp->CarKind==B)
			{	//车型为B
				CarKindKey='B';								//显示为B型车
				CarSize=1.5;							//所占空间为1.5
			}//else if
			else if(temp->CarKind==C)
			{	//车型为C
				CarKindKey='C';									//显示为C型车
				CarSize=1;								//所占空间为1
			}//else if
			sleep(1);
			printf("%-8d\t   %-8c\t   %-8.1f\t   %2d时%2d分\n",
			temp->CarNum,CarKindKey,CarSize,
			temp->ArrTime->tm_min%24,temp->ArrTime->tm_sec);
			temp--;
		}//while
	}//else
	printf("\n--------------------------------------------------------------------------------\n");
	sleep(2);
	return TRUE;
}//List_Stack

//函数名:	List_Queue
//功能:		将队列Q中信息在屏幕上显示
//输入参数:	Q(LinkQueue *)			"要处理队列"
//返回值:	类型(enum Status)
//			TRUE					"队列Q非空,成功显示信息"
//			FALSE					"队列Q为空"
Status List_Queue(LinkQueue* Q)
{//显示便道中的汽车信息
	QueuePtr temp;		//临时变量,不分配空间,不能用free进行释放
	char CarKindKey;	//汽车类型
	float CarSize;		//车辆占地空间
	temp=Q->front->next;
	if(QueueEmpty(Q)==TRUE)
	{	//若队列为空
		//system("cls");
		sleep(1);
		printf("***************************************便道*************************************");
		printf("便道中没有汽车\n");
		printf("\n--------------------------------------------------------------------------------\n");
		return FALSE;	//如果队列为空则返回FALSE
	}//if(Que
	else
	{	//若队列非空
		//system("cls");	//清屏
		sleep(1);
		printf("***************************************便道*************************************");
		printf("汽车牌号\t   汽车型号\t   所占空间\t   进入便道时间\n");
		sleep(2);
		while(temp!=NULL)
		{	//访问队列的全部内容
			if(temp->data.CarKind==A)
			{	//车型为A
				CarKindKey='A';									//显示为A型车
				CarSize=2.000000;								//所占空间为2
			}//if
			else if(temp->data.CarKind==B)
			{	//车型为B
				CarKindKey='B';									//显示为B型车
				CarSize=1.500000;								//所占空间为1.5
			}//else if
			else if(temp->data.CarKind==C)
			{	//车型为C
				CarKindKey='C';									//显示为C型车
				CarSize=1.000000;								//所占空间为1
			}//else if
			sleep(1);
			printf("%-8d\t   %-8c\t   %-8.1f\t   %2d时%2d分\n",
			temp->data.CarNum,CarKindKey,CarSize,
			temp->data.ArrTemTime->tm_min%24,temp->data.ArrTemTime->tm_sec);
			temp=temp->next;
		}//while
	}//else
	printf("\n--------------------------------------------------------------------------------\n");
	return TRUE;
}//List_Queue

//函数名:	CarGetInStack
//功能:		检查栈中数据,若栈中已有相同的数据则返回错误信息
//			若栈中没有该数据且有足够存放数据的空间,则将数据放进栈中
//			若栈空间不足,则将数据放入队列Temroad(LinkQueue* )全局变量中
//输入参数:	L(SqStack *)	"指向要处理的栈"
//			temp(CarInfo* )	"指向要处理的数据"
//返回值:	类型(enum Status)
//			TRUE				"数据成功入栈"
//			FALSE				"数据未成功入栈"
Status CarGetInStack(SqStack* L,CarInfo *temp)
{//汽车进入
	if(SearchCarFromStack(L,temp->CarNum)==TRUE)
	{	//若停车场中车号为CarNum的汽车已经存在
		printf("该车号已经存在于停车场中!\n");
		return(FALSE);
	}//if
	else
	{	//若该车号汽车未进停车场
		if(CanCarGetInStack(Parking,temp->CarKind)==FALSE)
		{	//若停车场没有足够空间停放该车
			if(SearchCarFromQueue(Temroad,temp->CarNum)==FALSE)
			{//若在便道中没有该车
				EnQueue(Temroad,temp);		//将该车停入便道
				WriteTime(temp->ArrTemTime);//将进入便道时间写入
				if(DisplayKind==1)			//若显示类型为详细
					printf("停车场没有足够空间,该车停入便道%d号位置等候...\n",QueueLength(Temroad));//GetCarPosInQueue(Temroad));
			}//if(Sear
			else
			{//若该车号已在便道中存在
				printf("车号为%d的汽车已经在便道中!\n",temp->CarNum);
			}//else
			return FALSE;
		}//if
		else
		{	//若停车场有足够空间停放该车
			if(temp->CarKind==A)				//类型为A
				CurCarSize=2;					//所占空间为2
			else if(temp->CarKind==B)			//类型为B
				CurCarSize=1.5;					//所占空间为1.5
			else								//类型为C
				CurCarSize=1;					//所占空间为1

			Push(L,temp);						//当前车辆入栈
			L->stacksize+=CurCarSize;
			WriteTime(temp->ArrTime);			//写入时间
			if(DisplayKind==1)
			{	//若显示类型为详细
				if(temp->CarKind==A)
						printf("车牌号为%d的大型汽车在%d时%d分停入停车场%d号位置!\n",temp->CarNum,temp->ArrTime->tm_min%24,temp->ArrTime->tm_sec,StackLength(L));//GetCarPosInStack(L));
				else if(temp->CarKind==B)
					printf("车牌号为%d的中型汽车在%d时%d分停入停车场%d号位置!\n",temp->CarNum,temp->ArrTime->tm_min%24,temp->ArrTime->tm_sec,StackLength(L));//GetCarPosInStack(L));
				else 
					printf("车牌号为%d的小型汽车在%d时%d分停入停车场%d号位置!\n",temp->CarNum,temp->ArrTime->tm_min%24,temp->ArrTime->tm_sec,StackLength(L));//GetCarPosInStack(L));
				return TRUE;
			}//else
			else
			{	//若显示类型为简洁
				printf("汽车已停入停车场!\n");
			}//else
		}//else
	}//else
	return TRUE;
}//CarGetInStack



//函数名:	CarGetOutStack
//功能:		从栈中查找与所给数据相匹配的数据CarNum(unsigned int),若未找到则返回错误信息
//			若找到匹配数据,则将数据从栈中弹出,并调用Charge函数
//			若该匹配数据并非栈顶元素,则先创建一个新栈,将其后数据依次弹出并压入新栈中存储
//			随后弹出该匹配数据并删除,然后将新栈中数据弹出压回原栈
//			检查队列Temroad(LinkQueue *)全局变量,若队列非空,则将其第一个元素出列,压入栈中
//输入参数:	L(SqStack *)			"指向要处理的栈,一般为全局变量Parking"
//			CarNum(unsigned int)	"要进行匹配的数据"
//返回值:	类型(enum Status)
//			TRUE						"找到匹配数据并成功进行操作"
//			FALSE						"未找到匹配数据"
Status CarGetOutStack(SqStack* L,CarInfo* temp)
{	//若车号为CarNum的汽车在停车场中则离开并返回TRUE,否则返回FALSE
	SqStack *TemCarParking;				//建立临时停车场,用以放置为要离开汽车让道而暂时退出停车场的汽车
	CarInfo _TemCarInfo;				//临时存储汽车信息
	CarInfo *TemCarInfo=&_TemCarInfo;	//初始化一个指向_TemCarInfo的指针
	//检查栈中是否有车号为CarNum的车辆
	if(SearchCarFromStack(L,temp->CarNum)==FALSE)
	{	//若汽车不在停车场中
		printf("该汽车不在停车场中!\n");
		return FALSE;
	}//if
	else
	{	//若汽车在停车场中
		if(CarInfoCorrStack(Parking,temp)==FALSE)
		{	//若该车号与类型不匹配
			printf("车牌号与车的类型不匹配!请重新输入!\n");
			return FALSE;
		}//if(Sear
		else
		{	//若该车号与类型匹配
			TemCarParking=(SqStack*)malloc(sizeof(SqStack));
			InitStack(TemCarParking);//建立临时停车场

			//将该汽车之后进入的汽车全部退出放进临时停车场中
			while((L->top-1)->CarNum!=tem->CarNum)
			{	//此汽车之后的汽车为其让路
				Pop(Parking,TemCarInfo);
				Push(TemCarParking,TemCarInfo);
				if(DisplayKind==1)
				{	//若显示类型为详细
					printf("车牌号为%d的汽车为要离开的汽车让路...进入临时停车场\n",TemCarInfo->CarNum);
					sleep(1);	//延迟
				}//if(D
			}//while

			//向该车信息中的DepTime写入当前系统时间的分钟数和秒数,作为该车离开时间
			WriteTime((L->top-1)->DepTime);
			Pop(Parking,TemCarInfo);			//将该数据弹出,存放到TemCarInfo中提供收费函数所需参数
			Charge(TemCarInfo);					//调用收费函数
			/*
			if(DisplayKind==1)					//若显示类型为详细
			{
				;//printf("车牌号为%d的汽车于%d时%d分离开停车场!\n",TemCarInfo->CarNum,TemCarInfo->DepTime->tm_min%24,TemCarInfo->DepTime->tm_sec);
			}
			else								//若显示类型为简洁
				printf("汽车已离开停车场!\n");
				*/
			L->stacksize=L->stacksize-CurCarSize;
			//让路汽车返回停车场
			while(StackEmpty(TemCarParking)!=TRUE)
			{	//当临时停车场不为空时,把为其让路的汽车返回停车场
				Pop(TemCarParking,TemCarInfo);							//从临时栈中弹出
				Push(Parking,TemCarInfo);								//压入原栈中
				if(DisplayKind==1)
				{	//若显示类型为详细
					printf("车牌号为%d的汽车从临时停车场中返回停车场...\n",TemCarInfo->CarNum);
					sleep(1);	//稍延迟
				}//if(D
			}//wile

			//汽车离去后若停车场有充足空间,且便道上有车等候,则让车辆进入停车场中
			if((QueueEmpty(Temroad)==FALSE))
			{	//若队列非空
				GetTopQueue(Temroad,TemCarInfo);						//拷贝队首元素检查
				if(CanCarGetInStack(Parking,TemCarInfo->CarKind)==TRUE)
				{	//如果该车能够进入
					DeQueue(Temroad,TemCarInfo);						//该车辆离开便道
					WriteTime(TemCarInfo->DepTemTime);					//写入离开便道时间
					CarGetInStack(Parking,TemCarInfo);					//该车辆进入停车场
				}//if(Can
			}//if((Que
		}//else
		DestroyStack(TemCarParking);//销毁临时停车场
		return TRUE;
	}//else
}//CarGetOutStack

//函数名:	CarGetOutQueue
//功能:		从队列中查找指定数据,若找匹配数据到则将数据之前进入队列的数据重新放至队尾,
//			将该数据置为队首后出队
//输入参数:	Q(LinkQueue *)		"要处理的队列"
//			temp(CarInfo *)		"要处理的数据"
//返回值:	类型(enum Status)
//			TRUE					"找到匹配数据,并将该数据出队"
//			FALSE					"未找到匹配数据"
Status CarGetOutQueue(LinkQueue* Q,CarInfo* temp)
{	//将汽车从便道中退出
	CarInfo* p;
	p=(CarInfo*)malloc(sizeof(CarInfo));
	if(SearchCarFromQueue(Q,temp->CarNum)==FALSE)
	{	//若便道中没有匹配的汽车
		printf("未找到该汽车!\n");
		return FALSE;
	}//if(Sea
	else
	{	//若在便道中找到该汽车
		if(CarInfoCorrQueue(Q,temp)==FALSE)
		{//若车号与车的类型不匹配
			printf("车牌号与车的类型不匹配!请重新输入!\n");
			return FALSE;
		}//if(Car
		else
		{	//若车号与该汽车类型匹配
			do
			{	//遍历队列Q,直至找到该汽车
				GetTopQueue(Q,p);
				if(p->CarNum!=temp->CarNum)
				{	//若此汽车不是匹配汽车
					DeQueue(Q,p);					//将该车退出
					EnQueue(Q,p);					//放入队尾
					if(DisplayKind==1)				
					{	//若显示类型为详细
						printf("车牌号为%d的汽车为要从便道中离开的汽车让路,出入便道尾中重新排队!\n",p->CarNum);
						sleep(1);	//延迟
					}//if(D
				}//if(p-
				else if(p->CarNum==temp->CarNum)
				{	//若此汽车是匹配汽车
					DeQueue(Q,p);					//将其出队
					WriteTime(p->DepTemTime);		//写入离开时间
					Charge(p);						//调用收费函数
					return TRUE;
				}//else
			}while(p!=NULL);
		}//else
		free(p);
		return TRUE;
	}//else
}//CarGetOutQueue

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -