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 }