在數據結構這部分學習結束后,寫一個小項目,我想是對這部分知識一個很好的運用過程。
我在這介紹我寫的一個項目,游戲停車場(這個版本只是初級版,可以在這之上繼續添加很多其他功能,大家可以自己嘗試)。
功能要求如下:
程序如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
|
/*************************************************************************** 項目要求 游戲VIP停車場 問題描述:停車場是一個能放10輛車的車場(鏈表實現), 汽車按到達的先后次序停放 在等候區。若等候區滿了(10輛車),按汽車的VIP等級(兩種排序方法),依次停入停車場 ,在停 車期間,我們可以通過汽車牌號查找汽車相關信息,并且可以隨意刪除其中一輛汽車,汽車 離開要按等候區的順序依次離開(使用隊列實現)汽車離開時按停放時間收費。 ***************************************************************************/ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #define LEN sizeof(struct parking) #define MAXSIZE 10 //車庫大小,可自定義大小,這里默認為10 #define MONEY 0.002 //收費價格,這里默認為1分鐘,收費0.12元 typedef struct parking { char number[10]; //車輛信息 int vip; //車輛VIP等級 int time1; // 進入停車場時間 int time2; // 離開停車場時間 int count; //標記車輛,后面入隊時使用 struct parking*next; }car; static int n = 0; //全局變量,用于標記車輛數目,計算車位 car c; void menu() { printf ( "\t==============歡迎來到中南國際停車場=============\n" ); printf ( "\t******************目前停車場狀況*****************\n" ); printf ( "\t停車場共有%d個車位,當前停車場剩余%d車位\n" , MAXSIZE,MAXSIZE - n); printf ( "\t*************************************************\n" ); printf ( "\t================1,停入車輛=======================\n" ); printf ( "\t================2,VIP等級排序車輛================\n" ); printf ( "\t================3,駛出所有車輛(隊列)==============\n" ); printf ( "\t================4,查找車輛=======================\n" ); printf ( "\t================5,遍歷停車場全部車輛信息=========\n" ); printf ( "\t================6,駛出指定車輛===================\n" ); printf ( "\t================7,退出===========================\n" ); } struct parking *creat() //創建鏈表,用于存放車輛信息 { struct parking*p1,*p2,*head; head = NULL; //為方便后面排序,這里創建不帶頭結點的鏈表 int i = 1; p1=p2=( struct parking*) malloc (LEN); printf ( "輸入車輛VIP等級:\n" ); scanf ( "%d" ,&p1->vip); printf ( "輸入車牌號:\n" ); scanf ( "%s" ,p1->number); p1->count = i; time_t t1; long int t = time (&t1); // 標記進入停車場的時間 c.time1 = t; char * t2; t2 = ctime (&t1); // 獲取當前時間 printf ( "牌照為%s的汽車停入等候區成功,當前時間:%s\n" ,p1->number,t2); //顯示停車場狀況,以及停入時間 while (p1->vip != 0 && i <= 10) { //由于不帶頭結點,這里創建時考慮了三種插入方法 n = n+1; if (n == 1) head = p1; else p2->next = p1; p2 = p1; p1 = ( struct parking*) malloc (LEN); printf ( "輸入車輛VIP等級:\n" ); scanf ( "%d" ,&p1->vip); printf ( "輸入車牌號:\n" ); scanf ( "%s" ,p1->number); i++; p1->count = i; time_t t1; long int t = time (&t1); // 標記進入停車場的時間 c.time1 = t; char * t2; t2 = ctime (&t1); // 獲取當前時間 printf ( "牌照為%s的汽車停入等候區成功,當前時間:%s\n" ,p1->number,t2); //顯示停車場狀況,以及停入時間 } p2->next = NULL; printf ( "等候區以滿\n" ); return head; } struct parking *Sort( struct parking *head) //鏈表排序,冒泡排序 { struct parking *p,*q,*s; int t,a,m; char arr[10]; printf ( "請輸入排序方式:(1:冒泡排序法 0:選擇排序法)\n" ); scanf ( "%d" ,&a); if (a = 1) { for (p = head;p != NULL;p = p->next) { for (q = p->next;q != NULL;q = q->next) { if (p->vip < q->vip) //降序 { t = q->vip; //按VIP等級交換結點數據 q->vip = p->vip; p->vip = t; strcpy (arr,q->number); strcpy (q->number,p->number); strcpy (p->number,arr); m = q->count; q->count = p->count; p->count = m; } } } return head; } else //選擇排序法 { for (p = head;p != NULL;p = p->next) { s = p; //s標記為最大值 for (q = p->next;q != NULL;q = q->next) { if (p->vip < q->vip) //降序 { s = q; } if (s != p) { t = q->vip; //按VIP等級交換結點數據 q->vip = p->vip; p->vip = t; strcpy (arr,q->number); strcpy (q->number,p->number); strcpy (p->number,arr); m = q->count; q->count = p->count; p->count = m; } } } return head; } } typedef struct QueueNode //先入先出(隊列)Vip離場 { int data; struct QueueNode *next; }Queue,*QueuePtr; typedef struct { QueuePtr front,rear; //隊列指針 }LinkQueue; LinkQueue* CreateQueue(LinkQueue *Q) //創建隊列 { Q = (LinkQueue*) malloc ( sizeof (LinkQueue)); Q->front = Q->rear = (QueuePtr) malloc ( sizeof (Queue)); Q->front->next = NULL; return Q; } void Push( struct parking *head,LinkQueue* Q) //入隊操作,按鏈表中一開始車輛標號順序 { struct parking *p; p = head; while (p!=NULL) { QueuePtr s = (QueuePtr) malloc ( sizeof (Queue)); s->data = p->count; //隊列只記錄車輛一開始的標號信息 s->next = NULL; Q->rear->next = s; Q->rear = s; p = p->next; } } struct parking Exert1( struct parking *head, int e) //按等候區順序出隊(一輛) { struct parking *p; p = head; while (p != NULL && p->count != e) { p = p->next; } if (p->count == e) { time_t t1; long int t = time (&t1); // 標記顯示時的時間 printf ( "車牌號\tVIP等級\t\t停放時長\t當前所需支付金額\n" ); //打印查到的車輛信息 printf ( "%s\t%d\t\t%d秒\t\t%2.3f元\n" ,p->number,p->vip,t - c.time1, MONEY * (t - c.time1)); } } int Pop( struct parking *head,LinkQueue *Q) //按等候區順序出隊(全部) { QueuePtr p; int i = 1; if (Q->front == Q->rear) { printf ( "停車場無車輛!\n" ); return 0; } else { for (i;i <= 10;i++) //按等候區順序出隊(全部) { p = Q->front->next; Q->front->next = p->next; //出隊操作 if (Q->rear == p) Q->rear = Q->front; Exert1(head,i); //調用函數,實現按等候區順序出一輛車 } } } struct parking *Exert( struct parking *head, char number[10]) //駛出指定車輛 { struct parking *p1,*p2; p1 = head; p2 = p1; while (p1->next !=NULL && strcmp (p1->number,number) != 0) { p2=p1; p1=p1->next; } if ( strcmp (p1->number,number) == 0) //不帶頭結點,這里有三種刪除車輛的辨別 { if (p1 == head) { head = head->next; //頭,中間,尾,三種刪除方式 printf ( "駛出車輛成功\n" ); n--; } else { p2->next = p1->next; printf ( "駛出車輛成功\n" ); n--; } time_t t1; long int t = time (&t1); c.time2 = t; // 標記離開停車場的時間 char * t2; t2 = ctime (&t1); // 獲取當前時間 printf ( "離開時間%s\n需付%2.3f元\n" ,t2,MONEY * (c.time2 - c.time1)); //顯示停車場狀況以及駛出時間和收費情況 } else { printf ( "停車場沒此車輛!\n" ); } free (p1); return head; } struct parking *find( struct parking *head, char number[20]) //查找指定車輛 { struct parking *p1; p1 = head; while (p1->next != NULL && strcmp (p1->number,number)!=0) { p1 = p1->next; } if ( strcmp (p1->number,number)==0) //打印查到的車輛信息 { printf ( "查找成功,車輛信息如下:\n" ); time_t t1; long int t = time (&t1); // 標記顯示時的時間 printf ( "車牌號\tVIP等級\t\t停放時長\t當前所需支付金額\n" ); //打印查到的車輛信息 printf ( "%s\t%d\t\t%d秒\t\t%2.3f元\n" ,p1->number,p1->vip,t - c.time1, MONEY * (t - c.time1)); } else printf ( "停車場沒此車輛!\n" ); } void show( struct parking *head) //顯示車庫現有車輛 { struct parking *p; p = head; if (head != NULL) { do { time_t t1; long int t = time (&t1); // 標記顯示時的時間 printf ( "車牌號\tVIP等級\t\t停放時長\t當前所需支付金額\n" ); //打印查到的車輛信息 printf ( "%s\t%d\t\t%d秒\t\t%2.3f元\n" ,p->number,p->vip,t - c.time1, MONEY * (t - c.time1)); p = p->next; } while (p != NULL); } else printf ( "停車場無車輛!\n" ); } int main() { int n = 1; int i; struct parking *head; //初始化鏈表 LinkQueue q; LinkQueue* Q = &q; Q = CreateQueue(Q); char number[10]; while (n) { system ( "clear" ); menu(); printf ( "請輸入你的騷操作:\n" ); scanf ( "%d" ,&i); switch (i) { case 1:{head = creat();Push(head,Q); break ;} //創建鏈表,并創建隊列 case 2:{head = Sort(head); break ;} //按vip排序 case 3:{Pop(head,Q); break ;} //按等候區順序出隊(全部) case 4: { printf ( "請輸入查找車輛的車牌號:\n" ); //查找指定車輛 scanf ( "%s" ,number); find(head,number); break ; } case 5:{show(head); break ;} //顯示車庫現有車輛 case 6: { printf ( "請輸入要駛出車輛的車牌號:\n" ); //駛出指定車輛 scanf ( "%s" ,number); head = Exert(head,number); break ; } default :{ break ;} } } } |
功能的實現,有很多方法,如果大家有自己的想法,可以評論,大家互利共進。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/MyFamily_IT/article/details/79166631