1 #include <stdio.h>
2 #include<conio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #define MAXSIZE 3 /*定义航线量的最大值*/
6
7 typedef struct wat_ros
8 {
9 char name[10];/*姓名*/
10 int req_amt;/*订票量*/
11 struct wat_ros *next;
12 }qnode, *qptr;
13
14 typedef struct pqueue
15 {
16 qptr front;/*等候替补客户名单域的头指针*/
17 qptr rear;/*等候替补客户名单域的属指针*/
18 }linkqueue;
19
20 typedef struct ord_ros
21 {
22 char name[10];/*客户姓名*/
23 int ord_amt;/*订票量*/
24 int grade;/*舱位等级*/
25 struct ord_ros *next;
26 }linklist;
27
28 struct airline
29 {
30 char ter_name[10];/*终点站名 */
31 char air_num[10];/*航班号*/
32 char plane_num[10];/*飞机号*/
33 char day[7];/*飞行周日(星期几)*/
34 int tkt_amt;/*乘员定额*/
35 int tkt_sur;/*余票量*/
36 linklist *order;/*乘员名单域,指向乘员名单链表的头指针*/
37 linkqueue wait;/*等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/
38 }lineinfo;
39 struct airline *start;
40
41 void display(struct airline *info)
42 /*打印每条航线的基本信息*/
43 {
44 printf("%8s %3s %s %4s %3d %10d
", info->ter_name, info->air_num, info->plane_num, info->day, info->tkt_amt, info->tkt_sur);
45 }
46
47 void list()/*打印全部航线信息*/
48 {
49 struct airline *info;
50 int i = 0;
51 info = start;
52 printf("终点站名 航班号 飞机号 飞行周日 乘员定额 余票量
");
53 while (i<MAXSIZE){
54 display(info);
55 info++;
56 i++;
57 }
58 printf("
");
59 }
60
61
62 void search()
63 /*根据客户提出的终点站名输出航线信息*/
64 {
65 struct airline *info, *find();
66 char name[10];
67 int i = 0;
68 info = start;
69 printf("请输入终点站名:");
70 scanf("%s", name);
71 while (i<MAXSIZE) {
72 if (!strcmp(name, info->ter_name)) break;
73 info++;
74 i++;
75 }
76 if (i >= MAXSIZE)
77 printf("对不起,该航线未找到!
");
78 else{
79 printf("终点站名 航班号 飞机号 飞行周日 乘员定额 余票量
");
80 display(info);
81 }
82 }
83
84 struct airline *find()
85 /*根据系统提出的航班号查询并以指针形式返回*/
86 {
87 struct airline *info;
88 char number[10];
89 int i = 0;
90 info = start;
91 printf("请输入航班号:");
92 scanf("%s", number);
93 while (i<MAXSIZE) {
94 if (!strcmp(number, info->air_num)) return info;
95 info++;
96 i++;
97 }
98 printf("对不起,该航线末找到!
");
99 return NULL;
100 }
101
102 void prtlink()
103 /*打印订票乘员名单域的客户名单信息*/
104 {
105 linklist *p;
106 struct airline *info;
107 info = find();
108 p = info->order;
109 if (p != NULL){
110 printf("客户姓名 订票数额 舱位等级
");
111 while (p){
112 printf("%s %d %d
", p->name, p->ord_amt, p->grade);
113 p = p->next;
114 }
115 }
116 else
117 printf("该航线没有客户信息!!
");
118 }
119
120 linklist *insertlink(linklist *head, int amount, char name[], int grade)
121 /*增加订票乘员名单域的客户信息*/
122 {
123 linklist*p1, *lnew;
124 p1 = head;
125 lnew = (linklist *)malloc(sizeof(linklist));
126 if (!lnew) { printf("
Out of memory!!
"); return NULL; }
127 strcpy(lnew->name, name);
128 lnew->ord_amt = amount;
129 lnew->grade = grade;
130 lnew->next = NULL;
131 if (head == NULL)/*若原无订票客户信息*/
132 {
133 head = lnew; lnew->next = NULL;
134 }
135 else
136 head = lnew;
137 lnew->next = p1;
138 return head;
139 }
140
141 linkqueue appendqueue(linkqueue q, char name[], int amount)
142 /*增加排队等候的客户名单域*/
143 {
144 qptr lnew;
145 lnew = (qptr)malloc(sizeof(qnode));
146 strcpy(lnew->name, name);
147 lnew->req_amt = amount;
148 lnew->next = NULL;
149 if (q.front == NULL)/*若原排队等候客户名单域为空*/
150 q.front = lnew;
151 else
152 q.rear->next = lnew;
153 q.rear = lnew;
154 return q;
155 }
156
157 void order()
158 /*办理订票业务*/
159 {
160 struct airline *info;
161 int amount, grade;
162 char name[10];
163 info = start;
164 if (!(info = find())) return;/*根据客户提供的航班号进行查询,如为空,退出该模块*/
165 printf("请输入你订票所需要的数量:");
166 scanf("%d", &amount);
167 if (amount>info->tkt_amt)/*若客户订票额超过乘员定票总额,退出*/
168 {
169 printf("
对不起,您输入的票的数量已经超过乘员定额!");
170 return;
171 }
172 if (amount <= info->tkt_sur)/*若客户订票额末超过余票量,订票成功并等记信息*/
173 {
174 int i;
175 printf("请输入您的姓名(订票客户):");
176 scanf("%s", name);
177 printf("请输入%s票的舱位等级:", name);
178 scanf("%d", &grade);
179 info->order = insertlink(info->order, amount, name, grade);/*在订票乘员名单域中添加客户信息*/
180 for (i = 0; i<amount; i++)/*依次输出该订票客户的座位号*/
181 printf("%s的座位号是:%d
", name, info->tkt_amt - info->tkt_sur + i + 1);
182 info->tkt_sur -= amount;/*该航线的余票量应减掉该客户的订票量*/
183 printf("
祝您乘坐愉快!
");
184 }
185 else /*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/
186 {
187 char r;
188 printf("
已经没有更多的票,您需要排队等候吗?(Y/N)");
189 r = getch();
190 printf("%c", r);
191 if (r == 'Y' || r == 'y')
192 {
193 printf("
请输入您的姓名(排队订票客户):");
194 scanf("%s", name);
195 info->wait = appendqueue(info->wait, name, amount);/*在排队等候乘员名单域中添加客户信息*/
196 printf("
注册成功!
");
197 }
198 else printf("
欢迎您下次再次订购!
");
199 }
200 }
201
202 void return_tkt()
203 /*退票模块*/
204 {
205 struct airline *info;
206 qnode *t, *back, *f, *r;
207 int grade;
208 linklist *p1, *p2, *head;
209 char cusname[10];
210 if (!(info = find()))
211 return;/*调用查询函数,根据客户提供的航线进行搜索*/
212 head = info->order;
213 p1 = head;
214 printf("请输入你的姓名(退票客户):");
215 scanf("%s", cusname);
216 while (p1 != NULL)
217 { /*根据客户提供的姓名到订票客户名单域进行查询*/
218 if (!strcmp(cusname, p1->name))
219 break;
220 p2 = p1;
221 p1 = p1->next;
222 }
223 if (p1 == NULL)
224 {
225 printf("对不起,你没有订过票!
");
226 return; }/*若未找到,退出本模块*/
227 else
228 {/*若信息查询成功,删除订票客户名单域中的信息*/
229 if (p1 == head)
230 head = p1->next;
231 else
232 p2->next = p1->next;
233 info->tkt_sur += p1->ord_amt;
234 grade = p1->grade;
235 printf("%s成功退票!
", p1->name);
236 free(p1);
237 }
238 info->order = head;/*重新将航线名单域指向订票单链表的头指针 */
239 f = (info->wait).front;/*f指向排队等候名单队列的头结点*/
240 r = (info->wait).rear;/*r指向排队等候名单队列的尾结点*/
241 t = f;/*t为当前满点条件的排队候补名单域*/
242 while (t)
243 {
244 if (info->tkt_sur >= info->wait.front->req_amt)
245 {/*若满足条件者为头结点*/
246 int i;
247 info->wait.front = t->next;
248 printf("%s订票成功!
", t->name);
249 for (i = 0; i<t->req_amt; i++)/*输出座位号*/
250 printf("%s的座位号是:%d
", t->name, (info->tkt_sur) - i);
251 info->tkt_sur -= t->req_amt;
252 info->order = insertlink(info->order, t->req_amt, t->name, grade);/*插入到订票客户名单链表中*/
253 free(t);
254 break;
255 }
256 back = t;
257 t = t->next;
258 if ((info->tkt_sur) >= (t->req_amt) && t != NULL)/*若满足条件者不为头结点*/
259 {
260 int i;
261 back->next = t->next;
262 printf("%s订票成功!
", t->name);
263 for (i = 0; i<t->req_amt; i++)/*输出座位号*/
264 printf("<%s>'s seat number is:%d
", t->name, (info->tkt_sur) - i);
265 info->tkt_sur -= t->req_amt;
266 info->order = insertlink(info->order, t->req_amt, t->name, grade);/*插入到订票客户名单链表中*/
267 free(t);
268 break;
269 }
270 if (f == r)
271 break;
272 }
273 }
274
275 int menu_select()
276 /*菜单界面*/
277 {
278 int c;
279 char s[20];
280 printf("
航空客运订票系统
");
281 printf("******************************************
");
282 printf("1.浏览航线信息:
");
283 printf("2.浏览已订票客户信息:
");
284 printf("3.查询航线
");
285 printf("4.办理订票业务:
");
286 printf("5.办理退票业务:
");
287 printf("6.退出系统
");
288 printf("*******************************************
");
289 do{
290 printf("请选择:");
291 scanf("%s", s);
292 c = atoi(s);/*参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,
293 之后检测到非数字(包括结束符 ) 字符时停止转换,返回整型数。否则,返回零,*/
294 } while (c<0 || c>7);
295 return c;
296 }
297
298 main()
299 {
300 struct airline air[MAXSIZE] = { { "beijing", "1", "B8571", "SUN", 3, 3 },
301 { "shanghai", "2", "S1002", "MON", 2, 2 },
302 { "london", "3", "L1003", "FRI", 1, 1 } };/*初始化航线信息*/
303 /* clrscr();*/
304 start = air;
305 for (;;){
306 switch (menu_select()){
307 case 1:list(); break;
308 case 2:prtlink(); break;
309 case 3:search(); break;
310 case 4:order(); break;
311 case 5:return_tkt(); break;
312 case 6:printf("
欢迎使用本系统,再见!
"); exit(0);
313 }
314 printf("
Press any key to continue!
");
315 getch();
316 }
317 }