您的位置:首页 > 编程语言 > C语言/C++

停车场项目链表入库队列进出库带收费优化升级版

2018-01-26 13:26 363 查看
停车场
/*****************************************************
copyright (C), 2014-2015, Jinling Institute of Tecnology
File carname:2.c
Author: Zhang.Y.F  Version:0.1    Date: 2018-01-16 20:25
Description:
Funcion List:
*****************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef struct
{
char carname[10];
int vip;
int xh; //车的入场序号
time_t start;
}Car;

Car cars[10];//用于存放暂时的是车辆,后面用于排序
typedef struct
{
Car car[100];//100个车为,数组中的元素不用排序直接放入队列中
int front;//对头
int rear;
}GD;

typedef struct Node//定义一个结构体用来存放车辆信息,车牌号,进入时间等
{
Car car;
int flag;//用来辨别当前节点内有没有车
int num;
struct Node *next;

}Node,*LinkList;

void Create(LinkList L)//创建一个有100个元素的链表,长度限定了,后面也不再改变(传的是二极指针)
{
char carname[10]={'\0'};
LinkList p,s;
int i=0;
p=L->next=(LinkList)malloc(sizeof(Node));//给第一个节点初始化
p->flag=0;int j=0;
strcpy(p->car.carname,carname);
p->car.xh=0;
p->car.vip=0;
p->car.start=time(NULL);
p->num=1;
i=1;
while(i<=100)
{
s=(LinkList)malloc(sizeof(Node));//给接下来的99个节点初始化
strcpy(L->car.carname,carname);//对车的操作
s->car.xh=0;
s->car.vip=0;
s->car.start=time(NULL);
s->flag=0;//用来辨别当前节点内有没有车
(s->num)++;
s->next=p->next;//尾插
p->next=s;
p=s;
i++;//地I个节点
}
}

void IntCar(Car cars[],int ci)//先把所有车的信息输入数组当中,然后数组中的元素挨个拷贝到队列中去
{
int i;//第i层
for(i=0;i<10;i++)
{
printf("请输入车牌号\n");
scanf("%s",cars[i].carname);//车牌号
cars[i].vip=rand()%(10-1)+1;//随机的VIP等级0-9
cars[i].xh=ci*10+i+1;
cars[i].start=time(NULL);
}
return;
}
void copy(Car *A,Car *B)//将B车的信息完全复制给A车;址传递
{
strcpy(A->carname,B->carname);
A->vip=B->vip;
A->xh=B->xh;
A->start=B->start;
return;
}
void EnQueue(GD *Q,Car C[])//队列上面已经创建好,用来自然顺序存放进来的车
{
if((Q->rear+1)%100==Q->front)
{
printf("停车场已满\n");
return;
}

else{
int j=0;
while(j<10)//从当前的队尾依次存放测车辆的信息
{
copy(&(Q->car[Q->rear]),&(C[j]));
Q->rear=(Q->rear+1)%100;//尾指针指向下一个
j++;
}
}
return;
}
void swap(Car *A,Car *B)//交换A,B车的内容
{
Car* temp=
4000
(Car *)malloc(sizeof(Car));//中间变量
copy(temp,A);
copy(A,B);
copy(B,temp);
return;
}
void BubbleSort(Car C[],int n/*数组长度*/)//冒泡排序,大的在前
{
int i,j,flag;
flag=1;
for(i=0;i<n-1&&flag;i++)
{
flag=0;//标志着是否排过序了
for(j=n-2;j>=i;j--)//先把所有车的信息输入数组当中,然后数组中的元素挨个拷贝到队列中去
{
if(C[j].vip<C[j+1].vip)
{
swap(&(C[j]),&(C[j+1]));
flag=1;
}
}
}
}
void SelectSort(Car C[],int n)//选择排序,派出vip等级大小排序
{
int i,j,max;
for(i=0;i<n-1;i++)
{
max=i;
for(j=i+1;j<=n-1;j++)//找出i到n-1中最大元素所在位置
{
if(C[max].vip<C[j].vip)
max=j;
}
if(i!=max)//如果i不是最大元素所在位置,则将他们的值交换
swap(&C[i],&C[max]);
}
}

void ruku(LinkList L,Car C[])//将已排序的数组按照顺序一个个的复制内容到链表中去
{
LinkList p;
p=L->next;
int i=0;
while(p->flag!=0&&p!=NULL)//遍历到第一个空车位,或者车库满
{
p=p->next;
}//思考一个问题,后来有车出库了,可是他还是要10个一起进来
if(p==NULL)
{
printf("车库满了\n");
return;
}
while(p&&p->flag==0&&p->num%10!=1)//遍历到10的整数倍后一个
{
p=p->next;
}
if(p==NULL)
{
printf("车库满了\n");
return;
}
if(p&&p->flag==0&&p->num%10==1)//用来从10的整数倍后一个开始
{
while(i<10&&p!=NULL)
{
copy(&(p->car),&(C[i]));
p->flag=1;
p=p->next;
i++;

}
if(p==NULL)
{
printf("车库满了\n");
return;
}
}
return;
}
int Length(LinkList L)//求总长度
{
LinkList p=L->next;
int count=0;
while(p)
{
if(p->flag!=0)
count++;
p=p->next;
}
return count;
}

int Lengthi(LinkList L,int i)//求每一层长度
{
LinkList p=L->next;
int count=0;
int n=0;
int m=0;
for(m=0;m<10*(i-1);m++)
p=p->next;
while(n<10&&p)
{
if(p->flag!=0)
count++;
p=p->next;
}
return count;
}
void PrintC(Car *C)
{
int h,m,s;
h=0;
m=0;
s=0;
s=C->start%60;
m=C->start%3600/60;
h=(C->start%(3600*24)/3600+8);
printf("车牌号%s\n",C->carname);
printf("车的vip等级%d\n",C->vip);
printf("进入时间:%02d:%02d:%02d:\n",h,m,s);

}
//再谢一个查询车来嗯信息的函数
Car* Res(LinkList L,char carname[])
{
LinkList p=L->next;
Car *C=(Car *)malloc(sizeof(Car));
while(p&&strcmp(p->car.carname,carname))
p=p->next;
if(p==NULL)
{
printf("车库中没有这辆车\n");
return;
}
if(strcmp(p->car.carname,carname)==0)
{
printf("找到了\n");
copy(C,&(p->car));//这里的car是一个车的结构体
printf("调试专用112\n");
}
return C;
}

PrintList(LinkList L)//打印出当前车库中所有车的信息
{
printf("目前车库中共有%d辆车\n",Length(L));
LinkList p=L->next;
int i=1;

//printf("车库共有%d辆车\n",Length(L));
while(i<=10)
{
int j=0;
printf("第%d层车库共有%d辆车\n",i,Lengthi(L,i));
while(j<10&&p&&Lengthi(L,i))
{
if(p->flag)
{
printf("%c车位有车\n",'A'+j);
PrintC(&(p->car));
}

else
printf("%c车位无车\n",'A'+j);
p=p->next;
j++;
}
i++;
}
}
//初始化一个车
void DeC(Car *C)
{
strcpy(C->carname,"\0");
C->vip=0;
C->xh=0;
C->start=time(NULL);
printf("初始化成功\n");
return;
}
Car* chuku(GD *Q)//从对队列头出库一辆车,返回车辆的信息,用于后面的链表中削去相同的车
{
time_t end;
end=time(NULL);
int h=0;
int m=0;
int s=0;
s=end%60;
m=end%3600/60;
h=(end%(3600*24)/3600+8);
Car *C=(Car *)malloc(sizeof(Car));
copy(C,&(Q->car[Q->front]));
printf("车辆出库\n");
printf("出库车辆信息如下\n");
PrintC(&(Q->car[Q->front]));
printf("出库时间:%02d:%02d:%02d:\n",h,m,s);
printf("总共收费%02f元",0.00003*(end-C->start));
DeC(&(Q->car[Q->front]));
Q->front=(Q->front+1)%100;
return C;
}
//些一个函数用来取出队列中的元素、
void DeD(GD *Q,Car *C)
{
int i=Q->front;
while((i+1)%100!=Q->rear)
{
if(strcmp(Q->car[i].carname,C->carname)==0)
{
DeC(Q->car);
printf("队列中同样删除成功\n");
break;
}
i++;
}
return;
}
void DeL(LinkList L,Car *C/*用来确定车的名字*/)//从链表中删除一辆车
{
LinkList p=L->next;
while(p&&strcmp(p->car.carname,C->carname))
{
p=p->next;
}
if(strcmp(p->car.carname,C->carname)==0)
{
DeC(&(p->car));
p->flag=0;
printf("删除成功\n");
}
}
int main(int argc, char **argv)
{
LinkList L;
Create(L);
int a;
GD Q;
Q.rear=Q.front=0;
printf("*******************************欢迎来到停车场**********************************\n");
printf("*******************************请输入你要干的事情*****************************\n");
int ci=1;
char carname[10];
Car *C;

while(1)
{
printf("调试专用\n");
printf("输入1:停车  输入2:找车 输入3: 出库 输入4:删除车 输入5:打印所有 输入6:退出系统\n");
scanf("%d",&a);
getchar();
switch(a)
{
//printf("调试专用\n");
case 1: {
IntCar(cars,ci);//先安顺序给数组赋值
ci++;
EnQueue(&Q,cars);//数组的元素原封不动的赋给队列
BubbleSort(cars,10);//按照vip值排序
ruku(L,cars);//排完序的数组元素赋给链表
break;
}
case 2:{
printf("请输入你想要查找的车的车牌号\n");
scanf("%s",carname);
C=Res(L,carname);
PrintC(C); //找出那两车并打印出车辆的信息
break;
}
case 3:{

C=chuku(&Q);//从对头出库一辆车
DeL(L,C);//删去链表中对应的车
printf("出库成功\n");
break;
}
case 4:{
printf("请输入你想要删除的车的车牌号\n");
scanf("%s",carname);
C=Res(L,carname);
PrintC(C);
DeL(L,C);
DeD(&Q,C);
break;
}
case 5:PrintList(L);break;
case 6:exit(1);break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言小项目