C语言写的停车场控制系统

       本小程序是本人写的一个简单的停车场系统,其功能为:现在有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;}   
  }
 }
}



注:初始化链表的时候,IP为进入的排序,所以按照先后顺序定义。

你可能感兴趣的:(c语言学习)