数据结构课程设计:停车场

1要求:设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车时间的早晚依次从停车场最里面向大门口停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后近来的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟停车场管理。

实现提示:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)

例如:(‘A’,1,5)表示一号牌照车爱5这个时刻到达,而(‘D’,5,20)表示5号牌照车在20这个时刻离去,整个程序可以在输入信息为(‘E’,0,0)时结束。

基本要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。

 2.代码

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAX 2//车库容量 为了便于观察这里把车库容量设置为2

#define price 0.05 //每分钟每辆车的费用

typedef struct time{

    int hour;

    int min;

}Time;//时间结点

 

typedef struct node{

    char num[10];

    Time reach;

    Time leave;

}CarNode;//车辆信息结点

 

typedef struct NODE{

    CarNode *stack[MAX+1];

    int top;

}SeqStackCar;//模拟车站

 

typedef struct car{

    CarNode *data;

    struct car *next;

}QueueNode;

 

typedef struct Node{

    QueueNode *front;

    QueueNode *rear;

}LinkQueueCar;//模拟通道

 

///////////////////////////////////////////////////*定义方法*/

void InitStack(SeqStackCar*);//初始化车站

int InitQueue(LinkQueueCar*);//初始化便道

int Arrival(SeqStackCar*,LinkQueueCar*);//车辆到达

void Leave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);//车辆离开

void List(SeqStackCar,LinkQueueCar);//显示存车信息

/////////////////////////////////////////////*主函数*/

void main()

{

    SeqStackCar Enter,Temp;

    LinkQueueCar Wait;

    int ch;

    InitStack(&Enter);//构造一个空栈

    InitStack(&Temp);//

    InitQueue(&Wait);//构造一个空队列

    while(1)

    {

       printf(“/n1.车辆到达 “);

       printf(“/n2.车辆离开“);

       printf(“/n3.列表显示“);

       printf(“/n4.退出系统/n”);

       while(1)

       {

           printf(“/n请选择:1  2  3  4″);

      

           scanf(“%d”,&ch);

           if(ch<1&&ch>4)//当不符合要求时重新进行选择

           {

              break;

           }

           else

           {//否则则进行方法的操作

      

           switch(ch)

           {

           case 1:

              Arrival(&Enter,&Wait);

              break;//车辆到达的操作

           case 2:

              Leave(&Enter,&Temp,&Wait);

              break;//车辆离开的操作

           case 3:

              List(Enter,Wait);

              break;//列表显示的操作

           case 4:

              exit(0);//退出系统的操作

           default:

              break;

           }

           }

       }

    }

}

///////////////////////////////////////////*车场的初始化  */

    void InitStack(SeqStackCar *s)//

    {

       int i;

       s->top=0;//栈为空

       for(i=0;i<=MAX;i++)

           s->stack[s->top]=NULL;//初值为空

    }

///////////////////////////////////////////////*便道的初始化  队列的链式结构*/

    int InitQueue(LinkQueueCar *Q)

    {

       Q->front=(QueueNode*)malloc(sizeof(QueueNode));

       if(Q->front!=NULL)

       {

           Q->front->next=NULL;//队列头结点为空

           Q->rear=Q->front;

           return (1);

       }else{

           return (0);

       }

    }

///////////////////////////////////////////////*离站所进行的操作*/

    void PRINT(CarNode *p,int room){

       int A1,A2,B1,B2;

       printf(“/n请输入离开的时间:“);

       scanf(“%d:%d”,&(p->leave.hour),&(p->leave.min));

       printf(“/n离开车辆的车牌号为:“);

       puts(p->num);

       printf(“/n其到达时间为:%d:%d”,p->reach.hour,p->reach.min);

       printf(“离开时间为:%d:%d”,p->leave.hour,p->leave.min);

       A1=p->reach.hour;

       A2=p->reach.min;

       B1=p->leave.hour;

       B2=p->leave.min;

       printf(“/n应缴费用为:%2.1f“,((B1-A1)*60+(B2-A2))*price);

       free(p);

    }

//////////////////////////////////////////////*车辆到达*/

    int Arrival(SeqStackCar *Enter,LinkQueueCar *W)

    {

       CarNode *p;

       QueueNode *t;

       p=(CarNode *)malloc(sizeof(CarNode));//生成结点

       flushall();//清除所有缓冲区

       printf(“/n请输入车牌号:“);

       gets(p->num);//得到车牌号

       if(Enter->top<MAX){//判断 如果停车场未满 则进入

           Enter->top++;//top指针加一

           printf(“/n车辆在停车场内的第%d位置“,Enter->top);

           printf(“/n请输入到达时间:“);

           scanf(“%d:%d”,&(p->reach.hour),&(p->reach.min));

           Enter->stack[Enter->top]=p;//车辆进栈

           return (1);

       }else{

           printf(“/n该车须在便道等候!”);

           t=(QueueNode*)malloc(sizeof(QueueNode));

           t->data=p;//把车辆信息存入队列的结点  即车辆停在便道

           t->next=NULL;//t结点的下一个结点为空

           W->front->next=t;//头指针的下一个为t

           W->rear=t;//尾指针指向t

           return (1);

       }

    }

//////////////////////////////////////////*出栈*/

    void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)

    {

       int i,room;

       CarNode *p,*t;

       QueueNode *q;

       /*判断车场内是否有车*/

       if(Enter->top>0)

       {

           while(1)

           {

              printf(“/n请输入车在车场的位置:“,Enter->top);

              scanf(“%d”,&room);

              if(room<1&&room>=Enter->top)

              {

                  break;

              }

              while(Enter->top>room)

              {

                  Temp->top++;//top指针加一

                  Temp->stack[Temp->top]=Enter->stack[Enter->top];//把停车场里的车放                                                                 temp                                 

                  Enter->stack[Enter->top]=NULL;//把停车场里的位置清空

                  Enter->top–;//top指针减一同时

              }

              p=Enter->stack[Enter->top];

              Enter->stack[Enter->top]=NULL;

              Enter->top–;

              while(Temp->top>=1)

              {

                  Enter->top++;//当车出去后原来的车回到停车场

                  Enter->stack[Enter->top]=Temp->stack[Temp->top];

                  Temp->stack[Temp->top]=NULL;

                  Temp->top–;

              }

              PRINT(p,room);//离开停车场的信息

              if((W->front!=W->rear)&&Enter->top<MAX)//如果便道上有车 并且停车场里有                                                   空位                                     

              {

                  q=W->front->next;//把便道里的车赋给q

                  t=q->data;//车的信息赋给t

                  Enter->top++;

                  printf(“/n便道的%s号车进入车场第%d位置。“,t->num,Enter->top);

                  printf(“/n请输入现在的时间:“);

                  scanf(“%d:%d”,&(t->reach.hour),&(t->reach.min));

                  W->front->next=q->next;//头指针指向q的下一个

                  if(q==W->rear)//如果便道里没车

                  {

                     W->rear=W->front;//清空

                     Enter->stack[Enter->top]=t;//进入停车场

                     printf(“/n便道里没车/n”);             

                     free(q);

                  }

                  break;

              }  

               else

              {

                  printf(“/n车场里没车。“);

              }

              break;

           }  

       }

    }

                 

//////////////////////////////////////////////////*列表的显示信息*/

           void List1(SeqStackCar *s)

           {

              int i;

              if(s->top>0)

              {

                  printf(“/n车场“);

                  printf(“/n位置  到达时间  车牌号/n”);

                  for(i=1;i<=s->top;i++)

                  {

                     printf(“%d%10d:%d      “, i,  s->stack[i]->reach.hour,  s->stack[i]->reach.min);

                     puts(s->stack[i]->num);

                  }

              }

              else

             

                  printf(“/n车场里没车“);

           }

/////////////////////////////////////*便道里的信息*/

           void List2(LinkQueueCar *w)

           {

              QueueNode *p;

              p=w->front->next;

              if(w->front!=w->rear)

              {

                  printf(“/n等待的车辆的号码为:“);

                  while(p!=NULL)

                  {

                     puts(p->data->num);

                     p=p->next;

                  }

              }

              else printf(“/n便道里没有车。“);

           }

          

//////////////////////////////////////////////////////

           void List(SeqStackCar s,LinkQueueCar w)

           {

              int flag,m;

              flag=1;

              while(flag)

              {

                  printf(“/n请选择 1 2 3″);

                  printf(“/n1.车场 /n2.便道 /n3.返回“);

                  while(1)

                  {

                     scanf(“%d”,&m);

                     if(m>=1||m<=3)

                         break;

                     else printf(“/n”);

                  }

                  switch(m)

                  {

                  case 1:

                     List1(&s);

                     break;

                  case 2:

                     List2(&w);

                     break;

                  case 3:

                     flag=0;

                     break;

                  default:

                     break;

                  }

              }

           }

 

 

    原文作者:停车场模拟问题
    原文地址: https://blog.csdn.net/zhanghuiming/article/details/4284317
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞