停车场项目链表入库队列进出库带收费优化升级版
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; }
相关文章推荐
- 运用链表和队列实现停车场的一些简易功能
- 捷力恒ORACLE升级优化项目完成
- 洛谷 1456 隐藏口令 (链表/队列优化)
- Linux 停车场(链表,链栈,顺序队列)----简易版
- 停车场项目 停放栈 让路栈 等候队列
- 第七周实践项目6 停车场模拟(栈和队列综合)
- HDU 6215 模拟链表 + 队列优化
- 第七周 数据结构实践——停车场模拟(栈和队列综合)【项目6 - 停车场模拟】
- 我的阿里框架升级项目总结(谈体验优化与用户习惯的延续)
- 停车栈让路栈等候队列完成停车场项目
- 链表与表——随心所欲地进出任何队列
- DP项目开发随记2-战斗模块升级优化
- 数据结构第七周项目-停车场模拟(栈和队列综合)
- 停车场进出库系统(链表和队列)链表要按照VIP等级从大到小(简易版)
- 2003年我程序员职业的第一桶金7万元的【教育集团招生收费系统】项目经验、项目来龙去脉分享
- 停车场(栈和队列练习)
- VC6项目升级为VC2005
- 优先队列优化 dijkstra
- 升级Create React App的项目
- 第七周 项目3-负数把正数赶出队列