本小程序是本人写的一个简单的停车场系统,其功能为:现在有H辆车依次开进停车场,先进先停,车位VIP是按大到小排好的,所以还需对车的VIP进行排序,进去的车按其VIP等级停到相应位置上,排序后即为停车场里面停好后的顺序。在此期间我们可以按名字去查看某位车辆信息,或者把某辆车开走清空其信息,这个车位信息清0,另外,为了练一下循环队列,我出库是用队列实现的(将停好的链表按进来的顺序IP模拟入队再出队。),即出去是按照谁先进车库谁先开走,出去并打印其信息,出去完后清空车库信息(即清空VIP排好的链表)。
#include
#include
#include
#define LEN sizeof(struct CarPark)
#define MAXSIZE 20;
static int H; //保存进入停车场的数量。
typedef struct student //链表结构体里数据域data具体内容的一个结构体。
{
char name[20];
int IP;
int VIP;
char num[20];
}STU;
typedef struct CarPark //创建链表结构体。
{
STU data;
struct CarPark *next;
}CPK;
CPK *create() //创建带空头节点的链表,链表节点数为停车场车位数。
{
CPK *p1,*p2,*head;
head=(CPK*)malloc(LEN); // 创建空头节点。
head->next=NULL;
int n=1;
printf("请输入车辆的数量:");
scanf("%d",&H);
p1=p2=(CPK*)malloc(LEN);
printf("请您输入车主姓名:");
scanf("%s",p1->data.name);
printf("请您输入车进入顺序:");
scanf("%d",&(p1->data.IP));
printf("请您输入车主的VIP等级:");
scanf("%d",&(p1->data.VIP));
printf("请您输入车牌号:");
scanf("%s",p1->data.num);
head->next=p1;
while(n {
n++;
p1=(CPK*)malloc(LEN);
printf("请您输入车主姓名:");
scanf("%s",p1->data.name);
printf("请您输入车进入顺序:");
scanf("%d",&(p1->data.IP));
printf("请您输入车主的VIP等级:");
scanf("%d",&(p1->data.VIP));
printf("请您输入车牌号:");
scanf("%s",p1->data.num);
p2->next=p1;
p2=p1;
}
p2->next=NULL;
return head;
}
CPK *Newcar(CPK *head) //将按顺序开进来的车再按VIP等级从大到小排序依次停在VIP从大到小的车位上。
{
int i,j;
int e=0; //e=0表示未发生交换,e=1表示发生了交换。
CPK *p1,*p2,*p3;
p3=(CPK*)malloc(LEN); //开辟新节点便于交换节点使用。
p3->next=NULL;
for(j=1;j <= H-1;j++)
{
e=0;
p1=p2=head->next;
p1=p2->next;
while(p1!=NULL)
{
if(p2->data.VIP < p1->data.VIP) //如果前一个节点车辆VIP小于后一辆车的VIP等级,则交换两辆车所有信息(冒泡排序)。
{
strcpy(p3->data.name,p2->data.name);
p3->data.IP=p2->data.IP;
p3->data.VIP=p2->data.VIP;
strcpy(p3->data.num,p2->data.num);
strcpy(p2->data.name,p1->data.name);
p2->data.IP=p1->data.IP;
p2->data.VIP=p1->data.VIP;
strcpy(p2->data.num,p1->data.num);
strcpy(p1->data.name,p3->data.name);
p1->data.IP=p3->data.IP;
p1->data.VIP=p3->data.VIP;
strcpy(p1->data.num,p3->data.num);
e=1;
}
p2=p1;
p1=p1->next; //p1,p2都指向下一节点。
}
if(e==0)
break;
}
printf("按VIP等级已将车辆按VIP等级由大到小依次停完车!\n");
return head;
}
CPK *Destroy(CPK *head) //清空某位车主的信息,为了后续出库需求,但且不清空其进入顺序IP。
{
CPK *p;
p=head->next;
char name[20];
printf("请您输入您想炸毁的那辆车的车主姓名为:\n");
scanf("%s",name);
while(p->next != NULL && strcmp(p->data.name,name) != 0)
{
p=p->next;
}
if(strcmp(p->data.name,name) == 0)
{
strcpy(p->data.name,"0");
p->data.VIP=0;
strcpy(p->data.num,"0");
}
}
CPK *Lookcar(CPK *head) //察看某位车主信息。
{
CPK *p;
char name[20];
printf("请您输入想要查看的车辆信息的赌徒名字:\n");
scanf("%s",name);
p=head;
while(p->next!=NULL && strcmp(p->data.name,name)!=0)
{
p=p->next;
}
if(strcmp(p->data.name,name)==0)
{
printf("姓名:%s\t,进入顺序:%d\t,VIP等级:%d\t,车牌号:%s\n",p->data.name,p->data.IP,p->data.VIP,p->data.num);
}
else
{
printf("没有您想要查看的赌徒信息\n");
}
}
void Print(CPK *head) //遍历所有车辆信息。
{
CPK *p;
p=head->next;
while(p!=NULL)
{
printf("姓名:%s\t,进入顺序:%d\t,VIP等级:%d\t,车牌号:%s\n",p->data.name,p->data.IP,p->data.VIP,p->data.num);
p=p->next;
}
//while(p!=NULL);
}
typedef struct //创建队列。
{
STU data[20];
int front;
int rear;
}SQ;
SQ *InitQueue(SQ *Q) //初始化队列。
{
Q->front=0;
Q->rear=0;
return Q;
}
SQ *EnQueue(CPK *head,SQ *Q) //将链表按进入的先后顺序入队。
{
int i;
CPK *p;
for(i=1;i<=H;i++)
{
p=head->next;
while(p!=NULL && p->data.IP != i )
{
p=p->next;
}
if(p->data.IP==i) //按IP顺序入队。
{
strcpy(Q->data[Q->rear].name,p->data.name);
Q->data[Q->rear].IP=p->data.IP;
Q->data[Q->rear].VIP=p->data.VIP;
strcpy(Q->data[Q->rear].num,p->data.num);
Q->rear=(Q->rear+1)%20;
}
}
return Q;
}
CPK *Outcar(CPK *head,SQ *Q) //出队,将车全部开出停车场。
{
int b;
EnQueue(head,Q);
if(Q->rear==Q->front)
{
printf("队空,不能出队!");
return head;
}
for(b=1;b<=H;b++)
{
printf("本次出库的车辆信息为:\n");
printf("姓名:%s\t,进入顺序:%d\t,VIP等级:%d\t,车牌号:%s\n",Q->data[Q->front].name,Q->data[Q->front].IP,Q->data[Q->front].VIP,Q->data[Q->front].num);
Q->front=(Q->front+1)%20;
}
CPK *p;
p=head->next;
while(p!=NULL) //车全部开出车库,清空链表。
{
strcpy(p->data.name,"0");
p->data.IP=0;
p->data.VIP=0;
strcpy(p->data.num,"0");
p=p->next;
}
printf("车库所有的车已经出库成功!");
return head;
}
int main()
{
printf("==========欢迎来到拉斯维加斯皇家赌场VIP豪华停车场控制系统!=============\n");
printf("用链表来录入依次驶入皇家赌场的车辆,IP记录进入的顺序。\n");
CPK *head;
head=create();
SQ Q;
InitQueue(&Q);
while(1)
{
printf("请您输入你想要的操作:\n 1 . 将开来的辆车按VIP等级从高到低开入相应的车位。\n 2 . 炸毁欠赌账准备逃跑的那个人的那辆车。\n 3 查看某赌徒的车辆信息。\n 4 .显示停车场所有赌徒的车辆相关信息。\n 5 .按先进先出的顺序将车库里的车全部开走\n");
int a;
scanf("%d",&a);
switch(a)
{
case 1:{Newcar(head);break;}
case 2:{Destroy(head);break;}
case 3:{Lookcar(head);break;}
case 4:{Print(head);break;}
case 5:{Outcar(head,&Q);break;}
default:{printf("输入有误,请您重新输入!\n");break;}
}
}
}