在数据结构这部分学习结束后,写一个小项目,我想是对这部分知识一个很好的运用过程。
我在这介绍我写的一个项目,游戏停车场(这个版本只是初级版,可以在这之上继续添加很多其他功能,大家可以自己尝试)。
功能要求如下:
程序如下:
/***************************************************************************
项目要求
游戏VIP停车场
问题描述:停车场是一个能放10辆车的车场(链表实现), 汽车按到达的先后次序停放
在等候区。若等候区满了(10辆车),按汽车的VIP等级(两种排序方法),依次停入停车场 ,在停
车期间,我们可以通过汽车牌号查找汽车相关信息,并且可以随意删除其中一辆汽车,汽车
离开要按等候区的顺序依次离开(使用队列实现)汽车离开时按停放时间收费。
***************************************************************************/
#include
#include
#include
#include
#define LEN sizeof(struct parking)
#define MAXSIZE 10 //车库大小,可自定义大小,这里默认为10
#define MONEY 0.002 //收费价格,这里默认为1分钟,收费0.12元
typedef struct parking
{
char number[10]; //车辆信息
int vip; //车辆VIP等级
int time1; // 进入停车场时间
int time2; // 离开停车场时间
int count; //标记车辆,后面入队时使用
struct parking*next;
}car;
static int n = 0; //全局变量,用于标记车辆数目,计算车位
car c;
void menu()
{
printf("\t==============欢迎来到中南国际停车场=============\n");
printf ("\t******************目前停车场状况*****************\n");
printf ("\t停车场共有%d个车位,当前停车场剩余%d车位\n", MAXSIZE,MAXSIZE - n);
printf ("\t*************************************************\n");
printf("\t================1,停入车辆=======================\n");
printf("\t================2,VIP等级排序车辆================\n");
printf("\t================3,驶出所有车辆(队列)==============\n");
printf("\t================4,查找车辆=======================\n");
printf("\t================5,遍历停车场全部车辆信息=========\n");
printf("\t================6,驶出指定车辆===================\n");
printf("\t================7,退出===========================\n");
}
struct parking *creat() //创建链表,用于存放车辆信息
{
struct parking*p1,*p2,*head;
head = NULL; //为方便后面排序,这里创建不带头结点的链表
int i = 1;
p1=p2=(struct parking*)malloc(LEN);
printf("输入车辆VIP等级:\n");
scanf("%d",&p1->vip);
printf("输入车牌号:\n");
scanf("%s",p1->number);
p1->count = i;
time_t t1;
long int t = time(&t1); // 标记进入停车场的时间
c.time1 = t;
char* t2;
t2 = ctime(&t1); // 获取当前时间
printf("牌照为%s的汽车停入等候区成功,当前时间:%s\n",p1->number,t2); //显示停车场状况,以及停入时间
while(p1->vip != 0 && i <= 10)
{ //由于不带头结点,这里创建时考虑了三种插入方法
n = n+1;
if(n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct parking*)malloc(LEN);
printf("输入车辆VIP等级:\n");
scanf("%d",&p1->vip);
printf("输入车牌号:\n");
scanf("%s",p1->number);
i++;
p1->count = i;
time_t t1;
long int t = time(&t1); // 标记进入停车场的时间
c.time1 = t;
char* t2;
t2 = ctime(&t1); // 获取当前时间
printf("牌照为%s的汽车停入等候区成功,当前时间:%s\n",p1->number,t2); //显示停车场状况,以及停入时间
}
p2->next = NULL;
printf("等候区以满\n");
return head;
}
struct parking *Sort(struct parking *head)//链表排序,冒泡排序
{
struct parking *p,*q,*s;
int t,a,m;
char arr[10];
printf("请输入排序方式:(1:冒泡排序法 0:选择排序法)\n");
scanf("%d",&a);
if(a = 1)
{
for(p = head;p != NULL;p = p->next)
{
for(q = p->next;q != NULL;q = q->next)
{
if(p->vip < q->vip)//降序
{
t = q->vip; //按VIP等级交换结点数据
q->vip = p->vip;
p->vip = t;
strcpy(arr,q->number);
strcpy(q->number,p->number);
strcpy(p->number,arr);
m = q->count;
q->count = p->count;
p->count = m;
}
}
}
return head;
}
else //选择排序法
{
for(p = head;p != NULL;p = p->next)
{
s = p; //s标记为最大值
for(q = p->next;q != NULL;q = q->next)
{
if(p->vip < q->vip)//降序
{
s = q;
}
if(s != p)
{
t = q->vip; //按VIP等级交换结点数据
q->vip = p->vip;
p->vip = t;
strcpy(arr,q->number);
strcpy(q->number,p->number);
strcpy(p->number,arr);
m = q->count;
q->count = p->count;
p->count = m;
}
}
}
return head;
}
}
typedef struct QueueNode //先入先出(队列)Vip离场
{
int data;
struct QueueNode *next;
}Queue,*QueuePtr;
typedef struct
{
QueuePtr front,rear; //队列指针
}LinkQueue;
LinkQueue* CreateQueue(LinkQueue *Q) //创建队列
{
Q = (LinkQueue*)malloc(sizeof(LinkQueue));
Q->front = Q->rear = (QueuePtr)malloc(sizeof(Queue));
Q->front->next = NULL;
return Q;
}
void Push(struct parking *head,LinkQueue* Q) //入队操作,按链表中一开始车辆标号顺序
{
struct parking *p;
p = head;
while(p!=NULL)
{
QueuePtr s = (QueuePtr)malloc(sizeof(Queue));
s->data = p->count; //队列只记录车辆一开始的标号信息
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
p = p->next;
}
}
struct parking Exert1(struct parking *head,int e) //按等候区顺序出队(一辆)
{
struct parking *p;
p = head;
while(p != NULL && p->count != e)
{
p = p->next;
}
if(p->count == e)
{
time_t t1;
long int t = time(&t1); // 标记显示时的时间
printf ("车牌号\tVIP等级\t\t停放时长\t当前所需支付金额\n"); //打印查到的车辆信息
printf ("%s\t%d\t\t%d秒\t\t%2.3f元\n",p->number,p->vip,t - c.time1, MONEY * (t - c.time1));
}
}
int Pop(struct parking *head,LinkQueue *Q) //按等候区顺序出队(全部)
{
QueuePtr p;
int i = 1;
if(Q->front == Q->rear)
{
printf("停车场无车辆!\n");
return 0;
}
else
{
for(i;i <= 10;i++) //按等候区顺序出队(全部)
{
p = Q->front->next;
Q->front->next = p->next; //出队操作
if(Q->rear == p)
Q->rear = Q->front;
Exert1(head,i); //调用函数,实现按等候区顺序出一辆车
}
}
}
struct parking *Exert(struct parking *head,char number[10]) //驶出指定车辆
{
struct parking *p1,*p2;
p1 = head;
p2 = p1;
while(p1->next !=NULL && strcmp(p1->number,number) != 0)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->number,number) == 0) //不带头结点,这里有三种删除车辆的辨别
{
if(p1 == head)
{
head = head->next; //头,中间,尾,三种删除方式
printf("驶出车辆成功\n");
n--;
}
else
{
p2->next = p1->next;
printf("驶出车辆成功\n");
n--;
}
time_t t1;
long int t = time(&t1);
c.time2 = t; // 标记离开停车场的时间
char* t2;
t2 = ctime(&t1); // 获取当前时间
printf("离开时间%s\n需付%2.3f元\n",t2,MONEY * (c.time2 - c.time1)); //显示停车场状况以及驶出时间和收费情况
}
else
{
printf("停车场没此车辆!\n");
}
free(p1);
return head;
}
struct parking *find(struct parking *head,char number[20]) //查找指定车辆
{
struct parking *p1;
p1 = head;
while(p1->next != NULL && strcmp(p1->number,number)!=0)
{
p1 = p1->next;
}
if(strcmp(p1->number,number)==0) //打印查到的车辆信息
{
printf("查找成功,车辆信息如下:\n");
time_t t1;
long int t = time(&t1); // 标记显示时的时间
printf ("车牌号\tVIP等级\t\t停放时长\t当前所需支付金额\n"); //打印查到的车辆信息
printf ("%s\t%d\t\t%d秒\t\t%2.3f元\n",p1->number,p1->vip,t - c.time1, MONEY * (t - c.time1));
}
else
printf("停车场没此车辆!\n");
}
void show(struct parking *head) //显示车库现有车辆
{
struct parking *p;
p = head;
if(head != NULL)
{
do
{
time_t t1;
long int t = time(&t1); // 标记显示时的时间
printf ("车牌号\tVIP等级\t\t停放时长\t当前所需支付金额\n"); //打印查到的车辆信息
printf ("%s\t%d\t\t%d秒\t\t%2.3f元\n",p->number,p->vip,t - c.time1, MONEY * (t - c.time1));
p = p->next;
}while(p != NULL);
}
else
printf("停车场无车辆!\n");
}
int main()
{
int n = 1;
int i;
struct parking *head; //初始化链表
LinkQueue q;
LinkQueue* Q = &q;
Q = CreateQueue(Q);
char number[10];
while(n)
{
system("clear");
menu();
printf("请输入你的骚操作:\n");
scanf("%d",&i);
switch(i)
{
case 1:{head = creat();Push(head,Q);break;} //创建链表,并创建队列
case 2:{head = Sort(head);break;} //按vip排序
case 3:{Pop(head,Q);break;} //按等候区顺序出队(全部)
case 4:
{
printf("请输入查找车辆的车牌号:\n"); //查找指定车辆
scanf("%s",number);
find(head,number);break;
}
case 5:{show(head);break;} //显示车库现有车辆
case 6:
{
printf("请输入要驶出车辆的车牌号:\n"); //驶出指定车辆
scanf("%s",number);
head = Exert(head,number);break;
}
default:{break;}
}
}
}
功能的实现,有很多方法,如果大家有自己的想法,可以评论,大家互利共进。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。