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 }