回 帖 发 新 帖 刷新版面

主题:停车场管理

#include <stdio.h>
#include <stdlib.h>
#define Max 4
#define Max1 100
typedef struct 
{
        int data1[Max];
        int data2[Max];
        int top;
}SqStack;
typedef struct qnode 

        int data1;
        int data2;
        struct qnode *next;
}QNode;
typedef struct
{
        QNode *front;
        QNode *rear;
}LiQueue;
void InitStack(SqStack *&s)                      //初始化顺序栈 
{
     s=(SqStack *)malloc(sizeof(SqStack));
     s->top=-1;
}
void Push(SqStack *&s,int a,int b)                //元素入栈   
{
    s->top++;
    s->data1[s->top]=a;
    s->data2[s->top]=b;
}
void InitQueue(LiQueue *&q)                     //初始化链队 
{
     q=(LiQueue *)malloc(sizeof(LiQueue));
     q->front=q->rear=NULL;
}
void enQueue(LiQueue *&q,int a,int b)          //元素入对队 
{
     QNode *s;
     s=(QNode *)malloc(sizeof(QNode));
     s->data1=a;
     s->data2=b;
     s->next=NULL;
     if(q->rear==NULL)
       q->front=q->rear=s;
     else
     {
         q->rear->next=s;
         q->rear=s;
     }
}
int deQueue(LiQueue *&q,int &a,int &b)           //队首元素出队 
{
    QNode *t;
    if(q->rear==NULL)
       return 0;
    t=q->front;
    if(q->front==q->rear)
       q->front=q->rear=NULL;
    else
       q->front=q->front->next;
    a=t->data1;
    b=t->data2;
    free(t);
    return 1;                  
}
void SqStackCopy(SqStack *&s1,SqStack *&s2,int i)   //将栈s1中第i+1个之后的元素到栈顶元素退栈到栈s2中      
{
     while(s1->top>i)
     {
                      s2->top++;
                      s2->data1[s2->top]=s1->data1[s1->top];
                      s2->data2[s2->top]=s1->data2[s1->top];
                      s1->top--;
     }
}
void feecharge(int a,int b)                    //收费函数 
{
     int t;
     t=(b-a)*2;
     printf("该车离开,该车应收费:%d元\n",t); 
}
void print(SqStack *s,LiQueue *q)            //打印当前停车场和便道的停车情况 
{
     QNode *p;
     printf("现在停车场的车辆有:");
     while(s->top!=-1)
     {
                      printf("%d,%d  ",s->data1[s->top],s->data2[s->top]);
                      s->top--;
     }
     printf("\n");
     printf("现在便道的车辆有:");
     p=q->front;
     while(p!=NULL)
     {
                   printf("%d,%d  ",p->data1,p->data2);
                   p=p->next;
     }
     printf("\n");
}    
int main(void)
{
     SqStack *s1,*s2;
     LiQueue *q;
     QNode *p,*w;
     int r,i,a,b,m,n,k,t,u=0;
     InitStack(s1);                                         //s1初始化 
     InitStack(s2);                                         //s2初始化 
     InitQueue(q);                                          //q初始化  
     print(s1,q);
     for(r=0;r<Max1;r++)
     {
       printf("请输入车辆的编号,到达或离开的时间\n"); 
       scanf("%d,%d",&m,&n);
       printf("请输入处理车辆的代号<1:到达,2:离开,3:结束>:");
       scanf("%d",&k);
       if(k==1)                                         //该车进入停车场          
        {
           if(s1->top!=Max-1)                                  //s1未满时 
           {
              Push(s1,m,n);                            //车进入停车场 
              print(s1,q);
           }
           else                                           //车停在便道 
           { 
              enQueue(q,m,n); 
              print(s1,q);
           } 
        } 
       if(k==2)                                        //查找是否有编号为m的车 
        {
           for(i=0;i<=s1->top;i++)                     //在停车场里查找是否有编号为m的车       
             {
                if(s1->data1[i]==m)                    //停车场有编号为m的车 
                 {  
                     printf("停车场有编号为%d的车\n",m);
                     u=1;
                     SqStackCopy(s1,s2,i);              //停车场里编号为m的车之后的车都退栈到s2 
                     s1->top--;                         //编号为m 的车开离停车场 
                     SqStackCopy(s2,s1,-1);             //s2中的车全部进栈到s1中 
                     feecharge(s1->data2[i],n);         //编号为m的车应收的费用 
                     if(q->rear!=NULL)
                     {
                       deQueue(q,a,b);                  //便道的队首车辆出队 
                       Push(s1,a,b);                    //便道的队首车辆进入停车场 
                     }
                     print(s1,q);
                 }
             } 
           if(u==0)                                     //若停车场未找到编号为m的车 
             {
                if(q->rear!=NULL)                       //便道有车时,在便道查找是否有编号为m的车 
                {
                   p=q->front;
                   if(p->data1==m)                       //便道的队首元素就是编号为m的车,直接队首元素出队,不要交费 
                      deQueue(q,m,n);
                   else                                  //在队首以后的结点中查找编号为m的车 
                   {
                       while(p!=NULL)
                       {
                          if(p->data1==m)                    //便道有编号为m的车 
                           {
                             printf("便道有编号为%d的车\n",m);
                             w=q->front;
                             while(w!=NULL)                 //查找便道编号为m的车之前的车 
                             {
                                if(w->next==p)
                                    break;
                                else
                                    w=w->next;
                             }
                             w->next=p->next;
                             free(p);                    //便道上编号为m的车直接离开,不需要交费 
                             u=1;
                             print(s1,q);
                           }
                           if(u==1)
                              break;
                           else
                              p=p->next;
                      }
                   }
                }
              }  
              if(u==0)
                  printf("停车场和便道都不存在编号为%d的车\n",m);
        }
        if(k==3)
           break;
    }
  system("PAUSE");    
  return 0;
}

回复列表 (共3个回复)

沙发


补充说一下,主要是找下该程序的错误的地方。当有元素入栈时,只显示当前元素,而不显示之前保存的元素。不知道怎么改,故来求助大家,麻烦大家了。

板凳

print函数有问题,s->top是车辆计数,你不能循环中改变它的值。

3 楼


路过了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册