停车场啊啊啊啊啊啊啊

本文描述了一个C语言程序,使用顺序栈和链队实现了一个简单的停车场管理系统,包括车辆入库(Arriveparking)、出库(Leaveparking)、以及将便道上的车移入车库(Biandaoparking)的操作。
摘要由CSDN通过智能技术生成
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 100

//我发现了,对于实验 完成的每一步操作 都最好记录一下!!!!!!!!!!!!!!!!!!!!!!!!!!! 
//栈       先进后出  
//队列    先进先出 
 
//汽车的三项信息
typedef struct{
	char ch;//车辆的识别符,到达or离去
	int time;//车辆停车时间
	int carpai;//车辆车牌号 
}Car; 


//顺序栈实现停车场 
typedef struct{
	Car data[MAXSIZE];//停车场最大可以停放100量汽车 
	int top;
}StopCar; 



//链队实现排队进停车场
//好了好了不说了,我突然发现现在我剩下的错误都是 由于队列中的指针问题 所引起的//改成别人写的试试 

typedef struct BiandaoCar{
	Car data[MAXSIZE];//等候区最大可以停放100量汽车 //为什么链表也有范围啊??????????????? 
	struct BiandaoCar *next;
}BiandaoCar; 

typedef struct{
	BiandaoCar *front;
	BiandaoCar *rear;
}BiandaoLink;// 


int cost;//看起来好像全局变量在每个函数中定义后之后的函数会被影响到 
int  n; 


//我发现了 好像除了主函数,其余的函数不能引用其他的函数, 

void InitStack(StopCar *);//停车场初始化 ,临时停车初始化 
int InitQueue(BiandaoLink *);//初始化等候区 

void Arriveparing(StopCar *,BiandaoLink *,char ,int,int );//入库函数 
void Leaveparking(StopCar *,char ,int,int );//离开函数 
int IfTheCar(StopCar *,char);//判断是否有输入的这辆车 
void Biandaoparking(StopCar *,BiandaoLink *);//将便道上的车进入车库





int k=0;
//将便道上的车进入车库
void Biandaoparking(StopCar *stopcar,BiandaoLink *biandaocar)
{

     //这样队列就不是二级指针了吗,但是为什么不能用	biandaocar.front而是必须要用 biandaocar->front
	//判断便道有无车
	if(biandaocar->front ==biandaocar->rear ) //结果我对队列不熟悉!!!!!!!! 
	printf("便道没有车");//对于判断栈队列等里面是否为空,我总是忘记 
	else
	{
		//出队		--队列是先进先出 
		BiandaoCar *q;    
		q=biandaocar->front->next;
		(biandaocar->front )=q->next ;//不知道为啥在这里就不能自动生成 
		
		if(biandaocar->rear ==q) //如果S是最后一个元素,则让队尾指针指向队头,防止变成野指针
		biandaocar->rear =biandaocar->front ;
		
		printf("%d出便道成功!\n",q->data[k].carpai  );
		//不是吧链式结构也能用数组,以及为什么要用 
		//没错p不仅仅是纯正的链式结构,而且还不是 队列 
		//但是不用数组也可以吧,因为队列是按照顺序来的
		//等我将这个程序弄得能运行了在来搞搞,用个标记@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		
		
		//进栈
		//好像我对栈也不熟悉
		//之前的问题就是 对于这么长的字符我不确定是否正确,不对,应该是我没有办法记下这么长的字符,推得也害怕不对 
		//每个top都表示当下的值,要添加新的值的话,就得让top+1。 		
		//说起来,用p来盛放数值真不错,对于栈来说,front和rear真的只是指针,虽然也盛放数值但是不用 ,输入输出都靠p ,也不算的吧,不过感觉复杂的用p更方便,不然就会要用一大堆 字符了 
		
		stopcar->data[stopcar->top +1].carpai =q->data[k].carpai ;
		stopcar->data [stopcar->top +1].ch=q->data[k].ch;//我发现了只有当所有字符是紧紧贴在一起时,才会自动生成 
		stopcar->data [stopcar->top +1].time=q->data[k].time;//不过我认为应该top是+1了,但为什么是保持同步的呢 ,
		//———————————因为我们是把top看做为一个具体的数值,假如top=7,则top+1即是 7+1;也是一个具体的数值但是top++实际上是top=top+1; 
		printf("%d进库成功!\n",q->data[k].carpai);//用这个是明智的,因为不知道 top是否已经+1了 
		 
		 k++;
		 stopcar->top ++; 

	 } 
}



void Leaveparking(StopCar *stopcar,char ch,int carpai,int time) //出库 
{
	StopCar waitcar;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!这是为了使初始化顺利 
	InitStack(&waitcar);
	int sumtime;//计算时间
	
	if(stopcar->top ==-1)
	   printf("车库没有车!\n");
	else if(IfTheCar(stopcar,carpai))
	   printf("车库里没有此车!\n");
	else
	{
		while(stopcar->data[stopcar->top].carpai !=carpai)//这句话是什么意思 //妈的,还是对栈不理解 //是如何匹配的? 
		{
			 waitcar.data[waitcar.top+1].carpai =stopcar->data [stopcar->top ].carpai;
			 waitcar.data[waitcar.top+1].ch =stopcar->data [stopcar->top ].ch;
			 waitcar.data[waitcar.top+1].time =stopcar->data [stopcar->top ].time;
			 //我草,我还以为是用什么高级的转换呢,原来只是再赋值啊,不过这确实不错 !!!!!!
			 waitcar.top ++;
			 stopcar->top --; //这个牛啊,果然是因为我对栈不了解 ,出栈是很简单的 
		}
		 sumtime=time-stopcar->data [stopcar->top ].time;
		 printf("车牌是%d,在停车场停留的时间是%d,停车费用是%d\n",stopcar->data [stopcar->top ].carpai,sumtime, sumtime*cost);
		 stopcar->top --;//
		 while(waitcar.top !=-1) //什么时候用点,什么时候用->我有点分不清 
		  {
		  	stopcar->data [stopcar->top +1].carpai= waitcar.data [waitcar.top ].carpai;
		  	stopcar->data [stopcar->top +1].ch= waitcar.data [waitcar.top ].ch;
		  	stopcar->data [stopcar->top +1].time= waitcar.data [waitcar.top ].time;
		  	waitcar.top --;
		  	stopcar->top ++;
		  	
		  }
	}

}


///StopCar *stopcar//	Arriveparking//(StopCar *stopcar;BiandaoLink biandaocar;char ch;int car;int time)
//原来传递数值中只要有一项错误,那么就无法生成 
void Arriveparking(StopCar *stopcar,BiandaoLink *biandaocar,char ch,int carpai,int time) //入库
{
	int j=0;
	BiandaoCar *bd;
	bd->next =NULL;//不是,为什么用这个,我还没有见过用这个的啊;??????
	if((stopcar->top+1)<n) //车库没有满 
	{
		stopcar->data[stopcar->top +1].ch =ch;
		stopcar->data[stopcar->top +1].carpai=carpai;
		stopcar->data[stopcar->top +1].time =time;
		stopcar->top ++;
		printf("\n车牌号是%d的车停的位置是:%d\n",carpai,stopcar->top +1);
		 
	}
	else
	{
		bd->data [j].carpai=carpai;
		bd->data [j].ch=ch;
		bd->data [j].time=time;
		bd->next =NULL;//说起来为什么用bd ,这个语句代表什么 
		biandaocar->rear->next =bd;//”.”适用于结构体变量,”->”适用于结构体指针变量!!!!
		biandaocar->rear =bd; 
		printf("车牌号是%d的车在便道上的位置是%d\n",carpai,j+1);//为什么j能代表位置啊
		j++; 
	}	
} 


int IFtheCar(StopCar *stopcar,int carpai)
{
	int i;
	while(i<stopcar->top +1)//果然我现在还不能理解为什么j和top的对应关系????
	{
		if(stopcar->data [i].carpai==carpai)  return 0;
		i++;		
	}	
	return 1;
	 
 } 
 
 
void InitStack(StopCar *stopcar)
{
	stopcar->top =-1;
 } 
 
 //说起来我知道为什么要建立两个函数去初始化栈了,因为一开始的栈名不一样
  
 
int InitQueue(BiandaoLink *biandaocar)
 {
 	//biandaocar->front=(BiandaoCar)malloc(sizeof(BiandaoCar));
 	if(biandaocar->front!=NULL)
 	{
 		biandaocar->rear =biandaocar->front ;
		biandaocar->front  ->next=NULL;//是这样初始化的吗,总感觉哪里不对
		return 0;		 
	 }
	 else return 1;
 }


//反思:之前从来没有太注意 “.”以及”->”之间的区别,
//今天才发现有多么严重。”.”适用于结构体变量,”->”适用于结构体指针变量!!!!


int main(){
	Car car;
	StopCar stopcar;
	//Biandao biandao;
	BiandaoLink biandaocar;
	int n;//停车场可以停放的最大车辆
	int cost;// 每小时收取的费用
	int time=1,carpai;
	char ch;
	//BiandaoCar biandaocar;
	
	InitStack(&stopcar);
	InitQueue(&biandaocar);
	
	printf("输入停车场可以停放的最大车辆,以及每小时收取的费用 ");
	scanf("%d %d",&n,&cost); 
	
	 ch='q';//随便搞一个,使程序能进入循环 !!!!!!!!!!!!!!!!!
	//妈的,这也他妈的太牛了吧!!!!
	// 注意,当ch=' '时,要注意要 “吃掉 ”内存 
	// 接收第二个数之前清空缓冲区,fflush(stdin);getch();getchar();随便一个都可以,fflush(stdin)是全部清空,getchar()是清空一个字符,如果缓冲区还有多余的字符则会被正常使用,
	while(ch!='E')
	{		
		printf("\n请输入车的状态(A进站,D出站),车的车牌号,车的时间(进站时间,出站时间)(用空格间隔):");
		scanf("%c %d %d",&ch,&carpai,&time);
		if(ch=='A')
		{
			Arriveparking(&stopcar,&biandaocar,ch,carpai,time);			
		}
		else if (ch=='D')
		{
			Leaveparking(&stopcar,ch,carpai,time);//从停车场离开 
			Biandaoparking(&stopcar,&biandaocar);//将便道上的车进入车库

		}
		else  printf("请输入正确的编号,A是进库,D是出库!\n");				
	}
	return 0;	
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值