1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <conio.h> 5 typedef struct flightnode{ 6 char flight_num[10]; //航班號 7 char start_time[10]; //起飛時間 8 char end_time[10]; //抵達時間 9 char start_place[20];//起飛城市 10 char end_place[20]; //抵達城市 11 int left; //空座數 12 float price; //票價 13 int isFull; //航班是否滿倉 14 struct flightnode *next;//指向下一個結點 15 }flightnode;//航班結點 16 typedef struct passengernode{ 17 char name[20]; //姓名 18 char ID_num[20]; //證件號 19 char flight_num[10];//航班號 20 int order_num; //訂單號 21 int ticket_num; //訂票數量 22 struct passengernode *next;//指向下一個結點 23 }passengernode;//客戶結點 24 typedef struct passengerList 25 { 26 passengernode *head; 27 passengernode *rear; 28 }passengerList; 29 void init_flight(flightnode *&h)//目的是要建立一個以h為頭結點的空鏈表,錄入航班信息和增加航班后將航班結點插入該鏈表 30 { 31 h=(flightnode *)malloc(sizeof(flightnode));//申請頭結點的空間 32 if(h==NULL) exit(0); 33 h->next=NULL;//將頭結點h的指針域置為空 34 } 35 void init_passengerList(passengerList *&pList) 36 { 37 pList=(passengerList *)malloc(sizeof(passengerList)); 38 pList->head=(passengernode *)malloc(sizeof(passengernode));//創建頭結點 39 pList->rear=pList->head; 40 pList->rear->order_num=0;//訂單號從0開始計數 41 pList->head->next=NULL; 42 } 43 void save_passenger(passengerList *PList) 44 { 45 FILE* fp = fopen("passenger.dat","wb"); 46 if(fp==NULL) 47 return; 48 passengernode *temp=PList->head->next; 49 while(temp!=NULL) 50 { 51 fwrite(temp,sizeof(passengernode),1,fp); 52 temp = temp->next; 53 }; 54 fclose(fp); 55 } 56 void load_passenger(passengerList *PList) 57 { 58 FILE* fp = fopen("passenger.dat","rb"); 59 if(fp==NULL) 60 return; 61 passengernode *q; 62 int n; 63 while(!feof(fp)) 64 { 65 q=(passengernode *)malloc(sizeof(passengernode)); 66 n =fread(q,sizeof(passengernode),1,fp); 67 if(n!=1) 68 break; 69 PList->rear->next=q; 70 PList->rear=q; 71 } 72 PList->rear->next=NULL; 73 fclose(fp); 74 } 75 void save_flight(flightnode *h) 76 { 77 FILE* fp = fopen("flightList.dat","wb"); 78 if(fp==NULL) 79 return; 80 flightnode *temp=h->next; 81 while(temp!=NULL) 82 { 83 fwrite(temp,sizeof(flightnode),1,fp); 84 temp = temp->next; 85 }; 86 fclose(fp); 87 } 88 void load_flight(flightnode *&h) 89 { 90 flightnode *pt=h; 91 FILE* fp = fopen("flightList.dat","rb"); 92 if(fp==NULL) 93 return; 94 flightnode *q; 95 int n; 96 while(!feof(fp)) 97 { 98 q=(flightnode *)malloc(sizeof(flightnode)); 99 n=fread(q,sizeof(flightnode),1,fp); 100 if(n!=1) 101 break; 102 pt->next=q; 103 pt=q; 104 } 105 pt->next=NULL; 106 fclose(fp); 107 } 108 109 int find_same_flight(flightnode *h,char *flight_num) 110 { 111 flightnode *t=h->next,*p=h->next; 112 int mark=0; 113 printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班號","起飛城市","抵達城市","起飛時間","抵達時間","價格","是否滿倉","空座數"); 114 while(t!=NULL && strcmp(t->flight_num,flight_num)!=0) t=t->next; 115 while(p!=NULL){ 116 if((strcmp(t->start_place,p->start_place)==0)&&(strcmp(t->end_place,p->end_place)== 0)&&(strcmp(t->flight_num,p->flight_num)!=0)) 117 { 118 printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-10d%-8d\n",p->flight_num, p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->isFull,p->left); 119 mark=1; 120 } 121 p=p->next; 122 } 123 if(mark==0) 124 { 125 printf("\t\t抱歉,沒有可選的航班!\n"); 126 return 0; 127 } 128 return 1; 129 } 130 131 void insert_flight(flightnode *&h,char* flight_num,char* start_place,char* end_place,char* start_time,char* end_time,int left,float price,float price_discount,int isFull) 132 //在錄入航班情況或增加新的航班后,將新的航班結點插入到航線鏈表中 133 { 134 flightnode *q;//定義q為新增加的航班結點的指針的形參 135 flightnode *p=h; 136 q=(flightnode *)malloc(sizeof(flightnode));//為q結點申請空間 137 strcpy(q->flight_num,flight_num); 138 strcpy(q->start_place,start_place); 139 strcpy(q->end_place,end_place); 140 strcpy(q->start_time,start_time); 141 strcpy(q->end_time,end_time); 142 q->left=left; 143 q->price=price; 144 q->isFull=isFull; 145 //以上是用strcpy函數將新增加航班的各種信息復制到q結點中 146 q->next=p->next;//將q結點的指針域置為空 147 p->next=q; 148 p=p->next;//將指針后移 149 } 150 void insert_passengerList(flightnode *&h,passengerList *&PList,char *name,char *ID_num,char *flight_num,int ticket_num) 151 //客戶訂票后,將客戶結點插入客戶鏈表中,並修改相應的航班信息。 152 { 153 flightnode *p=h->next; 154 for(;p!=NULL;p=p->next) 155 if(strcmp(p->flight_num,flight_num)==0) 156 { 157 p->left=p->left-ticket_num; 158 if(p->left==0) 159 p->isFull=1; 160 } 161 passengernode *q=(passengernode *)malloc(sizeof(passengernode));//新建結點,存放新的客戶訂單信息 162 strcpy(q->name,name); 163 strcpy(q->ID_num,ID_num); 164 strcpy(q->flight_num,flight_num); 165 q->ticket_num=ticket_num; 166 q->next=NULL; 167 //將新訂單連接到鏈表中 168 PList->rear->next=q; 169 q->order_num=PList->rear->order_num+1;//生成訂單號 170 PList->rear=q; 171 } 172 173 void delete_flight(flightnode *&h,passengerList *&PList) 174 //目的要按照某個航班號刪除航班結點 175 { 176 flightnode *p,*pr; 177 passengernode *q,*qr; 178 char flight_num[10]; 179 int mark=1; 180 qr=PList->head;//pr為顧客鏈表的頭結點 181 q=qr->next;//用p作為中間指針對顧客鏈表中要刪除的顧客結點進行查找 182 pr=h;//pr為航線鏈表的頭結點 183 p=pr->next;//用p作為指針對航線鏈表中要刪除的航班結點進行查找 184 printf("\t\t請輸入你要刪除的航班號:"); 185 scanf("%s",flight_num); 186 while(p!=NULL)//要刪除的航班存在,下面進行刪除操作 187 { 188 if(strcmp(flight_num,p->flight_num)==0) 189 { 190 pr->next=p->next;//移動指針找着要刪除的航班結點 191 free(p);//刪除操作 192 printf("\t\t刪除%s航班成功!\n",flight_num); 193 mark=0; 194 p=NULL; 195 } 196 if(pr->next!=NULL) 197 { 198 pr=pr->next; 199 p=pr->next; 200 } 201 } 202 if(mark==1) 203 printf("\t\t無此航班,無法刪除!\n"); 204 else 205 { 206 while(q!=NULL)//要刪除的顧客存在,下面進行刪除操作 207 { 208 if(strcmp(flight_num,q->flight_num)==0) 209 { 210 qr->next=q->next;//移動指針找着要刪除的顧客結點 211 free(q); 212 q=NULL; 213 } 214 if(qr->next!=NULL) 215 { 216 qr=qr->next; 217 q=qr->next; 218 } 219 } 220 } 221 } 222 int delete_passenger(passengerList *&PList,flightnode *&h,char *name,char *ID_num) 223 //目的是按照要退票的顧客的姓名查找該顧客結點,進行刪除操作 224 { 225 passengernode *p,*pr=PList->head;//pr指向顧客鏈表的頭結點 226 p=pr->next; 227 while(p!=NULL) 228 { 229 if(strcmp(name,p->name)==0&&strcmp(ID_num,p->ID_num)==0) 230 { 231 for(flightnode *f=h->next;f!=NULL;f=f->next) 232 if(strcmp(p->flight_num,f->flight_num)==0) 233 { 234 f->left=f->left+p->ticket_num; 235 f->isFull=0; 236 break; 237 } 238 pr->next=p->next; 239 free(p); 240 printf("\t\t顧客%s,%s退票成功!\n",name,ID_num); 241 return 1; 242 } 243 pr=pr->next; 244 p=pr->next; 245 } 246 printf("\t\t無此顧客,無法退票!\n"); 247 return 0; 248 } 249 250 void add_flight(flightnode *&h)//錄入航班信息后調用insert_flight函數增加航班 251 { 252 flightnode *p=h; 253 char flight_num[10],start_time[10],end_time[10],start_place[20],end_place[20]; 254 int left,isFull,mark=1; 255 float price,price_discount; 256 for(;p->next!=NULL;p=p->next){}//移動指針,找到最后一個結點 257 while(mark==1) 258 { 259 printf("\t\t請輸入你要增加的航班號:"); 260 scanf("%s",flight_num); 261 printf("\t\t請輸入出發地:"); 262 scanf("%s",start_place); 263 printf("\t\t請輸入目的地:"); 264 scanf("%s",end_place); 265 printf("\t\t請輸入起飛時間:"); 266 scanf("%s",start_time); 267 printf("\t\t請輸入抵達時間:"); 268 scanf("%s",end_time); 269 printf("\t\t請輸入票價:"); 270 scanf("%f",&price); 271 printf("\t\t請輸入剩余座位數:"); 272 scanf("%d",&left); 273 printf("\t\t請輸入是否滿倉(0表示沒有滿倉1以滿倉):"); 274 scanf("%d",&isFull); 275 insert_flight(p,flight_num,start_place,end_place,start_time,end_time,left,price, price_discount,isFull); 276 printf("\t\t增加航班%s成功!\n",flight_num); 277 printf("\t\t是否繼續錄入航班信息(1表示繼續錄入;0表示停止錄入).\n"); 278 printf("\t\t請輸入:"); 279 scanf("%d",&mark); 280 } 281 } 282 283 int flight_num_check(flightnode *h,char *flight_num)//用航班號進行查詢 284 { 285 flightnode *p=h; 286 printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班號","起飛城市","抵達城市","起飛時間","抵達時間","價格","是否滿倉","空座數"); 287 for(;p!=NULL;p=p->next) 288 { 289 if(strcmp(p->flight_num,flight_num)==0) 290 { 291 printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-10d%-8d\n",p->flight_num, p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->isFull,p->left); 292 return 1; 293 } 294 } 295 printf("\t\t抱歉,沒有航班號為%s的航班信息!\n",flight_num); 296 return 0; 297 } 298 int place_check(flightnode *h,char *start_place,char *end_place)//用起飛抵達城市進行查詢 299 { 300 flightnode *p=h; 301 int mark=0; 302 printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班號","起飛城市","抵達城市","起飛時間","抵達時間","價格","是否滿倉","空座數"); 303 for(;p!=NULL;p=p->next) 304 { 305 if(strcmp(p->start_place,start_place)==0&&strcmp(p->end_place,end_place)==0) 306 { 307 printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-10d%-8d\n",p->flight_num, p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->isFull,p->left); 308 mark=1; 309 } 310 } 311 if(mark==0) 312 { 313 printf("\t\t抱歉,沒有從%s到%s的航班信息!\n",start_place,end_place); 314 return 0; 315 } 316 return 1; 317 } 318 void check_all_flight(flightnode *h) 319 { 320 flightnode *p=h; 321 int m=0; 322 printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班號","起飛城市","抵達城市","起飛時間","抵達時間","價格","是否滿倉","空座數"); 323 for(;p!=NULL;p=p->next) 324 { 325 printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-10d%-8d\n",p->flight_num, p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->isFull,p->left); 326 m=1; 327 } 328 if(m==0) 329 printf("\t\t航班信息為空!\n"); 330 } 331 void flight_check(flightnode *h)//選擇使用哪一個函數進行查詢 332 { 333 flightnode *p=h->next; 334 char flight_num[10],start_place[20],end_place[20]; 335 char a; 336 printf("\t\t請選擇航班查詢方式:\n"); 337 printf("\t\t1表示按航班號進行查詢;\n"); 338 printf("\t\t2表示按起飛抵達城市進行查詢;\n"); 339 printf("\t\t3表示瀏覽全部航班信息.\n\t\t請選擇輸入:"); 340 a=getch(); 341 printf("%c\n",a); 342 if(a=='1') 343 { 344 printf("\t\t請輸入航班號:"); 345 scanf("%s",flight_num); 346 flight_num_check(p,flight_num); 347 } 348 else if(a=='2') 349 { 350 printf("\t\t請輸入起飛城市:"); 351 scanf("%s",start_place); 352 printf("\t\t請輸入抵達城市:"); 353 scanf("%s",end_place); 354 place_check(p,start_place,end_place); 355 } 356 else if(a=='3') 357 check_all_flight(p); 358 else 359 return; 360 } 361 362 int ID_name_check(passengerList *PList,char *name,char *ID_num) 363 { 364 passengernode *p=PList->head->next; 365 int mark=0; 366 printf("%-8s%-20s%-20s%-10s%-8s%\n","訂單號","姓名","證件號","航班號","訂票數量"); 367 for(;p!=NULL;p=p->next) 368 { 369 if(strcmp(p->ID_num,ID_num)==0&&strcmp(p->name,name)==0) 370 { 371 printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num, p->flight_num,p->ticket_num); 372 mark=1; 373 } 374 } 375 if(mark==0) 376 { 377 printf("\t\t抱歉,沒有%s,%s的訂單信息!\n",name,ID_num); 378 return 0; 379 } 380 return 1; 381 } 382 int order_num_check(passengerList *PList,int order_num) 383 { 384 passengernode *p=PList->head->next; 385 printf("%-8s%-20s%-20s%-10s%-8s%\n","訂單號","姓名","證件號","航班號","訂票數量"); 386 for(;p!=NULL;p=p->next) 387 { 388 if(p->order_num==order_num) 389 { 390 printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num, p->flight_num,p->ticket_num); 391 return 1; 392 } 393 } 394 printf("\t\t抱歉,沒有訂單號為%d的訂單信息!\n",order_num); 395 return 0; 396 } 397 void check_all_passenger(passengerList *PList) 398 { 399 passengernode *p=PList->head->next; 400 int m=0; 401 printf("%-8s%-20s%-20s%-10s%-8s%\n","訂單號","姓名","證件號","航班號","訂票數量"); 402 for(;p!=NULL;p=p->next) 403 { 404 printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num, p->flight_num,p->ticket_num); 405 m=1; 406 } 407 if(m==0) 408 printf("\t\t訂單信息為空!\n"); 409 } 410 void passenger_check(passengerList *PList) 411 { 412 char name[20],ID_num[15]; 413 int order_num; 414 char a; 415 printf("\t\t請選擇訂單查詢方式:\n"); 416 printf("\t\t1表示按客戶姓名和證件號進行查詢;\n"); 417 printf("\t\t2表示按訂單號進行查詢;\n"); 418 printf("\t\t3表示查看全部訂單信息.\n\t\t請選擇輸入:"); 419 a=getch(); 420 printf("%c\n",a); 421 if(a=='1') 422 { 423 printf("\t\t請輸入客戶姓名:"); 424 scanf("%s",name); 425 printf("\t\t請輸入證件號:"); 426 scanf("%s",ID_num); 427 ID_name_check(PList,name,ID_num); 428 } 429 else if(a=='2') 430 { 431 printf("\t\t請輸入訂單號:"); 432 scanf("%d",&order_num); 433 order_num_check(PList,order_num); 434 } 435 else if(a=='3') 436 check_all_passenger(PList); 437 else 438 return; 439 } 440 441 void modify_flight(flightnode *&h,passengerList *&PList) 442 { 443 flightnode *p=h->next; 444 char flight_num[10],start_time[10],end_time[10]; 445 char a; 446 printf("\t\t************航線信息修改*************\n\n"); 447 printf("\t\t*************************************\n\n"); 448 printf("\t\t* 增加航班-------1 *\n\n"); 449 printf("\t\t* 刪除航班-------2 *\n\n"); 450 printf("\t\t* 修改航班時間---3 *\n\n"); 451 printf("\t\t*************************************\n\n"); 452 printf("\t\t請選擇:"); 453 a=getch(); 454 printf("%c\n",a); 455 if(a=='1') 456 add_flight(h); 457 else if(a=='2') 458 delete_flight(h,PList); 459 else if(a=='3') 460 { 461 printf("\t\t請輸入要修改的航班的航班號:"); 462 scanf("%s",flight_num); 463 if(flight_num_check(p,flight_num)==1) 464 { 465 printf("\t\t請輸入修改后的起飛時間:"); 466 scanf("%s",start_time); 467 printf("\t\t請輸入修改后的抵達時間:"); 468 scanf("%s",end_time); 469 for(;p!=NULL;p=p->next) 470 if(strcmp(flight_num,p->flight_num)==0) 471 { 472 strcpy(p->start_time,start_time); 473 strcpy(p->end_time,end_time); 474 printf("\t\t航班%s時間修改成功!\n",flight_num); 475 } 476 } 477 } 478 else 479 return; 480 } 481 482 int book(flightnode *&h,passengerList *&PList) 483 { 484 char name[20]; //姓名 485 char ID_num[20]; //證件號 486 char flight_num[10]; //航班號 487 char start_place[20];//起飛城市 488 char end_place[20]; //抵達城市 489 int ticket_num; //訂票數量 490 int k; 491 flightnode *p=h->next; 492 printf("\t\t請輸入信息:\n"); 493 printf("\t\t請輸入起飛城市:"); 494 scanf("%s",start_place); 495 printf("\t\t請輸入抵達城市:"); 496 scanf("%s",end_place); 497 if(place_check(h,start_place,end_place)==1) 498 { 499 printf("\t\t航班號:"); 500 scanf("%s",flight_num); 501 while(flight_num==NULL){ 502 printf("航班號不能為空!\n"); 503 printf("\t\t航班號:"); 504 scanf("%s",flight_num); 505 } 506 while(p!=NULL){ 507 if(strcmp(p->flight_num,flight_num)==0) 508 { 509 printf("\t\t姓名:"); 510 scanf("%s",name); 511 printf("\t\t證件號碼:"); 512 scanf("%s",ID_num); 513 printf("\t\t訂票數量:"); 514 scanf("%d",&ticket_num); 515 while(name==NULL){ 516 printf("客戶姓名不能為空!\n"); 517 printf("\t\t姓名:"); 518 scanf("%s",name); 519 } 520 while(ID_num==NULL){ 521 printf("客戶證件號碼不能為空!\n"); 522 printf("\t\t證件號碼:"); 523 scanf("%s",ID_num); 524 } 525 while(ticket_num==0){ 526 printf("客戶訂票數量不能為空!\n"); 527 printf("\t\t訂票數量:"); 528 scanf("%d",&ticket_num); 529 } 530 if(p->left>0&&p->left>=ticket_num) 531 { 532 insert_passengerList(h,PList,name,ID_num,flight_num,ticket_num); 533 534 getch(); 535 printf("\t\t恭喜您,訂票成功!\n"); 536 return 1; 537 } 538 else 539 { 540 printf("\t\t***很遺憾,該航班已滿!***\n"); 541 printf("\t\t***如選擇其他航班請輸入-----1\n\t\t***不選則輸入-----0***\n"); 542 printf("\t\t輸入數字進行選擇:"); 543 scanf("%d",&k); 544 if(k==1) 545 { 546 printf("\t\t此航線上的其他航班有:\n"); 547 if(find_same_flight(h,flight_num)==1) 548 { 549 printf("\t\t請輸入您選的航班:"); 550 scanf("%s",flight_num); 551 insert_passengerList(h,PList,name,ID_num,flight_num, ticket_num); 552 printf("\t\t恭喜您,訂票成功!\n"); 553 return 1; 554 } 555 } 556 } 557 } 558 else 559 p=p->next; 560 } 561 if(p==NULL) 562 printf("\t\t對不起,您輸入的航班不存在!\n"); 563 } 564 return 0; 565 } 566 567 void cancel(passengerList *&PList,flightnode *&h) 568 { 569 char name[20],ID_num[20]; 570 printf("\t\t請輸入你的姓名:"); 571 scanf("%s",name); 572 printf("\t\t請輸入你的證件號:"); 573 scanf("%s",ID_num); 574 delete_passenger(PList,h,name,ID_num); 575 } 576 577 int main() 578 { 579 char choice; 580 int t=1; 581 flightnode *flight; 582 passengerList *PList; 583 init_flight(flight);//初始化航班鏈表 584 init_passengerList(PList); 585 load_flight(flight); 586 load_passenger(PList); 587 while(t==1) 588 { 589 printf("\t\t************飛機訂票系統菜單*************\n"); 590 printf("\t\t*****************************************\n"); 591 printf("\t\t* 錄入信息----------1 *\n\n"); 592 printf("\t\t* 訂 票----------2 *\n\n"); 593 printf("\t\t* 退 票----------3 *\n\n"); 594 printf("\t\t* 查詢航班----------4 *\n\n"); 595 printf("\t\t* 查詢訂單----------5 *\n\n"); 596 printf("\t\t* 修改航線----------6 *\n\n"); 597 printf("\t\t* 保存退出----------0 *\n\n"); 598 printf("\t\t*****************************************\n\n"); 599 printf("\t\t請選擇服務:"); 600 choice=getch(); 601 printf("%c\n",choice); 602 system("cls"); 603 if(choice=='1'){ 604 add_flight(flight); 605 getch(); 606 system("cls"); 607 }else if(choice=='2'){ 608 book(flight,PList); 609 getch(); 610 system("cls"); 611 }else if(choice=='3'){ 612 cancel(PList,flight); 613 getch(); 614 system("cls"); 615 }else if(choice=='4'){ 616 flight_check(flight); 617 getch(); 618 system("cls"); 619 }else if(choice=='5'){ 620 passenger_check(PList); 621 getch(); 622 system("cls"); 623 }else if(choice=='6'){ 624 modify_flight(flight,PList); 625 getch(); 626 system("cls"); 627 }else if(choice=='0'){ 628 printf("\t\t再見!\n"); 629 t=0; 630 } 631 } 632 save_flight(flight); 633 save_passenger(PList); 634 return 0; 635 }