-
上传用户:sxbfjx
上传日期:2007-12-06
资源大小:2k
文件大小:5k
源码类别:

数据结构

开发平台:

C/C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. /*----------------------结构定义--------------------------------*/
  5. #define MAX 2 /*车库容量*/
  6. #define price 0.05 /*每车每分钟费用*/
  7. typedef struct time{
  8. int hour;
  9. int min;
  10. }Time; /*时间结点*/
  11. typedef struct node{
  12. char num[10];
  13. Time reach;
  14. Time leave;
  15. }CarNode; /*车辆信息结点*/
  16. typedef struct NODE{
  17. CarNode *stack[MAX+1];
  18. int top;
  19. }SeqStackCar; /*模拟车站*/
  20. typedef struct car{
  21. CarNode *data;
  22. struct car *next;
  23. }QueueNode;
  24. typedef struct Node{
  25. QueueNode *head;
  26. QueueNode *rear;
  27. }LinkQueueCar; /*模拟通道*/
  28. /*-------------------初始化函数----------------------------------*/
  29. void InitStack(SeqStackCar *); /*初始化栈*/
  30. int InitQueue(LinkQueueCar *); /*初始化便道*/
  31. int Arrival(SeqStackCar *,LinkQueueCar *); /*车辆到达*/
  32. void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /*车辆离开*/
  33. void List(SeqStackCar,LinkQueueCar); /*显示存车信息*/
  34. /*----------------------子函数-------------------------------------*/
  35. void main()
  36. {
  37. SeqStackCar Enter,Temp;
  38. LinkQueueCar Wait;
  39. int ch;
  40. InitStack(&Enter); /*初始化车站*/
  41. InitStack(&Temp); /*初始化让路的临时栈*/
  42. InitQueue(&Wait); /*初始化通道*/
  43. while(1)
  44. {
  45. printf("n1. The car arrived:");
  46. printf(" 2. The car leave:");
  47. printf(" 3. Show the list:");
  48. printf(" 4. Exit the OS:n");
  49. while(1)
  50. {
  51. scanf("%d",&ch);
  52. if(ch>=1&&ch<=4)break;
  53. else printf("nPlease chose: 1|2|3|4.");
  54. }
  55. switch(ch)
  56. {
  57. case 1:Arrival(&Enter,&Wait);break; /*车辆到达*/
  58. case 2:Leave(&Enter,&Temp,&Wait);break; /*车辆离开*/
  59. case 3:List(Enter,Wait);break; /*列表打印信息*/
  60. case 4:exit(0); /*退出主程序*/
  61. default: break;
  62. }
  63. }
  64. }
  65. /*----------------出站车函数----------------------------------------*/
  66. void InitStack(SeqStackCar *s) /*初始化栈*/
  67. {
  68. int i;
  69. s->top=0;
  70. for(i=0;i<=MAX;i++)
  71. s->stack[s->top]=NULL;
  72. }
  73. int InitQueue(LinkQueueCar *Q) /*初始化便道*/
  74. {
  75. Q->head=(QueueNode *)malloc(sizeof(QueueNode));
  76. if(Q->head!=NULL)
  77. {
  78. Q->head->next=NULL;
  79. Q->rear=Q->head;
  80. return(1);
  81. }
  82. else return(-1);
  83. }
  84. void PRINT(CarNode *p,int room) /*打印出站车的信息*/
  85. {
  86. int A1,A2,B1,B2;
  87. printf("nInput the left time:/**:**/");
  88. scanf("%d:%d",&(p->leave.hour),&(p->leave.min));
  89. printf("nNo.of the left car:");
  90. puts(p->num);
  91. printf("nArrival time: %d:%d",p->reach.hour,p->reach.min);
  92. printf("Left time: %d:%d",p->leave.hour,p->leave.min);
  93. A1=p->reach.hour;
  94. A2=p->reach.min;
  95. B1=p->leave.hour;
  96. B2=p->leave.min;
  97. printf("nCharge: %2.1f元",((B1-A1)*60+(B2-A2))*price);
  98. free(p);
  99. }
  100. int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/
  101. {
  102. CarNode *p;
  103. QueueNode *t;
  104. p=(CarNode *)malloc(sizeof(CarNode));
  105. flushall();
  106. printf("nInput car number(eg:SHANA1234):");
  107. gets(p->num);
  108. if(Enter->top<MAX) /*车场未满,车进车场*/
  109. {
  110. Enter->top++;
  111. printf("nThe car's position is %d/n.",Enter->top);
  112. printf("nInput arrival time:/**:**/");
  113. scanf("%d:%d",&(p->reach.hour),&(p->reach.min));
  114. Enter->stack[Enter->top]=p;
  115. return(1);
  116. }
  117. else /*车场已满,车进便道*/
  118. {
  119. printf("nMust wait at sidewalk!");
  120. t=(QueueNode *)malloc(sizeof(QueueNode));
  121. t->data=p;
  122. t->next=NULL;
  123. W->rear->next=t;
  124. W->rear=t;
  125. return(1);
  126. }
  127. }
  128. void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)
  129. { /*车辆离开*/
  130. int i, room;
  131. CarNode *p,*t;
  132. QueueNode *q;
  133. /*判断车场内是否有车*/
  134. if(Enter->top>0) /*有车*/
  135. {
  136. while(1) /*输入离开车辆的信息*/
  137. {
  138. printf("nInput the position of this car:/1--%d/:",Enter->top);
  139. scanf("%d",&room);
  140. if(room>=1&&room<=Enter->top) break;
  141. }
  142. while(Enter->top>room) /*车辆离开*/
  143. {
  144. Temp->top++;
  145. Temp->stack[Temp->top]=Enter->stack[Enter->top];
  146. Enter->stack[Enter->top]=NULL;
  147. Enter->top--;
  148. }
  149. p=Enter->stack[Enter->top];
  150. Enter->stack[Enter->top]=NULL;
  151. Enter->top--;
  152. while(Temp->top>=1)
  153. {
  154. Enter->top++;
  155. Enter->stack[Enter->top]=Temp->stack[Temp->top];
  156. Temp->stack[Temp->top]=NULL;
  157. Temp->top--;
  158. }
  159. PRINT(p,room);
  160. /*判断通道上是否有车及车站是否已满*/
  161. if((W->head!=W->rear)&&Enter->top<MAX) /*便道的车辆进入车场*/
  162. {
  163. q=W->head->next;
  164. t=q->data;
  165. Enter->top++;
  166. printf("n%scar in sidewalk enter the parkseat%d.",t->num,Enter->top);
  167. printf("nInput now time/**:**/:");
  168. scanf("%d:%d",&(t->reach.hour),&(t->reach.min));
  169. W->head->next=q->next;
  170. if(q==W->rear) W->rear=W->head;
  171. Enter->stack[Enter->top]=t;
  172. free(q);
  173. }
  174. else printf("nNo car at sidewalk.n"); 
  175. }
  176. else printf("nNo car in the park."); /*没车*/
  177. }
  178. void List1(SeqStackCar *S) /*列表显示车场信息*/
  179. {
  180. int i;
  181. if(S->top>0) /*判断车站内是否有车*/
  182. {
  183. printf("nPark:");
  184. printf("n Position Arrivaltime CarNo.n");
  185. for(i=1;i<=S->top;i++)
  186. {
  187. printf(" %d ",i);
  188. printf("%d:%d ",S->stack->reach.hour,S->stack->reach.min);
  189. puts(S->stack->num);
  190. }
  191. }
  192. else printf("nNo car in the park");
  193. }
  194. void List2(LinkQueueCar *W) /*列表显示便道信息*/
  195. {
  196. QueueNode *p;
  197. p=W->head->next;
  198. if(W->head!=W->rear) /*判断通道上是否有车*/
  199. {
  200. printf("nWaiting car number:");
  201. while(p!=NULL)
  202. {
  203. puts(p->data->num);
  204. p=p->next;
  205. }
  206. }
  207. else printf("nNo car at the sidewalk.");
  208. }
  209. void List(SeqStackCar S,LinkQueueCar W)
  210. {
  211. int flag,tag;
  212. flag=1;
  213. while(flag)
  214. {
  215. printf("nChose 1|2|3:");
  216. printf("n1.Parkn2.Sidewalkn3.Backn");
  217. while(1)
  218. {
  219. scanf("%d",&tag);
  220. if(tag>=1||tag<=3) break;
  221. else printf("nChose 1|2|3:");
  222. }
  223. switch(tag)
  224. {
  225. case 1:List1(&S);break; /*列表显示车场信息*/
  226. case 2:List2(&W);break; /*列表显示便道信息*/
  227. case 3:flag=0;break;
  228. default: break;
  229. }
  230. }
  231. }