停车场模拟管理程序的设计与实现 
1.设计目的 
理解线性表的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。 
2.问题描述 
设停车场只有一个可停放几辆汽车的狭长通道,只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车辆开走,则排在便道上的第一辆汽车即可进入;当停车场内某辆汽车要开走时,由于停车场是狭长的通道,在它之后开入的车辆必须先推出车场为他让路,待车辆开出大门,为他让路的车辆再按原次序进入车场。试设计这样一个停车场模拟管理程序。 
3.数据结构设计 
(1)为了便于区分每辆汽车并了解每辆车当前所处的位置,需要记录汽车的牌照号码和汽车当前的状态。 
(2)为了便于停车场的管理,要为每个车位分配一个固定的编号。 
(3)当停车场的停车位上都已停满了汽车,又有新的汽车到来时要把它调度到便道上,便道上的车辆要按照进入便道的先后顺序顺次序放在便道上,为便道上的每个位置分配一个固定的编号。当有车从停车位上离开后,便道上的第一辆汽车就立即进入停车位上的某个车位。 
(4)当某辆车离开停车场的时候,比他后进停车位的车要为他让路,而且当他开走之后让路的车还要按照原来的停放次序再次进入停车位的某个车位上,为完成这项功能,定义一个结构体。 
4.功能(函数)设计 
本程序从总体上分为四个功能模块,分别为: 
(1)程序功能介绍和操作提示模块 
(2)汽车进入停车位的管理模块 
(3)汽车离开停车位的管理模块 
(4)查看停车场状态的查询模块 
5.界面设计 
6.编码实现 
7.运行与测试 
(1)连续有7辆汽车到来,牌照号分别为CF001、CF002、CF003、CF004、CF005、CF006、CF007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。 
(2)上面(1)中的情况发生后,让牌照CF003的汽车从停车场开走,应显示CF005、CF004的让路动作和CF006从便道到停车位的动作。 
(3)随时检查停车位和便道的状态,不应该出现有空位而便道上还有车的情况。 
(4)其它正常操作的一般情况。










#include<stdio.h> 
 #include<stdlib.h> 
 #include<string.h> 
 #define MAX 2 /*车库容量*/ 
 typedef struct node 
 {char num[10]; 
 }CarNode;/*车辆信息结点*/ 
 typedef struct NODE{ 
 CarNode *stack[MAX+1]; 
 int top; 
 }SeqStackCar; /*模拟车站*/ 
 typedef struct car{ 
 CarNode *data; 
 struct car *next; 
 }QueueNode; 
 typedef struct Node{ 
 QueueNode *head; 
 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); /*初始化通道*/ 
 printf("\n\n\n 题 目:模拟停车场管理问题\n\n"); 
 printf(" 班 级:计0501\n\n"); 
 printf(" 学 号:0305102123\n\n"); 
 printf(" 姓 名:杨新顶\n\n"); 
 printf(" 指导老师:蒋建辉 肖琳\n\n"); 
 printf(" 日 期:07年1月12日\n"); 
 printf("\n\n\n\n\n-----------按任意键继续---------------"); 
 getch(); 
 clrscr(); 
 while(1) 
 { printf("\n1. 车辆到达"); 
 printf(" 2. 车辆离开"); 
 printf(" 3. 列表显示"); 
 printf(" 4. 退出系统\n"); 
 while(1) 
 {scanf("%d",&ch); 
 if(ch>=1&&ch<=4)break; 
 else printf("\n请选择: 1|2|3|4."); 
 } 
 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->head=(QueueNode *)malloc(sizeof(QueueNode)); 
 if(Q->head!=NULL) 
 {Q->head->next=NULL; 
 Q->rear=Q->head; 
 return(1);} 
 else return(-1);} 
 void PRINT(CarNode *p) /*打印出站车的信息*/  
 { 
 printf("\n离开车辆的车牌号为:"); 
 puts(p->num); 
 } 
 int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/  
 { CarNode *p; 
 QueueNode *t; 
 p=(CarNode *)malloc(sizeof(CarNode)); 
 flushall(); 
 printf("\n请输入车牌号(例:陕A1234):"); 
 gets(p->num); 
 if(Enter->top<MAX) /*车场未满,车进车场*/ 
 {Enter->top++; 
 printf("\n车辆在车场第%d位置.",Enter->top); 
 Enter->stack[Enter->top]=p; 
 return(1);} 
 else /*车场已满,车进便道*/ 
 { printf("\n该车须在便道等待!"); 
 t=(QueueNode *)malloc(sizeof(QueueNode)); 
 t->data=p; 
 t->next=NULL;  
 W->rear->next=t; 
 W->rear=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请输入车在车场的位置/1--%d/:",Enter->top); 
 scanf("%d",&room); 
 if(room>=1&&room<=Enter->top) break;} 
 while(Enter->top>room) /*车辆离开*/ 
 {Temp->top++; 
 Temp->stack[Temp->top]=Enter->stack[Enter->top]; 
 Enter->stack[Enter->top]=NULL; 
 Enter->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); 
 /*判断通道上是否有车及车站是否已满*/ 
 if((W->head!=W->rear)&&Enter->top<MAX) /*便道的车辆进入车场*/ 
 { q=W->head->next; 
 t=q->data; 
 Enter->top++; 
 printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top); 
 W->head->next=q->next; 
 if(q==W->rear) W->rear=W->head; 
 Enter->stack[Enter->top]=t; 
 free(q);} 
 else printf("\n便道里没有车.\n");} 
 else printf("\n车场里没有车."); /*没车*/ } 
 void List1(SeqStackCar *S) /*列表显示车场信息*/ 
 {int i; 
 if(S->top>0) /*判断车站内是否有车*/ 
 {printf("\n车场:"); 
 printf("\n 位置 车牌号\n"); 
 for(i=1;i<=S->top;i++) 
 {printf(" %d ",i); 
 puts(S->stack[i]->num);}} 
 else printf("\n车场里没有车");} 
 void List2(LinkQueueCar *W) /*列表显示便道信息*/ 
 { QueueNode *p; 
 p=W->head->next; 
 if(W->head!=W->rear) /*判断通道上是否有车*/ 
 {printf("\n等待车辆的号码为:\n"); 
 while(p!=NULL) 
 {puts(p->data->num); 
 p=p->next;}} 
 else printf("\n便道里没有车."); } 
 void List(SeqStackCar S,LinkQueueCar W) 
 {int flag,tag; 
 flag=1; 
 while(flag) 
 {printf("\n请选择 1|2|3:"); 
 printf("\n1.车场\n2.便道\n3.返回\n"); 
 while(1) 
 { scanf("%d",&tag); 
 if(tag>=1||tag<=3) break; 
 else printf("\n请选择 1|2|3:"); 
 }switch(tag) 
 {case 1:List1(&S);break; /*列表显示车场信息*/ 
 case 2:List2(&W);break; /*列表显示便道信息*/ 
 case 3:flag=0;break; 
 default: break; }}}