chechang.cpp
上传用户:wahhaolin
上传日期:2008-04-18
资源大小:3k
文件大小:9k
源码类别:

数据结构

开发平台:

Visual C++

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<iostream.h>
  5. #define OK 1
  6. #define ERROR 0
  7. #define OVERFLOW -2
  8. typedef int status;
  9. typedef struct{
  10.   char type;
  11.   char num[5];
  12.   int time;
  13. }ElemType,*LElemType;
  14. typedef struct{
  15.  LElemType base;
  16.  LElemType top;
  17.  int stacksize;
  18. } sqstack;     //存储车场停车信息的栈
  19. typedef struct QNode{
  20.   ElemType data;
  21.   struct QNode *next;
  22. }QNode,*Queueptr;  
  23. typedef struct{
  24.  Queueptr front;
  25.  Queueptr rear;
  26. } LinkQueue;    //存储便道停车信息的队列
  27. typedef struct LNode{
  28.  char ch[5];
  29.  struct LNode *next;
  30. }LNode,*ListType;
  31. typedef struct{
  32.  ListType head,tail;
  33.  int size;
  34. } tagList;     //存储场内车牌号的链表
  35. //全局变量
  36. sqstack garage,giveway;
  37. LinkQueue waitway;
  38. LElemType elem;
  39. tagList L;
  40. int n,i=1,j=1;
  41. status InitStack(sqstack &s,int n);
  42. status Push(sqstack &s,ElemType e);
  43. status Pop(sqstack &s,ElemType &e);
  44. status InitQueue(LinkQueue &Q);
  45. status Gethead(LinkQueue s,ElemType &e);
  46. status EnQueue(LinkQueue &Q,ElemType e);
  47. status DeQueue(LinkQueue &Q,ElemType &e);
  48. status DestroyQueue(LinkQueue &Q);
  49. status InitList(tagList &L);
  50. status MakeNode(ListType t,char &c);
  51. status Insert(tagList &L,ListType t);
  52. status judgenum(char num[]);
  53. void printmessage();
  54. void DeleteL(char num[]);
  55. void count(LElemType q,char wh);
  56. void Readmessage(char &c);
  57. void Interpret(char c);
  58. status InitStack(sqstack &s,int n)
  59. { s.base=(LElemType)malloc(n*sizeof(ElemType));
  60.   if(!s.base) exit(OVERFLOW);
  61.   s.top=s.base;
  62.   s.stacksize=n;
  63.   return OK;
  64. }
  65. status Push(sqstack &s,ElemType e)
  66. { *s.top=e;
  67.    s.top++;
  68.   return OK;
  69. }
  70. status Pop(sqstack &s,ElemType &e)
  71. {if(s.top==s.base) return ERROR;
  72. e=*--s.top;
  73. return OK;
  74. }
  75. status InitQueue(LinkQueue &Q)
  76. { Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
  77.   if(!Q.front) exit(OVERFLOW);
  78.   Q.front->next=NULL;
  79.   return OK;
  80. }
  81. status DestroyQueue(LinkQueue &Q)
  82. { while(Q.front){
  83. Q.rear=Q.front->next;
  84. free(Q.front);
  85. Q.front=Q.rear;
  86. }
  87. return OK;
  88. }
  89. /*status Gethead( LinkQueue s,ElemType &e)
  90. { if(s.front==s.rear) return ERROR;
  91.   e=s.front->data;
  92.   return OK;
  93. }*/
  94. status EnQueue(LinkQueue &Q,ElemType e)
  95. { Queueptr p;
  96.   Q.rear->data=e;
  97.   p=(Queueptr)malloc(sizeof(QNode));
  98.   if(!p) exit(OVERFLOW);
  99.   p->next=NULL;
  100.   Q.rear->next=p;
  101.   Q.rear=p;
  102.   return OK;
  103. }
  104. status DeQueue(LinkQueue &Q,ElemType &e)
  105. { if(Q.front==Q.rear) return ERROR;
  106.   Queueptr p=Q.front;
  107.   e=p->data;
  108.   Q.front=p->next;
  109.   if(Q.rear==p->next) Q.rear=Q.front;
  110.   free(p);
  111.   return OK;
  112. }
  113. status InitList(tagList &L)
  114. { L.head=new(LNode);
  115.   L.tail=L.head;
  116.   L.size=0;
  117.   for(int i=0;i<5;i++)
  118.   L.head->ch[i]='0';
  119.   return OK;
  120. }
  121. status MakeNode(ListType t,char c[])
  122. { for(int i=0;i<5;i++)
  123.      t->ch[i]=c[i];
  124.   t->next=NULL;
  125.   return OK;
  126. }
  127. status Insert(tagList &L,ListType t)
  128. { L.tail->next=t;
  129.   L.tail=t;
  130.   L.tail->next=NULL;
  131.   return OK;
  132. }
  133. status judgenum(char num[])
  134. { int i=0;
  135.   ListType q=NULL;
  136.   if(L.size>0) q=L.head->next;
  137.   while(q)
  138.   { if(strcmp(num,q->ch)) i=1;
  139.     q=q->next;
  140.   }
  141.   return i;
  142. }
  143. void DeleteL(char num[])
  144. { ListType q=L.head->next,R=L.head;
  145.   while(q)
  146.   { if(!strcmp(q->ch,num))
  147.   { R->next=q->next;
  148.     if(q==L.tail) L.tail=R;
  149. delete(q);
  150. q=R->next;
  151. L.size--;
  152.   }
  153.   else {R=R->next;q=q->next;}
  154.   }
  155. }
  156. void count(ElemType q,char wh) 
  157. { cout<<endl;
  158.   cout<<"车    型:  ";
  159.   if(q.type=='p')
  160.   {cout<<"客车                 ";
  161.    cout<<"收费标准:  ";
  162.    if(wh=='g')  cout<<"0.15";
  163.       else cout<<"0.075";
  164.    cout<<"  元/分钟        "<<endl;
  165.   }
  166.      else if(q.type=='t')
  167.  { cout<<"卡车                  ";
  168.    cout<<"收费标准:  ";
  169.    if(wh=='g')  cout<<"0.3";
  170.            else cout<<"0.15";
  171.    cout<<"  元/分钟        "<<endl;
  172.  }
  173.    else { cout<<"小汽车                ";
  174.           cout<<"收费标准:  ";
  175.       if(wh=='g')  cout<<"0.1";
  176.                   else cout<<"0.05";
  177.   cout<<"  元/分钟        "<<endl;
  178.    }
  179.   
  180.   cout<<"停车时间:  "<<elem->time-q.time<<"   分钟           ";
  181.   cout<<"   收费金额:  ";
  182.   if(wh=='g')
  183.   {  if(q.type=='p')
  184.    cout<<0.15*(elem->time-q.time)<<"  元";
  185.          else if(q.type=='t')
  186.               cout<<0.30*(elem->time-q.time)<<"  元";
  187.              else cout<<0.1*(elem->time-q.time)<<"  元";
  188.  
  189.   }
  190.   else { if(q.type=='p')
  191.    cout<<0.075*(elem->time-q.time)<<"  元";
  192.          else if(q.type=='t')
  193.               cout<<0.15*(elem->time-q.time)<<"  元";
  194.              else cout<<0.05*(elem->time-q.time)<<"  元";
  195.   }
  196.   cout<<endl;
  197.   cout<<"-----------------------------------------------------------------------------"<<endl;
  198. }
  199. int main()
  200.   char c='E';
  201.   elem=new(ElemType);
  202.   elem->time=0;
  203.   printmessage();
  204.   InitList(L);
  205.   cout<<"请输入车场总车位数:";
  206.   cin>>n;
  207.   InitStack(garage,n);
  208.   InitQueue(waitway);
  209.   do{
  210.   Readmessage(c);
  211.   Interpret(c);
  212.   }while(c!='E');
  213.   return 0;
  214. }
  215. void printmessage()
  216. {
  217.  printf("n");
  218.  printf("*******************************停车场管理操作程序*******************************n");
  219.  printf("设计者:刘永杰       专业:工程力学02级       学号:0243053018     日期:27/10/2004n");    ;
  220.  printf("--------------------------------------------------------------------------------n");
  221.  printf("程序功能:n");
  222.  printf("请用户按提示信息输入!n");
  223.  printf("--------------------------------------------------------------------------------");
  224. }
  225. void Readmessage(char &c)
  226.   char h;
  227.   char num[5];
  228.   int time=0;
  229. again1:;
  230.   cout<<"n请输入车辆的情况,'A'代表进站,'D'代表出站,'E'代表结束:";
  231.   cin>>c;
  232.   if(c!='A'&&c!='D'&&c!='E')
  233.   { cout<<"输入不正确,请按要求重新输入!"<<endl;goto again1;}
  234.   if(c=='D') {cout<<endl;goto again3;}
  235.   if(c=='E') goto end;
  236.   cout<<endl;
  237. again2:; 
  238.   cout<<"请输入该车的类型,'p'代表客车,'t'代表卡车,'c'代表小汽车:";
  239.   cin>>h;
  240.   if(h!='p'&&h!='t'&&h!='c')
  241.   { cout<<"输入不正确,请按要求重新输入!"<<endl;goto again2;}
  242.   elem->type=h;
  243.   cout<<endl;
  244. again3:;
  245.    cout<<"请输入该车的车牌:";
  246.    cin>>num;
  247.    if(c!='D')
  248.    {if(judgenum(num)) {cout<<"该车牌已存在!请重新输入!"<<endl;goto again3;}
  249.      else { ListType s;
  250.             s=new(LNode);
  251.     MakeNode(s,num);
  252.     Insert(L,s);
  253.  }
  254.    }
  255.   strcpy(elem->num,num);
  256.   cout<<endl;
  257. again4:;
  258.   if(c=='A') cout<<"请输入该车进车场时间:";
  259.       else cout<<"请输入该车出车场的时间:";
  260.   cin>>time;
  261.   if(time<=elem->time)
  262.   { cout<<"时间必须递增!请重新输入!"<<endl;
  263.     goto again4;
  264.   }
  265.   elem->time=time;
  266.   cout<<endl;
  267. end:;
  268. }
  269. void Interpret(char c)
  270. { if(c=='A')
  271. {if(garage.top-garage.base<garage.stacksize)
  272.    { Push(garage,*elem);
  273.      cout<<"请停在车场第 "<< i<<" 号车位!"<<endl;
  274.      i++;
  275.    }
  276.   else{ EnQueue(waitway,*elem);
  277.         cout<<"请停在便道!"<<endl;
  278.         j++;
  279.   }
  280. }
  281.       else if(c=='D')
  282.   { int k=1;
  283.     LElemType s,g;
  284.         ElemType e;
  285. Queueptr q;
  286. char wh='g';
  287. s=garage.base;
  288. while(strcmp(s->num,elem->num)&&k<i)
  289. { s++;k++;}
  290. if(k>=i)
  291. { q=waitway.front;
  292.   k=1;
  293.   while(strcmp(s->num,elem->num)&&k<j)
  294.   { q++;k++;}
  295.   if(k<j) wh='w';
  296.     else wh='n';
  297. }
  298. //计算停车费
  299. if(wh=='g') 
  300. { cout<<"-----------------------------------该车在车场内--------------------------------"<<endl;
  301.   count(*s,wh);
  302. }
  303.    else if(wh=='w') 
  304.    { cout<<"-----------------------------------该车在便道内---------------------------------"<<endl;
  305.       count(q->data,wh);
  306.    }
  307.         else { cout<<"该车没在停车场内!"<<endl;goto end;}
  308.        //让路情况
  309. if(wh=='g')     //从车场开走
  310. { i--;
  311.   DeleteL(s->num);
  312.   if(++s!=garage.top)
  313.   { 
  314.     giveway.base=s;
  315.     giveway.top=garage.top;
  316.     giveway.stacksize=giveway.top-giveway.base;
  317.     cout<<"为该车让路,须从入口退出车场的车辆顺序:"<<endl;
  318.     g=giveway.top; 
  319. while(g!=giveway.base)
  320. { g--;
  321.   cout<<"   "<<g->num;
  322.   }
  323. cout<<endl;
  324.     
  325.   }
  326.       else cout<<"不必让路,该车可直接从车场开走!"<<endl;
  327.   s--;
  328.           g=giveway.base; 
  329.   while(g!=giveway.top)
  330. {*s=*g;s++;g++;}
  331.   garage.top--;
  332.   
  333.   if(waitway.front!=waitway.rear) //便道上的车辆数目不为零
  334. {  if(DeQueue(waitway,e))
  335.           Push(garage,e);
  336.        cout<<"######请便道内车牌为 "<<e.num<<" 的车进车场,停在第"<<i<<"号车位!######"<<endl;
  337.    j--;
  338.    i++;
  339. }
  340. }
  341. else if(wh=='w')        //从便道上开走
  342. { j--;
  343.   DeleteL(s->num);
  344.   if(q!=waitway.front)
  345.   {
  346.    LinkQueue Q;
  347.    InitQueue(Q);
  348.    Queueptr p=waitway.front;
  349.    do{ EnQueue(Q,p->data);  //copy它前面的车辆情况
  350.       p=p->next;
  351.    }while(p->next!=q);
  352.    p=waitway.front;
  353.    Queueptr M=q->next;            
  354.    do{ p->data=M->data;
  355.        p=p->next;
  356.    M=M->next;
  357.    }while(M);
  358.            cout<<"便道上为该车让路的车辆顺序:";
  359.    Queueptr N=Q.front;
  360.    do{ cout<<"  "<<N->data.num; 
  361.    p->data=N->data;
  362.        p=p->next;
  363.                N=N->next;
  364.    }while(N!=Q.rear);
  365.    DestroyQueue(Q);
  366.    delete(waitway.rear);
  367.    waitway.rear=p;
  368.   }
  369. }
  370. else cout<<"不必让路,该车可直接从便道开走!"<<endl;
  371.   }
  372. end:;
  373. }