飞机订票系统源代码


问题及代码:

  1. /****************************************************  
  2. *版权所有(C)2017,张思琦 
  3. *文件名称:飞机订票系统  
  4. *文件标识:无  
  5. *内容摘要:实现录入航班信息、订票、退票、预约、 
  6. *          查询航班、查询订单、查看预约、修改航班功能。 
  7. *其他内容:无  
  8. *当前版本:VC++6.0  
  9. *作    者:zsq 
  10. *完成日期:2017.12.21  
  11. *修改记录:无  
  12. ****************************************************/    

1、plane.h的代码


  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5.   
  6. typedef struct flightnode  
  7. {  
  8.     char flight_num[10];//航班号  
  9.     char start_time[15];//起飞时间  
  10.     char end_time[15];//抵达时间  
  11.     char start_place[20];//起飞城市  
  12.     char end_place[20];//降落城市  
  13.     int left;//空座数  
  14.     float price;//票价  
  15.     int ifull;//航班是否满仓  
  16.     struct flightnode *next;//指向下一节点  
  17. }flightnode;  
  18.   
  19. typedef struct passengernode  
  20. {  
  21.     char name[20];//姓名  
  22.     char ID_num[20];//证件号  
  23.     char flight_num[10];//航班号  
  24.     int order_num;//订单号  
  25.     int ticket_num;//订票数量  
  26.     struct passengernode *next;//指向下一节点  
  27. }passengernode;  
  28.   
  29. typedef struct passengerList  
  30. {  
  31.     passengernode *head;  
  32.     passengernode *rear;  
  33. }passengerList;  
  34.   
  35. typedef struct waitnode  
  36. {  
  37.     char name[20];//姓名  
  38.     char phone[20];//手机号  
  39.     char flight_num[10];//航班号  
  40.     int ticket_num;//订票数量  
  41.     int order_num;//预约排队号  
  42.     struct waitnode *next;//指向下一节点  
  43.   
  44. }waitnode;  
  45.   
  46. typedef struct waitList  
  47. {  
  48.     waitnode *front;  
  49.     waitnode *rear;  
  50. }waitList;  
  51.   
  52. void init_flight(flightnode *&h);//建立以h为头结点的空链表,录入航班信息和增加航班后将航班结点插入该链表  
  53. void init_passengerList(passengerList *&pList);//建立一个带有头尾指针的空链表,存储带有顾客信息的节点  
  54. void init_waitList(waitList *&wList);//建立一个带有头尾指针的空链表,存储带有预约客户信息的节点  
  55.   
  56. void save_flight(flightnode *h);//保存航班信息到指定的数据文件中  
  57. void load_flight(flightnode *&h);//从存储航班信息的文件导入航班信息到航班链表中  
  58.   
  59. void save_passenger(passengerList *PList);//保存客户信息到指定数据文件中  
  60. void load_passenger(passengerList *&PList);//从存储客户信息的文件导入客户信息到客户链表中  
  61.   
  62. void save_wait(waitList *WList);//保存预约客户信息到指定数据文件中  
  63. void load_wait(waitList *&WList);//从存储预约客户信息的文件导入预约客户信息到预约客户链表中  
  64.   
  65. void add_flight(flightnode *&h);//录入航班信息后调用insert_flight函数增加航班  
  66. //录入航班情况或增加新的航班后,将新的航班结点插入到航线链表中  
  67. void insert_flight(flightnode *&h, char *flight_num, char *start_place, char *end_place, char *start_time, char *end_time, int left, float price, int ifull);  
  68.   
  69. //完成客户订票,将客户结点插入客户链表,并修改相应的航班信息  
  70. int book(flightnode *&h,passengerList *&PList,waitList *WList);  
  71. //客户订票时输入的航班号对应航班已满,提供其他可选航班并输出显示  
  72. int find_same_flight(flightnode *h,char *flight_num);  
  73. //在客户订票后,将该客户结点插入到客户链表,并修改相应航班信息  
  74. void insert_passengerList(flightnode *&h, passengerList *&PList, char *name, char *ID_num, char *flight_num, int ticket_num);  
  75.   
  76. //在客户预约票后,将该预约客户结点插入到预约客户链表  
  77. void insert_waitList(waitList *&WList, char *name, char *phone, char *flight_num, int ticket_num,int order_num);  
  78.   
  79. //完成退票,将订单从客户链表删除并修改相应航班信息  
  80. void cancel(passengerList *&PList,flightnode *&h);  
  81. //按照要退票的客户姓名和证件号查找该客户结点,进行删除操作  
  82. int delete_passenger(passengerList *&PList,flightnode *&h, char *name, char *ID_num);  
  83.   
  84. void flight_check(flightnode *h);//选择使用何种方式对航班信息进行查询  
  85. void check_all_flight(flightnode *h);//浏览所有航班信息  
  86. int place_check(flightnode *h, char *start_place, char *end_place);//按照起飞抵达城市查询航班信息  
  87. int flight_num_check(flightnode *h, char *flight_num);//按照航班号查询航班信息  
  88.   
  89. void passenger_check(passengerList *PList);//选择使用何种方式查询订单信息  
  90. void check_all_passenger(passengerList *PList);//浏览所有订单信息  
  91. int ID_name_check(passengerList *PList, char *name, char *ID_num);//按客户姓名和证件号查询订单信息  
  92.   
  93. void check_all_wait(waitList *WList);//浏览所有预约客户信息  
  94.   
  95. void modify_flight(flightnode *&h, passengerList *&PList);//修改航班信息  
  96. void delete_flight(flightnode *&h, passengerList *&PList);//按照某个航班号删除航班结点  
  97. void modify_flight_time(flightnode *&h, passengerList *&PList);//修改航班时间  
#include 
#include 
#include 
#include 

typedef struct flightnode
{
	char flight_num[10];//航班号
	char start_time[15];//起飞时间
    char end_time[15];//抵达时间
	char start_place[20];//起飞城市
	char end_place[20];//降落城市
	int left;//空座数
	float price;//票价
	int ifull;//航班是否满仓
	struct flightnode *next;//指向下一节点
}flightnode;

typedef struct passengernode
{
	char name[20];//姓名
	char ID_num[20];//证件号
	char flight_num[10];//航班号
	int order_num;//订单号
	int ticket_num;//订票数量
	struct passengernode *next;//指向下一节点
}passengernode;

typedef struct passengerList
{
	passengernode *head;
	passengernode *rear;
}passengerList;

typedef struct waitnode
{
	char name[20];//姓名
	char phone[20];//手机号
	char flight_num[10];//航班号
	int ticket_num;//订票数量
	int order_num;//预约排队号
	struct waitnode *next;//指向下一节点

}waitnode;

typedef struct waitList
{
	waitnode *front;
	waitnode *rear;
}waitList;

void init_flight(flightnode *&h);//建立以h为头结点的空链表,录入航班信息和增加航班后将航班结点插入该链表
void init_passengerList(passengerList *&pList);//建立一个带有头尾指针的空链表,存储带有顾客信息的节点
void init_waitList(waitList *&wList);//建立一个带有头尾指针的空链表,存储带有预约客户信息的节点

void save_flight(flightnode *h);//保存航班信息到指定的数据文件中
void load_flight(flightnode *&h);//从存储航班信息的文件导入航班信息到航班链表中

void save_passenger(passengerList *PList);//保存客户信息到指定数据文件中
void load_passenger(passengerList *&PList);//从存储客户信息的文件导入客户信息到客户链表中

void save_wait(waitList *WList);//保存预约客户信息到指定数据文件中
void load_wait(waitList *&WList);//从存储预约客户信息的文件导入预约客户信息到预约客户链表中

void add_flight(flightnode *&h);//录入航班信息后调用insert_flight函数增加航班
//录入航班情况或增加新的航班后,将新的航班结点插入到航线链表中
void insert_flight(flightnode *&h, char *flight_num, char *start_place, char *end_place, char *start_time, char *end_time, int left, float price, int ifull);

//完成客户订票,将客户结点插入客户链表,并修改相应的航班信息
int book(flightnode *&h,passengerList *&PList,waitList *WList);
//客户订票时输入的航班号对应航班已满,提供其他可选航班并输出显示
int find_same_flight(flightnode *h,char *flight_num);
//在客户订票后,将该客户结点插入到客户链表,并修改相应航班信息
void insert_passengerList(flightnode *&h, passengerList *&PList, char *name, char *ID_num, char *flight_num, int ticket_num);

//在客户预约票后,将该预约客户结点插入到预约客户链表
void insert_waitList(waitList *&WList, char *name, char *phone, char *flight_num, int ticket_num,int order_num);

//完成退票,将订单从客户链表删除并修改相应航班信息
void cancel(passengerList *&PList,flightnode *&h);
//按照要退票的客户姓名和证件号查找该客户结点,进行删除操作
int delete_passenger(passengerList *&PList,flightnode *&h, char *name, char *ID_num);

void flight_check(flightnode *h);//选择使用何种方式对航班信息进行查询
void check_all_flight(flightnode *h);//浏览所有航班信息
int place_check(flightnode *h, char *start_place, char *end_place);//按照起飞抵达城市查询航班信息
int flight_num_check(flightnode *h, char *flight_num);//按照航班号查询航班信息

void passenger_check(passengerList *PList);//选择使用何种方式查询订单信息
void check_all_passenger(passengerList *PList);//浏览所有订单信息
int ID_name_check(passengerList *PList, char *name, char *ID_num);//按客户姓名和证件号查询订单信息

void check_all_wait(waitList *WList);//浏览所有预约客户信息

void modify_flight(flightnode *&h, passengerList *&PList);//修改航班信息
void delete_flight(flightnode *&h, passengerList *&PList);//按照某个航班号删除航班结点
void modify_flight_time(flightnode *&h, passengerList *&PList);//修改航班时间

2、plane.cpp的代码


  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include "plane.h"  
  6.   
  7. //建立以h为头结点的空链表,录入航班信息和增加航班后将航班结点插入该链表  
  8. void init_flight(flightnode *&h)  
  9. {  
  10.     h=(flightnode *)malloc(sizeof(flightnode));//申请头结点空间  
  11.     if(h==NULL)  
  12.         exit(0);  
  13.     h->next=NULL;//将头结点h的指针域置为空  
  14. }  
  15. //建立一个带有头尾指针的空链表,存储带有客户信息的节点  
  16. void init_passengerList(passengerList *&pList)  
  17. {  
  18.     pList=(passengerList *)malloc(sizeof(passengerList));  
  19.     pList->head=(passengernode *)malloc(sizeof(passengernode));//创建头结点  
  20.     pList->rear=pList->head;  
  21.     pList->rear->order_num=0;//订单号从0开始计数  
  22.     pList->head->next=NULL;  
  23. }  
  24. //建立一个带有头尾指针的空队,存储带有预约客户信息的节点  
  25. void init_waitList(waitList *&wList)  
  26. {  
  27.     wList=(waitList *)malloc(sizeof(waitList));  
  28.     wList->front=(waitnode *)malloc(sizeof(waitnode));//创建头结点  
  29.     wList->rear=wList->front;  
  30.     wList->rear->order_num=0;//预约排队号从0开始计数  
  31.     wList->front->next=NULL;  
  32. }  
  33.   
  34. //保存航班信息到指定的数据文件中  
  35. void save_flight(flightnode *h)  
  36. {  
  37.     FILE *fp=fopen("flightList.dat","wb");//以只写('wb')的方式打开名为'flightList.dat'的文件  
  38.     if(fp==NULL)  
  39.         return;  
  40.     flightnode *temp=h->next;  
  41.     while(temp!=NULL)  
  42.     {  
  43.         fwrite(temp,sizeof(flightnode),1,fp);//向其中写入temp(temp是指针)地址的l个flightnode类型的数据  
  44.         temp=temp->next;  
  45.     }  
  46.     fclose(fp);//关闭fp指向的文件  
  47. }  
  48. //从存储航班信息的文件导入航班信息到航班链表中  
  49. void load_flight(flightnode *&h)  
  50. {  
  51.     flightnode *pt=h;  
  52.     FILE *fp=fopen("flight.dat","rb");  
  53.     if(fp==NULL)  
  54.         return;  
  55.     flightnode *q;  
  56.     int n;  
  57.     while(!feof(fp))//文件指针没有到达文件末尾(最后一个字符的下一个位置,即读失败时的位置)  
  58.     {  
  59.         q=(flightnode *)malloc(sizeof(flightnode));  
  60.         n=fread(q,sizeof(flightnode),1,fp);//将写入的数据读取出来  
  61.         if(n!=1)  
  62.             break;  
  63.         pt->next=q;  
  64.         pt=q;  
  65.     }  
  66.     pt->next=NULL;  
  67.     fclose(fp);  
  68. }  
  69.   
  70. //保存已订票客户信息到指定数据文件中  
  71. void save_passenger(passengerList *PList)  
  72. {  
  73.     FILE *fp=fopen("passenger.dat","wb");  
  74.     if(fp==NULL)  
  75.         return;  
  76.     passengernode *temp=PList->head->next;  
  77.     while(temp!=NULL)  
  78.     {  
  79.         fwrite(temp,sizeof(passengernode),1,fp);//向其中写入temp(temp是指针)地址的l个passengernode类型的数据  
  80.         temp=temp->next;  
  81.     }  
  82.     fclose(fp);//关闭fp指向的文件  
  83. }  
  84. //从存储客户信息的文件导入客户信息到客户链表中  
  85. void load_passenger(passengerList *&PList)  
  86. {  
  87.     FILE *fp=fopen("passenger.dat","rb");  
  88.     if(fp==NULL)  
  89.         return;  
  90.     passengernode *q;  
  91.     int n;  
  92.     while(!feof(fp))//文件指针没有到达文件末尾(最后一个字符的下一个位置,即读失败时的位置)  
  93.     {  
  94.         q=(passengernode *)malloc(sizeof(passengernode));  
  95.         n=fread(q,sizeof(passengernode),1,fp);//将写入的数据读取出来  
  96.         if(n!=1)  
  97.             break;  
  98.         PList->rear->next=q;  
  99.         PList->rear=q;  
  100.     }  
  101.     PList->rear->next=NULL;  
  102.     fclose(fp);  
  103. }  
  104.   
  105. //保存预约客户信息到指定数据文件中  
  106. void save_wait(waitList *WList)  
  107. {  
  108.     FILE *fp=fopen("waitpassenger.dat","wb");  
  109.     if(fp==NULL)  
  110.         return;  
  111.     waitnode *temp=WList->front->next;  
  112.     while(temp!=NULL)  
  113.     {  
  114.         fwrite(temp,sizeof(waitnode),1,fp);//向其中写入temp(temp是指针)地址的l个waitnode类型的数据  
  115.         temp=temp->next;  
  116.     }  
  117.     fclose(fp);//关闭fp指向的文件  
  118. }  
  119. //从存储预约客户信息的文件导入预约客户信息到预约客户链表中  
  120. void load_wait(waitList *&WList)  
  121. {  
  122.     FILE *fp=fopen("waitpassenger.dat","rb");  
  123.     if(fp==NULL)  
  124.         return;  
  125.     waitnode *w;  
  126.     int n;  
  127.     while(!feof(fp))//文件指针没有到达文件末尾(最后一个字符的下一个位置,即读失败时的位置)  
  128.     {  
  129.         w=(waitnode *)malloc(sizeof(waitnode));  
  130.         n=fread(w,sizeof(waitnode),1,fp);//将写入的数据读取出来  
  131.         if(n!=1)  
  132.             break;  
  133.         WList->rear->next=w;  
  134.         WList->rear=w;  
  135.     }  
  136.     WList->rear->next=NULL;  
  137.     fclose(fp);  
  138. }  
  139. /********************************************************* 
  140. * 功能描述: 新航班结点插入航线链表 
  141. * 输入参数: 航班各项信息 
  142. * 输出参数: 无 
  143. * 返回值  : 无 
  144. * 其它说明: 无 
  145. *********************************************************/  
  146. void insert_flight(flightnode *&h, char *flight_num, char *start_place, char *end_place, char *start_time, char *end_time, int left, float price, int ifull)  
  147. {  
  148.     flightnode *q;//定义q为新增加的航班节点的指针的形参  
  149.     flightnode *p=h;  
  150.     q=(flightnode *)malloc(sizeof(flightnode));//为节点q申请空间  
  151.     strcpy(q->flight_num,flight_num);  
  152.     strcpy(q->start_place,start_place);  
  153.     strcpy(q->end_place,end_place);  
  154.     strcpy(q->start_time,start_time);  
  155.     strcpy(q->end_time,end_time);  
  156.     q->left=left;  
  157.     q->price=price;  
  158.     q->ifull=ifull;  
  159.     //用strcpy函数将新增加航班的各种信息复制到q节点中  
  160.     q->next=p->next;//将q节点的指针域置为空  
  161.     p->next=q;  
  162.     p=p->next;//将指针后移  
  163. }  
  164. /********************************************************* 
  165. * 功能描述: 录入航班信息 
  166. * 输入参数: 航班各项信息 
  167. * 输出参数: 匹配的航班各项信息 
  168. * 返回值  : 无 
  169. * 其它说明: 无 
  170. *********************************************************/  
  171. void add_flight(flightnode *&h)  
  172. {  
  173.     flightnode *p=h;  
  174.     char flight_num[10],start_time[10],end_time[10],start_place[10],end_place[10];  
  175.     int left,ifull,mark=1;  
  176.     float price;  
  177.     for(;p->next!=NULL;p=p->next)  
  178.     {}//移动指针,找到最后一个节点  
  179.     while(mark==1)  
  180.     {  
  181.         printf("\t\t请输入你要增加的航班号:");  
  182.         scanf("%s",flight_num);  
  183.         printf("\t\t请输入出发地:");  
  184.         scanf("%s",start_place);  
  185.         printf("\t\t请输入目的地:");  
  186.         scanf("%s",end_place);  
  187.         printf("\t\t请输入起飞时间:");  
  188.         scanf("%s",start_time);  
  189.         printf("\t\t请输入抵达时间:");  
  190.         scanf("%s",end_time);  
  191.         printf("\t\t请输入票价:");  
  192.         scanf("%f",&price);  
  193.         printf("\t\t请输入剩余座位数:");  
  194.         scanf("%d",&left);  
  195.         printf("\t\t请输入是否满仓(0表示没有满仓,1表示已满仓):");  
  196.         scanf("%d",&ifull);  
  197.         insert_flight(h, flight_num, start_place, end_place, start_time, end_time, left, price, ifull);  
  198.         printf("\t\t增加航班号%s成功!\n",flight_num);  
  199.         printf("\t\t是否继续录入航班信息(1表示继续录入,0表示停止录入)\n");  
  200.         printf("\t\t请输入:");  
  201.         scanf("%d",&mark);  
  202.     }  
  203. }  
  204. /********************************************************* 
  205. * 功能描述: 订票 
  206. * 输入参数: start_place,end_place,客户各项信息 
  207. * 输出参数: 匹配的航班信息 
  208. * 返回值  : 无 
  209. * 其它说明: 1—订票或预约  0—失败 
  210. *********************************************************/  
  211. //完成客户订票,将客户结点插入客户链表,并修改相应的航班信息  
  212. int book(flightnode *&h,passengerList *&PList,waitList *WList)  
  213. {  
  214.     char name[20];  
  215.     char ID_num[20];  
  216.     char flight_num[10];  
  217.     char start_place[20];  
  218.     char end_place[20];  
  219.     char phone[20];  
  220.     int ticket_num;  
  221.     int order_num=0;  
  222.     int k;  
  223.     flightnode *p=h->next;  
  224.     printf("\t\t请输入信息:\n");  
  225.     printf("\t\t请输入起飞城市:");  
  226.     scanf("%s",start_place);  
  227.     printf("\t\t请输入抵达城市:");  
  228.     scanf("%s",end_place);  
  229.     if(place_check(h,start_place,end_place)==1)  
  230.     {  
  231.         printf("\t\t航班号:");  
  232.         scanf("%s",flight_num);  
  233.         while(flight_num==NULL)  
  234.         {  
  235.             printf("航班号不能为空!\n");  
  236.             printf("\t\t航班号:");  
  237.             scanf("%s",flight_num);  
  238.         }  
  239.         while(p!=NULL)  
  240.         {  
  241.             if(strcmp(p->flight_num,flight_num)==0)  
  242.             {  
  243.                 printf("\t\t姓名:");  
  244.                 scanf("%s",name);  
  245.                 printf("\t\t证件号码:");  
  246.                 scanf("%s",ID_num);  
  247.                 printf("\t\t订票数量:");  
  248.                 scanf("%d",&ticket_num);  
  249.                 while(name==NULL)  
  250.                 {  
  251.                     printf("客户姓名不能为空!\n");  
  252.                     printf("\t\t姓名:");  
  253.                     scanf("%s",name);  
  254.                 }  
  255.                 while(ID_num==NULL)  
  256.                 {  
  257.                     printf("客户证件号码不能为空!\n");  
  258.                     printf("\t\t证件号码:");  
  259.                     scanf("%s",ID_num);  
  260.                 }  
  261.                 while(ticket_num==0)  
  262.                 {  
  263.                     printf("客户订票数量不能为空!\n");  
  264.                     printf("\t\t订票数量:");  
  265.                     scanf("%d",&ticket_num);  
  266.                 }  
  267.                 if(p->left>0 && p->left>=ticket_num)  
  268.                 {  
  269.                     insert_passengerList(h,PList,name,ID_num,flight_num,ticket_num);  
  270.                     printf("\t\t你应付金额¥%8.2f。\n",p->price*ticket_num);  
  271.                     getch();  
  272.                     printf("\t\t恭喜您,订票成功!\n");  
  273.                     return 1;  
  274.                 }  
  275.                 else  
  276.                 {  
  277.                     printf("\t\t***很遗憾,该航班已满!***\n");  
  278.                     printf("\t\t***如选择其他航班请输入——1\n\t\t***预约请输入——2\n\t\t***不选则输入——0***\n");  
  279.                     printf("\t\t输入数字进行选择:");  
  280.                     scanf("%d",&k);  
  281.                     if(k==1)  
  282.                     {  
  283.                         printf("\t\t请输入您选的航班:");  
  284.                         scanf("%s",flight_num);  
  285.                         insert_passengerList(h,PList,name,ID_num,flight_num,ticket_num);  
  286.                         printf("\t\t恭喜您,订票成功!\n");  
  287.                         return 1;  
  288.                     }  
  289.                     else if(k==2)  
  290.                     {  
  291.                         printf("\t\t请输入您的手机号:");  
  292.                         scanf("%s",phone);  
  293.                         printf("\t\t请输入您需要预约的航班号:");  
  294.                         scanf("%s",flight_num);  
  295.                         insert_waitList(WList, name,phone,flight_num, ticket_num,order_num);  
  296.                         printf("\t\t如有退票,会尽快联系您!\n");  
  297.                         return 1;  
  298.                     }  
  299.                 }  
  300.             }  
  301.             else  
  302.                 p=p->next;  
  303.         }  
  304.         if(p==NULL)  
  305.             printf("\t\t对不起,您输入的航班不存在!\n");  
  306.     }  
  307.     return 0;  
  308. }  
  309. /********************************************************* 
  310. * 功能描述: 客户结点插入客户链表,修改航班信息 
  311. * 输入参数: 无 
  312. * 输出参数: 无 
  313. * 返回值  : 无 
  314. * 其它说明: 无 
  315. *********************************************************/  
  316. void insert_passengerList(flightnode *&h, passengerList *&PList, char *name, char *ID_num, char *flight_num, int ticket_num)  
  317. {  
  318.     flightnode *p=h->next;  
  319.     for(;p!=NULL;p=p->next)  
  320.         if(strcmp(p->flight_num,flight_num)==0)  
  321.         {  
  322.             p->left=p->left-ticket_num;  
  323.             if(p->left==0)  
  324.                 p->ifull=1;  
  325.         }  
  326.     passengernode *q=(passengernode *)malloc(sizeof(passengernode));//新建结点,存放新的客户订单信息  
  327.     strcpy(q->name,name);  
  328.     strcpy(q->ID_num,ID_num);  
  329.     strcpy(q->flight_num,flight_num);  
  330.     q->ticket_num=ticket_num;  
  331.     q->next=NULL;  
  332.     //将新订单连接到链表中  
  333.     PList->rear->next=q;  
  334.     q->order_num=PList->rear->order_num+1;//生成订单号  
  335.     PList->rear=q;  
  336. }  
  337. /********************************************************* 
  338. * 功能描述: 预约客户结点插入预约客户队列 
  339. * 输入参数: 无 
  340. * 输出参数: 无 
  341. * 返回值  : 无 
  342. * 其它说明: 无 
  343. *********************************************************/  
  344. void insert_waitList(waitList *&WList, char *name, char *phone, char *flight_num, int ticket_num,int order_num)  
  345. {  
  346.     waitnode *p=(waitnode *)malloc(sizeof(waitnode));  
  347.     strcpy(p->name,name);  
  348.     strcpy(p->phone,phone);  
  349.     strcpy(p->flight_num,flight_num);  
  350.     p->ticket_num=ticket_num;  
  351.     p->next=NULL;  
  352.     if(WList->rear==NULL)  
  353.     {  
  354.         WList->front=WList->rear=p;  
  355.     }  
  356.     else  
  357.     {  
  358.         WList->rear->next=p;  
  359.         p->order_num=WList->rear->order_num+1;//生成预约排队号  
  360.         WList->rear=p;  
  361.     }  
  362. }  
  363. /********************************************************* 
  364. * 功能描述: 提供其他可选航班 
  365. * 输入参数: 无 
  366. * 输出参数: 对应航班信息 
  367. * 返回值  : 1—成功  0—失败 
  368. * 其它说明: 无 
  369. *********************************************************/  
  370. int find_same_flight(flightnode *h,char *flight_num)  
  371. {  
  372.     flightnode *t=h->next,*p=h->next;  
  373.     int mark=0;  
  374.     printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","是否满仓","空座数");  
  375.     while(p!=NULL)  
  376.     {  
  377.         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))  
  378.         {  
  379.             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->ifull,p->left);  
  380.             mark=1;  
  381.         }  
  382.         p=p->next;  
  383.     }  
  384.     if(mark=0)  
  385.     {  
  386.         printf("\t\t抱歉,无可选航班!\n");  
  387.         return 0;  
  388.     }  
  389.     return 1;  
  390. }  
  391.   
  392. /********************************************************* 
  393. * 功能描述: 退票 
  394. * 输入参数: name,ID_num 
  395. * 输出参数: 无 
  396. * 返回值  : 无 
  397. * 其它说明: 无 
  398. *********************************************************/  
  399. void cancel(passengerList *&PList, flightnode *&h)  
  400. {  
  401.     char name[20],ID_num[20];  
  402.     printf("\t\t请输入你的姓名:");  
  403.     scanf("%s",name);  
  404.     printf("\t\t请输入你的证件号:");  
  405.     scanf("%s",ID_num);  
  406.     delete_passenger(PList,h,name,ID_num);  
  407. }  
  408. /********************************************************* 
  409. * 功能描述: 查找客户结点,进行删除 
  410. * 输入参数: 无 
  411. * 输出参数: name,ID_num 
  412. * 返回值  : 1—成功  0—失败 
  413. * 其它说明: 无 
  414. *********************************************************/  
  415. int delete_passenger(passengerList *&PList,flightnode *&h, char *name, char *ID_num)  
  416. {  
  417.     passengernode *p,*pr=PList->head;//pr指向客户链表的头结点  
  418.     p=pr->next;  
  419.     while(p!=NULL)  
  420.     {  
  421.         if(strcmp(name,p->name)==0 && strcmp(ID_num,p->ID_num)==0)  
  422.         {  
  423.             for(flightnode *f=h->next;f!=NULL;f=f->next)  
  424.             {  
  425.                 if(strcmp(p->flight_num,f->flight_num)==0)  
  426.                 {  
  427.                     f->left=f->left+p->ticket_num;  
  428.                     f->ifull=0;  
  429.                     break;  
  430.                 }  
  431.             }  
  432.             pr->next=p->next;  
  433.             free(p);  
  434.             printf("\t\t客户%s,%s退票成功!\n",name,ID_num);  
  435.             return 1;  
  436.         }  
  437.         pr=pr->next;  
  438.         p=pr->next;  
  439.     }  
  440.     printf("\t\t无此客户,无法退票!\n");  
  441.     return 0;  
  442. }  
  443. /********************************************************* 
  444. * 功能描述: 选择使用何种方式对航班信息进行查询 
  445. * 输入参数: flight_num,start_place,end_place 
  446. * 输出参数: 无 
  447. * 返回值  : 无 
  448. * 其它说明: 无 
  449. *********************************************************/  
  450. void flight_check(flightnode *h)  
  451. {  
  452.     flightnode *p=h->next;  
  453.     char flight_num[10],start_place[20],end_place[20];  
  454.     char a;  
  455.     printf("\t\t请选择航班查询方式:\n");  
  456.     printf("\t\t1、按航班号进行查询:\n");  
  457.     printf("\t\t2、按起飞抵达城市进行查询:\n");  
  458.     printf("\t\t3、浏览全部航班信息.\n\t\t请输入:\n");  
  459.     a=getch();  
  460.     printf("%c\n",a);  
  461.     if(a=='1')  
  462.     {  
  463.         printf("\t\t请输入航班号:");  
  464.         scanf("%s",flight_num);  
  465.         flight_num_check(p,flight_num);  
  466.     }  
  467.     else if(a=='2')  
  468.     {  
  469.         printf("\t\t请输入起飞城市:");  
  470.         scanf("%s",start_place);  
  471.         printf("\t\t请输入抵达城市:");  
  472.         scanf("%s",end_place);  
  473.         place_check(p,start_place,end_place);  
  474.     }  
  475.     else if(a=='3')  
  476.         check_all_flight(p);  
  477.     else  
  478.         return;  
  479. }  
  480. /********************************************************* 
  481. * 功能描述: 按照航班号查询航班信息 
  482. * 输入参数: 无 
  483. * 输出参数: 对应航班信息 
  484. * 返回值  : 1—成功  0—失败 
  485. * 其它说明: 无 
  486. *********************************************************/  
  487. int flight_num_check(flightnode *h, char *flight_num)  
  488. {  
  489.     flightnode *p=h;  
  490.     printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","是否满仓","空座数");  
  491.     for(;p!=NULL;p=p->next)  
  492.     {  
  493.         if(strcmp(p->flight_num,flight_num)==0)  
  494.         {  
  495.             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->ifull,p->left);  
  496.             return 1;  
  497.         }  
  498.     }  
  499.     printf("\t\t抱歉,没有航班号为%s的航班信息!\n",flight_num);  
  500.     return 0;  
  501. }  
  502. /********************************************************* 
  503. * 功能描述: 按照起飞抵达城市查询航班信息 
  504. * 输入参数: 无 
  505. * 输出参数: 对应航班信息 
  506. * 返回值  : 1—成功  0—失败 
  507. * 其它说明: 无 
  508. *********************************************************/  
  509. int place_check(flightnode *h, char *start_place, char *end_place)  
  510. {  
  511.     flightnode *p=h;  
  512.     int mark=0;  
  513.     printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","是否满仓","空座数");  
  514.     for(;p!=NULL;p=p->next)  
  515.     {  
  516.         if(strcmp(p->start_place,start_place)==0 && strcmp(p->end_place,end_place)==0)  
  517.         {  
  518.             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->ifull,p->left);  
  519.             mark=1;  
  520.         }  
  521.     }  
  522.     if(mark==0)  
  523.     {  
  524.         printf("\t\t抱歉,没有从%s到%s的航班信息!\n",start_place,end_place);  
  525.         return 0;  
  526.     }  
  527.     return 1;  
  528. }  
  529. /********************************************************* 
  530. * 功能描述: 浏览所有航班信息 
  531. * 输入参数: 无 
  532. * 输出参数: 对应航班信息 
  533. * 返回值  : 1—成功  0—失败 
  534. * 其它说明: 无 
  535. *********************************************************/  
  536.   
  537. void check_all_flight(flightnode *h)  
  538. {  
  539.     flightnode *p=h;  
  540.     int mark=0;  
  541.     printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","是否满仓","空座数");  
  542.     for(;p!=NULL;p=p->next)  
  543.     {  
  544.             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->ifull,p->left);  
  545.             mark=1;  
  546.     }  
  547.     if(mark==0)  
  548.         printf("\t\t航班信息为空!\n");  
  549. }  
  550. /********************************************************* 
  551. * 功能描述: 选择使用何种方式查询订单信息 
  552. * 输入参数: name,ID_num 
  553. * 输出参数: 无 
  554. * 返回值  : 无 
  555. * 其它说明: 无 
  556. *********************************************************/  
  557.   
  558. void passenger_check(passengerList *PList)  
  559. {  
  560.     char name[20],ID_num[15];  
  561.     char a;  
  562.     printf("\t\t请选择订单查询方式:\n");  
  563.     printf("\t\t1、按客户姓名和证件号进行查询\n");  
  564.     printf("\t\t2、查看全部订单信息\n\t\t请选择输入:");  
  565.     a=getch();  
  566.     printf("%c\n",a);  
  567.     if(a=='1')  
  568.     {  
  569.         printf("\t\t请输入客户姓名:");  
  570.         scanf("%s",name);  
  571.         printf("\t\t请输入证件号:");  
  572.         scanf("%s",ID_num);  
  573.         ID_name_check(PList,name,ID_num);  
  574.     }  
  575.     else if(a=='2')  
  576.     {  
  577.         check_all_passenger(PList);  
  578.     }     
  579. }  
  580. /********************************************************* 
  581. * 功能描述: 按客户姓名和证件号查询订单信息 
  582. * 输入参数: 无 
  583. * 输出参数: 对应订单信息 
  584. * 返回值  : 1—成功  0—失败 
  585. * 其它说明: 无 
  586. *********************************************************/  
  587. int ID_name_check(passengerList *PList, char *name, char *ID_num)  
  588. {  
  589.     passengernode *p=PList->head->next;  
  590.     int mark=0;  
  591.     printf("%-8s%-20s%-20s%-10s%-8s%\n","订单号","姓名","证件号","航班号","订票数量");  
  592.     for(;p!=NULL;p=p->next)  
  593.     {  
  594.         if(strcmp(p->ID_num,ID_num)==0 && strcmp(p->name,name)==0)  
  595.         {  
  596.             printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num,p->flight_num,p->ticket_num);  
  597.             mark=1;  
  598.         }  
  599.     }  
  600.     if(mark==0)  
  601.     {  
  602.         printf("\t\t抱歉,没有%s,%s的订单信息!\n",name,ID_num);  
  603.         return 0;  
  604.     }  
  605.     return 1;  
  606. }  
  607. /********************************************************* 
  608. * 功能描述: 浏览所有订单信息 
  609. * 输入参数: 无 
  610. * 输出参数: 对应订单信息 
  611. * 返回值  : 1—成功  0—失败 
  612. * 其它说明: 无 
  613. *********************************************************/  
  614. void check_all_passenger(passengerList *PList)  
  615. {  
  616.     passengernode *p=PList->head->next;  
  617.     int m=0;  
  618.     printf("%-8s%-20s%-20s%-10s%-8s%\n","订单号","姓名","证件号","航班号","订票数量");  
  619.     for(;p!=NULL;p=p->next)  
  620.     {  
  621.         printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num,p->flight_num,p->ticket_num);  
  622.         m=1;  
  623.     }  
  624.     if(m==0)  
  625.         printf("\t\t订单信息为空!\n");  
  626. }  
  627.   
  628. /********************************************************* 
  629. * 功能描述: 浏览所有预约客户信息 
  630. * 输入参数: 无 
  631. * 输出参数: 对应预约订单信息 
  632. * 返回值  : 1—成功  0—失败 
  633. * 其它说明: 无 
  634. *********************************************************/  
  635. void check_all_wait(waitList *WList)  
  636. {  
  637.     waitnode *a=WList->front->next;  
  638.     int m=0;  
  639.     printf("%-20s%-20s%-10s%-8s%\n","姓名","手机号","航班号","订票数量","预约排队号");  
  640.     for(;a!=NULL;a=a->next)  
  641.     {  
  642.         printf("%-20s%-20s%-10s%-8d%\n",a->name,a->phone,a->flight_num,a->ticket_num,a->order_num);  
  643.         m=1;  
  644.     }  
  645.     if(m==0)  
  646.         printf("\t\t预约客户信息为空!\n");  
  647. }  
  648.   
  649. /********************************************************* 
  650. * 功能描述: 修改航班信息 
  651. * 输入参数: 无 
  652. * 输出参数: 无 
  653. * 返回值  : 1—成功  0—失败 
  654. * 其它说明: 无 
  655. *********************************************************/  
  656. void modify_flight(flightnode *&h, passengerList *&PList)  
  657. {  
  658.     flightnode *p=h->next;  
  659.     char a;  
  660.     printf("\t\t****************************\n");  
  661.     printf("\t\t********航线信息修改********\n");  
  662.     printf("\t\t****************************\n");  
  663.     printf("\t\t*       增加航班——1      *\n");  
  664.     printf("\t\t*       删除航班——2      *\n");  
  665.     printf("\t\t*       修改航班时间——3  *\n");  
  666.     printf("\t\t****************************\n");  
  667.     printf("\t\t请选择:");  
  668.     a=getch();  
  669.     printf("%c\n",a);  
  670.     if(a=='1')  
  671.         add_flight(h);  
  672.     else if(a=='2')  
  673.         delete_flight(h,PList);  
  674.     else if(a=='3')  
  675.     {  
  676.         modify_flight_time(h,PList);   
  677.     }  
  678.     else  
  679.         return;  
  680. }  
  681. /********************************************************* 
  682. * 功能描述: 按照某个航班号删除航班结点 
  683. * 输入参数: flight_num 
  684. * 输出参数: flight_num 
  685. * 返回值  : 1—成功  0—失败 
  686. * 其它说明: 无 
  687. *********************************************************/  
  688. void delete_flight(flightnode *&h, passengerList *&PList)  
  689. {  
  690.     flightnode *p,*pr;  
  691.     passengernode *q,*qr;  
  692.     char flight_num[10];  
  693.     int mark=1;  
  694.     qr=PList->head;//pr为客户链表的头结点  
  695.     q=qr->next;//用p作为中间指针对客户链表中要删除的客户节点进行查找  
  696.     pr=h;//pr为航线链表的头结点  
  697.     p=pr->next;//用p作为指针对航班链表中要删除的航班节点进行查找  
  698.     printf("\t\t请输入您要删除的航班号:");  
  699.     scanf("%s",flight_num);  
  700.     while(p!=NULL)//要删除的航班不存在,下面进行删除操作  
  701.     {  
  702.         if(strcmp(flight_num,p->flight_num)==0)  
  703.         {  
  704.             pr->next=p->next;//移动指针找要删除的航班节点  
  705.             free(p);  
  706.             printf("\t\t删除%s航班成功!\n",flight_num);  
  707.             mark=0;  
  708.             p=NULL;  
  709.         }  
  710.         if(pr->next!=NULL)  
  711.         {  
  712.             pr=pr->next;  
  713.             p=pr->next;  
  714.         }  
  715.     }  
  716.     if(mark==1)  
  717.         printf("\t\t无此航班,无法删除!\n");  
  718.     else  
  719.     {  
  720.         while(q!=NULL)//要删除的客户不存在,下面进行删除操作  
  721.         {  
  722.             if(strcmp(flight_num,q->flight_num)==0)  
  723.             {  
  724.                 qr->next=q->next;//移动指针找要删除的客户节点  
  725.                 free(q);  
  726.                 q=NULL;  
  727.             }  
  728.             if(qr->next!=NULL)  
  729.             {  
  730.                 qr=qr->next;  
  731.                 q=qr->next;  
  732.             }  
  733.         }  
  734.     }  
  735. }  
  736. /********************************************************* 
  737. * 功能描述: 修改航班时间 
  738. * 输入参数: flight_num,start_time,end_time 
  739. * 输出参数: flight_num 
  740. * 返回值  : 无 
  741. * 其它说明: 无 
  742. *********************************************************/  
  743. void modify_flight_time(flightnode *&h, passengerList *&PList)  
  744. {  
  745.     flightnode *p=h->next;  
  746.     char flight_num[10],start_time[10],end_time[10];  
  747.     printf("\t\t请输入要修改航班的航班号:");  
  748.     scanf("%s",flight_num);  
  749.     if(flight_num_check(p,flight_num)==1)  
  750.     {  
  751.         printf("\t\t请输入修改后的起飞时间:");  
  752.         scanf("%s",start_time);  
  753.         printf("\t\t请输入修改后的抵达时间:");  
  754.         scanf("%s",end_time);  
  755.         for(;p!=NULL;p=p->next)  
  756.         {  
  757.             if(strcmp(flight_num,p->flight_num)==0)  
  758.             {  
  759.                 strcpy(p->start_time,start_time);  
  760.                 strcpy(p->end_time,end_time);  
  761.                 printf("\t\t航班%s时间修改成功!\n",flight_num);  
  762.             }  
  763.         }  
  764.     }  
  765. }  
#include 
#include 
#include 
#include 
#include "plane.h"

//建立以h为头结点的空链表,录入航班信息和增加航班后将航班结点插入该链表
void init_flight(flightnode *&h)
{
	h=(flightnode *)malloc(sizeof(flightnode));//申请头结点空间
	if(h==NULL)
		exit(0);
	h->next=NULL;//将头结点h的指针域置为空
}
//建立一个带有头尾指针的空链表,存储带有客户信息的节点
void init_passengerList(passengerList *&pList)
{
	pList=(passengerList *)malloc(sizeof(passengerList));
	pList->head=(passengernode *)malloc(sizeof(passengernode));//创建头结点
	pList->rear=pList->head;
	pList->rear->order_num=0;//订单号从0开始计数
	pList->head->next=NULL;
}
//建立一个带有头尾指针的空队,存储带有预约客户信息的节点
void init_waitList(waitList *&wList)
{
	wList=(waitList *)malloc(sizeof(waitList));
	wList->front=(waitnode *)malloc(sizeof(waitnode));//创建头结点
	wList->rear=wList->front;
	wList->rear->order_num=0;//预约排队号从0开始计数
	wList->front->next=NULL;
}

//保存航班信息到指定的数据文件中
void save_flight(flightnode *h)
{
	FILE *fp=fopen("flightList.dat","wb");//以只写('wb')的方式打开名为'flightList.dat'的文件
	if(fp==NULL)
		return;
	flightnode *temp=h->next;
	while(temp!=NULL)
	{
		fwrite(temp,sizeof(flightnode),1,fp);//向其中写入temp(temp是指针)地址的l个flightnode类型的数据
		temp=temp->next;
	}
	fclose(fp);//关闭fp指向的文件
}
//从存储航班信息的文件导入航班信息到航班链表中
void load_flight(flightnode *&h)
{
	flightnode *pt=h;
    FILE *fp=fopen("flight.dat","rb");
	if(fp==NULL)
		return;
	flightnode *q;
	int n;
	while(!feof(fp))//文件指针没有到达文件末尾(最后一个字符的下一个位置,即读失败时的位置)
	{
		q=(flightnode *)malloc(sizeof(flightnode));
		n=fread(q,sizeof(flightnode),1,fp);//将写入的数据读取出来
		if(n!=1)
			break;
		pt->next=q;
		pt=q;
	}
	pt->next=NULL;
	fclose(fp);
}

//保存已订票客户信息到指定数据文件中
void save_passenger(passengerList *PList)
{
    FILE *fp=fopen("passenger.dat","wb");
	if(fp==NULL)
		return;
	passengernode *temp=PList->head->next;
	while(temp!=NULL)
	{
		fwrite(temp,sizeof(passengernode),1,fp);//向其中写入temp(temp是指针)地址的l个passengernode类型的数据
		temp=temp->next;
	}
	fclose(fp);//关闭fp指向的文件
}
//从存储客户信息的文件导入客户信息到客户链表中
void load_passenger(passengerList *&PList)
{
	FILE *fp=fopen("passenger.dat","rb");
	if(fp==NULL)
		return;
	passengernode *q;
	int n;
	while(!feof(fp))//文件指针没有到达文件末尾(最后一个字符的下一个位置,即读失败时的位置)
	{
		q=(passengernode *)malloc(sizeof(passengernode));
		n=fread(q,sizeof(passengernode),1,fp);//将写入的数据读取出来
		if(n!=1)
			break;
		PList->rear->next=q;
		PList->rear=q;
	}
	PList->rear->next=NULL;
	fclose(fp);
}

//保存预约客户信息到指定数据文件中
void save_wait(waitList *WList)
{
    FILE *fp=fopen("waitpassenger.dat","wb");
	if(fp==NULL)
		return;
	waitnode *temp=WList->front->next;
	while(temp!=NULL)
	{
		fwrite(temp,sizeof(waitnode),1,fp);//向其中写入temp(temp是指针)地址的l个waitnode类型的数据
		temp=temp->next;
	}
	fclose(fp);//关闭fp指向的文件
}
//从存储预约客户信息的文件导入预约客户信息到预约客户链表中
void load_wait(waitList *&WList)
{
	FILE *fp=fopen("waitpassenger.dat","rb");
	if(fp==NULL)
		return;
	waitnode *w;
	int n;
	while(!feof(fp))//文件指针没有到达文件末尾(最后一个字符的下一个位置,即读失败时的位置)
	{
		w=(waitnode *)malloc(sizeof(waitnode));
		n=fread(w,sizeof(waitnode),1,fp);//将写入的数据读取出来
		if(n!=1)
			break;
		WList->rear->next=w;
		WList->rear=w;
	}
	WList->rear->next=NULL;
	fclose(fp);
}
/*********************************************************
* 功能描述: 新航班结点插入航线链表
* 输入参数: 航班各项信息
* 输出参数: 无
* 返回值  : 无
* 其它说明: 无
*********************************************************/
void insert_flight(flightnode *&h, char *flight_num, char *start_place, char *end_place, char *start_time, char *end_time, int left, float price, int ifull)
{
	flightnode *q;//定义q为新增加的航班节点的指针的形参
	flightnode *p=h;
	q=(flightnode *)malloc(sizeof(flightnode));//为节点q申请空间
	strcpy(q->flight_num,flight_num);
	strcpy(q->start_place,start_place);
	strcpy(q->end_place,end_place);
	strcpy(q->start_time,start_time);
	strcpy(q->end_time,end_time);
	q->left=left;
	q->price=price;
	q->ifull=ifull;
	//用strcpy函数将新增加航班的各种信息复制到q节点中
	q->next=p->next;//将q节点的指针域置为空
	p->next=q;
	p=p->next;//将指针后移
}
/*********************************************************
* 功能描述: 录入航班信息
* 输入参数: 航班各项信息
* 输出参数: 匹配的航班各项信息
* 返回值  : 无
* 其它说明: 无
*********************************************************/
void add_flight(flightnode *&h)
{
	flightnode *p=h;
	char flight_num[10],start_time[10],end_time[10],start_place[10],end_place[10];
	int left,ifull,mark=1;
	float price;
	for(;p->next!=NULL;p=p->next)
	{}//移动指针,找到最后一个节点
	while(mark==1)
	{
		printf("\t\t请输入你要增加的航班号:");
		scanf("%s",flight_num);
        printf("\t\t请输入出发地:");
		scanf("%s",start_place);
		printf("\t\t请输入目的地:");
		scanf("%s",end_place);
		printf("\t\t请输入起飞时间:");
		scanf("%s",start_time);
		printf("\t\t请输入抵达时间:");
		scanf("%s",end_time);
		printf("\t\t请输入票价:");
		scanf("%f",&price);
		printf("\t\t请输入剩余座位数:");
		scanf("%d",&left);
		printf("\t\t请输入是否满仓(0表示没有满仓,1表示已满仓):");
		scanf("%d",&ifull);
		insert_flight(h, flight_num, start_place, end_place, start_time, end_time, left, price, ifull);
        printf("\t\t增加航班号%s成功!\n",flight_num);
		printf("\t\t是否继续录入航班信息(1表示继续录入,0表示停止录入)\n");
		printf("\t\t请输入:");
		scanf("%d",&mark);
	}
}
/*********************************************************
* 功能描述: 订票
* 输入参数: start_place,end_place,客户各项信息
* 输出参数: 匹配的航班信息
* 返回值  : 无
* 其它说明: 1—订票或预约  0—失败
*********************************************************/
//完成客户订票,将客户结点插入客户链表,并修改相应的航班信息
int book(flightnode *&h,passengerList *&PList,waitList *WList)
{
	char name[20];
	char ID_num[20];
	char flight_num[10];
	char start_place[20];
	char end_place[20];
	char phone[20];
	int ticket_num;
	int order_num=0;
	int k;
	flightnode *p=h->next;
	printf("\t\t请输入信息:\n");
	printf("\t\t请输入起飞城市:");
	scanf("%s",start_place);
	printf("\t\t请输入抵达城市:");
    scanf("%s",end_place);
	if(place_check(h,start_place,end_place)==1)
	{
		printf("\t\t航班号:");
		scanf("%s",flight_num);
		while(flight_num==NULL)
		{
			printf("航班号不能为空!\n");
			printf("\t\t航班号:");
			scanf("%s",flight_num);
		}
		while(p!=NULL)
		{
			if(strcmp(p->flight_num,flight_num)==0)
			{
				printf("\t\t姓名:");
				scanf("%s",name);
				printf("\t\t证件号码:");
				scanf("%s",ID_num);
				printf("\t\t订票数量:");
				scanf("%d",&ticket_num);
				while(name==NULL)
				{
					printf("客户姓名不能为空!\n");
					printf("\t\t姓名:");
				    scanf("%s",name);
				}
				while(ID_num==NULL)
				{
					printf("客户证件号码不能为空!\n");
					printf("\t\t证件号码:");
				    scanf("%s",ID_num);
				}
				while(ticket_num==0)
				{
					printf("客户订票数量不能为空!\n");
					printf("\t\t订票数量:");
				    scanf("%d",&ticket_num);
				}
				if(p->left>0 && p->left>=ticket_num)
				{
					insert_passengerList(h,PList,name,ID_num,flight_num,ticket_num);
					printf("\t\t你应付金额¥%8.2f。\n",p->price*ticket_num);
					getch();
					printf("\t\t恭喜您,订票成功!\n");
					return 1;
				}
				else
				{
					printf("\t\t***很遗憾,该航班已满!***\n");
					printf("\t\t***如选择其他航班请输入——1\n\t\t***预约请输入——2\n\t\t***不选则输入——0***\n");
					printf("\t\t输入数字进行选择:");
					scanf("%d",&k);
					if(k==1)
					{
						printf("\t\t请输入您选的航班:");
						scanf("%s",flight_num);
						insert_passengerList(h,PList,name,ID_num,flight_num,ticket_num);
						printf("\t\t恭喜您,订票成功!\n");
						return 1;
					}
					else if(k==2)
					{
						printf("\t\t请输入您的手机号:");
						scanf("%s",phone);
						printf("\t\t请输入您需要预约的航班号:");
						scanf("%s",flight_num);
						insert_waitList(WList, name,phone,flight_num, ticket_num,order_num);
						printf("\t\t如有退票,会尽快联系您!\n");
						return 1;
					}
				}
			}
			else
				p=p->next;
		}
		if(p==NULL)
			printf("\t\t对不起,您输入的航班不存在!\n");
	}
	return 0;
}
/*********************************************************
* 功能描述: 客户结点插入客户链表,修改航班信息
* 输入参数: 无
* 输出参数: 无
* 返回值  : 无
* 其它说明: 无
*********************************************************/
void insert_passengerList(flightnode *&h, passengerList *&PList, char *name, char *ID_num, char *flight_num, int ticket_num)
{
	flightnode *p=h->next;
	for(;p!=NULL;p=p->next)
		if(strcmp(p->flight_num,flight_num)==0)
		{
			p->left=p->left-ticket_num;
			if(p->left==0)
				p->ifull=1;
		}
    passengernode *q=(passengernode *)malloc(sizeof(passengernode));//新建结点,存放新的客户订单信息
	strcpy(q->name,name);
	strcpy(q->ID_num,ID_num);
	strcpy(q->flight_num,flight_num);
	q->ticket_num=ticket_num;
	q->next=NULL;
	//将新订单连接到链表中
	PList->rear->next=q;
	q->order_num=PList->rear->order_num+1;//生成订单号
	PList->rear=q;
}
/*********************************************************
* 功能描述: 预约客户结点插入预约客户队列
* 输入参数: 无
* 输出参数: 无
* 返回值  : 无
* 其它说明: 无
*********************************************************/
void insert_waitList(waitList *&WList, char *name, char *phone, char *flight_num, int ticket_num,int order_num)
{
	waitnode *p=(waitnode *)malloc(sizeof(waitnode));
	strcpy(p->name,name);
	strcpy(p->phone,phone);
	strcpy(p->flight_num,flight_num);
	p->ticket_num=ticket_num;
	p->next=NULL;
	if(WList->rear==NULL)
	{
		WList->front=WList->rear=p;
	}
	else
	{
		WList->rear->next=p;
		p->order_num=WList->rear->order_num+1;//生成预约排队号
		WList->rear=p;
	}
}
/*********************************************************
* 功能描述: 提供其他可选航班
* 输入参数: 无
* 输出参数: 对应航班信息
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/
int find_same_flight(flightnode *h,char *flight_num)
{
	flightnode *t=h->next,*p=h->next;
	int mark=0;
	printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","是否满仓","空座数");
	while(p!=NULL)
	{
		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))
		{
			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->ifull,p->left);
			mark=1;
		}
		p=p->next;
	}
	if(mark=0)
	{
		printf("\t\t抱歉,无可选航班!\n");
		return 0;
	}
	return 1;
}

/*********************************************************
* 功能描述: 退票
* 输入参数: name,ID_num
* 输出参数: 无
* 返回值  : 无
* 其它说明: 无
*********************************************************/
void cancel(passengerList *&PList, flightnode *&h)
{
	char name[20],ID_num[20];
	printf("\t\t请输入你的姓名:");
	scanf("%s",name);
	printf("\t\t请输入你的证件号:");
	scanf("%s",ID_num);
	delete_passenger(PList,h,name,ID_num);
}
/*********************************************************
* 功能描述: 查找客户结点,进行删除
* 输入参数: 无
* 输出参数: name,ID_num
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/
int delete_passenger(passengerList *&PList,flightnode *&h, char *name, char *ID_num)
{
	passengernode *p,*pr=PList->head;//pr指向客户链表的头结点
	p=pr->next;
	while(p!=NULL)
	{
		if(strcmp(name,p->name)==0 && strcmp(ID_num,p->ID_num)==0)
		{
			for(flightnode *f=h->next;f!=NULL;f=f->next)
			{
				if(strcmp(p->flight_num,f->flight_num)==0)
				{
					f->left=f->left+p->ticket_num;
					f->ifull=0;
					break;
				}
			}
			pr->next=p->next;
			free(p);
			printf("\t\t客户%s,%s退票成功!\n",name,ID_num);
			return 1;
		}
		pr=pr->next;
		p=pr->next;
	}
	printf("\t\t无此客户,无法退票!\n");
	return 0;
}
/*********************************************************
* 功能描述: 选择使用何种方式对航班信息进行查询
* 输入参数: flight_num,start_place,end_place
* 输出参数: 无
* 返回值  : 无
* 其它说明: 无
*********************************************************/
void flight_check(flightnode *h)
{
	flightnode *p=h->next;
	char flight_num[10],start_place[20],end_place[20];
	char a;
	printf("\t\t请选择航班查询方式:\n");
	printf("\t\t1、按航班号进行查询:\n");
	printf("\t\t2、按起飞抵达城市进行查询:\n");
	printf("\t\t3、浏览全部航班信息.\n\t\t请输入:\n");
	a=getch();
	printf("%c\n",a);
	if(a=='1')
	{
		printf("\t\t请输入航班号:");
		scanf("%s",flight_num);
		flight_num_check(p,flight_num);
	}
	else if(a=='2')
	{
		printf("\t\t请输入起飞城市:");
		scanf("%s",start_place);
		printf("\t\t请输入抵达城市:");
		scanf("%s",end_place);
		place_check(p,start_place,end_place);
	}
	else if(a=='3')
		check_all_flight(p);
	else
		return;
}
/*********************************************************
* 功能描述: 按照航班号查询航班信息
* 输入参数: 无
* 输出参数: 对应航班信息
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/
int flight_num_check(flightnode *h, char *flight_num)
{
	flightnode *p=h;
    printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","是否满仓","空座数");
	for(;p!=NULL;p=p->next)
	{
		if(strcmp(p->flight_num,flight_num)==0)
		{
			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->ifull,p->left);
			return 1;
		}
	}
	printf("\t\t抱歉,没有航班号为%s的航班信息!\n",flight_num);
	return 0;
}
/*********************************************************
* 功能描述: 按照起飞抵达城市查询航班信息
* 输入参数: 无
* 输出参数: 对应航班信息
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/
int place_check(flightnode *h, char *start_place, char *end_place)
{
	flightnode *p=h;
	int mark=0;
    printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","是否满仓","空座数");
	for(;p!=NULL;p=p->next)
	{
		if(strcmp(p->start_place,start_place)==0 && strcmp(p->end_place,end_place)==0)
		{
			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->ifull,p->left);
			mark=1;
		}
	}
	if(mark==0)
	{
		printf("\t\t抱歉,没有从%s到%s的航班信息!\n",start_place,end_place);
	    return 0;
	}
	return 1;
}
/*********************************************************
* 功能描述: 浏览所有航班信息
* 输入参数: 无
* 输出参数: 对应航班信息
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/

void check_all_flight(flightnode *h)
{
	flightnode *p=h;
	int mark=0;
    printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","是否满仓","空座数");
	for(;p!=NULL;p=p->next)
	{
			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->ifull,p->left);
			mark=1;
	}
	if(mark==0)
		printf("\t\t航班信息为空!\n");
}
/*********************************************************
* 功能描述: 选择使用何种方式查询订单信息
* 输入参数: name,ID_num
* 输出参数: 无
* 返回值  : 无
* 其它说明: 无
*********************************************************/

void passenger_check(passengerList *PList)
{
	char name[20],ID_num[15];
	char a;
	printf("\t\t请选择订单查询方式:\n");
	printf("\t\t1、按客户姓名和证件号进行查询\n");
	printf("\t\t2、查看全部订单信息\n\t\t请选择输入:");
	a=getch();
	printf("%c\n",a);
	if(a=='1')
	{
        printf("\t\t请输入客户姓名:");
		scanf("%s",name);
		printf("\t\t请输入证件号:");
		scanf("%s",ID_num);
		ID_name_check(PList,name,ID_num);
	}
	else if(a=='2')
	{
		check_all_passenger(PList);
	}	
}
/*********************************************************
* 功能描述: 按客户姓名和证件号查询订单信息
* 输入参数: 无
* 输出参数: 对应订单信息
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/
int ID_name_check(passengerList *PList, char *name, char *ID_num)
{
	passengernode *p=PList->head->next;
	int mark=0;
	printf("%-8s%-20s%-20s%-10s%-8s%\n","订单号","姓名","证件号","航班号","订票数量");
	for(;p!=NULL;p=p->next)
	{
		if(strcmp(p->ID_num,ID_num)==0 && strcmp(p->name,name)==0)
		{
			printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num,p->flight_num,p->ticket_num);
			mark=1;
		}
	}
	if(mark==0)
	{
		printf("\t\t抱歉,没有%s,%s的订单信息!\n",name,ID_num);
		return 0;
	}
	return 1;
}
/*********************************************************
* 功能描述: 浏览所有订单信息
* 输入参数: 无
* 输出参数: 对应订单信息
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/
void check_all_passenger(passengerList *PList)
{
	passengernode *p=PList->head->next;
	int m=0;
    printf("%-8s%-20s%-20s%-10s%-8s%\n","订单号","姓名","证件号","航班号","订票数量");
	for(;p!=NULL;p=p->next)
	{
		printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num,p->flight_num,p->ticket_num);
		m=1;
	}
	if(m==0)
		printf("\t\t订单信息为空!\n");
}

/*********************************************************
* 功能描述: 浏览所有预约客户信息
* 输入参数: 无
* 输出参数: 对应预约订单信息
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/
void check_all_wait(waitList *WList)
{
	waitnode *a=WList->front->next;
	int m=0;
    printf("%-20s%-20s%-10s%-8s%\n","姓名","手机号","航班号","订票数量","预约排队号");
	for(;a!=NULL;a=a->next)
	{
		printf("%-20s%-20s%-10s%-8d%\n",a->name,a->phone,a->flight_num,a->ticket_num,a->order_num);
		m=1;
	}
	if(m==0)
		printf("\t\t预约客户信息为空!\n");
}

/*********************************************************
* 功能描述: 修改航班信息
* 输入参数: 无
* 输出参数: 无
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/
void modify_flight(flightnode *&h, passengerList *&PList)
{
	flightnode *p=h->next;
	char a;
	printf("\t\t****************************\n");
    printf("\t\t********航线信息修改********\n");
    printf("\t\t****************************\n");
	printf("\t\t*       增加航班——1      *\n");
	printf("\t\t*       删除航班——2      *\n");
	printf("\t\t*       修改航班时间——3  *\n");
	printf("\t\t****************************\n");
	printf("\t\t请选择:");
	a=getch();
	printf("%c\n",a);
	if(a=='1')
		add_flight(h);
    else if(a=='2')
		delete_flight(h,PList);
	else if(a=='3')
	{
		modify_flight_time(h,PList); 
	}
	else
		return;
}
/*********************************************************
* 功能描述: 按照某个航班号删除航班结点
* 输入参数: flight_num
* 输出参数: flight_num
* 返回值  : 1—成功  0—失败
* 其它说明: 无
*********************************************************/
void delete_flight(flightnode *&h, passengerList *&PList)
{
	flightnode *p,*pr;
	passengernode *q,*qr;
	char flight_num[10];
	int mark=1;
	qr=PList->head;//pr为客户链表的头结点
	q=qr->next;//用p作为中间指针对客户链表中要删除的客户节点进行查找
    pr=h;//pr为航线链表的头结点
	p=pr->next;//用p作为指针对航班链表中要删除的航班节点进行查找
	printf("\t\t请输入您要删除的航班号:");
    scanf("%s",flight_num);
	while(p!=NULL)//要删除的航班不存在,下面进行删除操作
	{
		if(strcmp(flight_num,p->flight_num)==0)
		{
			pr->next=p->next;//移动指针找要删除的航班节点
			free(p);
			printf("\t\t删除%s航班成功!\n",flight_num);
			mark=0;
			p=NULL;
		}
		if(pr->next!=NULL)
		{
			pr=pr->next;
			p=pr->next;
		}
	}
	if(mark==1)
		printf("\t\t无此航班,无法删除!\n");
	else
	{
		while(q!=NULL)//要删除的客户不存在,下面进行删除操作
		{
			if(strcmp(flight_num,q->flight_num)==0)
			{
			    qr->next=q->next;//移动指针找要删除的客户节点
		    	free(q);
			    q=NULL;
			}
		    if(qr->next!=NULL)
			{
			    qr=qr->next;
			    q=qr->next;
			}
		}
	}
}
/*********************************************************
* 功能描述: 修改航班时间
* 输入参数: flight_num,start_time,end_time
* 输出参数: flight_num
* 返回值  : 无
* 其它说明: 无
*********************************************************/
void modify_flight_time(flightnode *&h, passengerList *&PList)
{
	flightnode *p=h->next;
	char flight_num[10],start_time[10],end_time[10];
	printf("\t\t请输入要修改航班的航班号:");
	scanf("%s",flight_num);
	if(flight_num_check(p,flight_num)==1)
	{
        printf("\t\t请输入修改后的起飞时间:");
		scanf("%s",start_time);
	    printf("\t\t请输入修改后的抵达时间:");
		scanf("%s",end_time);
		for(;p!=NULL;p=p->next)
		{
			if(strcmp(flight_num,p->flight_num)==0)
			{
				strcpy(p->start_time,start_time);
				strcpy(p->end_time,end_time);
				printf("\t\t航班%s时间修改成功!\n",flight_num);
			}
		}
	}
}

3、main.cpp的代码


  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include "plane.h"  
  6.   
  7. int main()  
  8. {  
  9.     char choice;  
  10.     int t=1;  
  11.     flightnode *flight;  
  12.     passengerList *PList;  
  13.     waitList *WList;  
  14.     init_flight(flight);  
  15.     init_passengerList(PList);  
  16.     init_waitList(WList);  
  17.     load_flight(flight);  
  18.     load_passenger(PList);  
  19.     load_wait(WList);  
  20.     while(t==1)  
  21.     {  
  22.         printf("\t\t****************************\n");  
  23.         printf("\t\t******飞机订票系统菜单******\n");  
  24.         printf("\t\t****************************\n");  
  25.         printf("\t\t*       录入信息——1      *\n");  
  26.         printf("\t\t*       订    票——2      *\n");  
  27.         printf("\t\t*       退    票——3      *\n");  
  28.         printf("\t\t*       查询航班——4      *\n");  
  29.         printf("\t\t*       查询订单——5      *\n");  
  30.         printf("\t\t*       查看预约——6      *\n");  
  31.         printf("\t\t*       修改航线——7      *\n");  
  32.         printf("\t\t*       保存退出——0      *\n");  
  33.         printf("\t\t****************************\n");  
  34.         printf("\t\t请选择服务:");  
  35.         choice=getch();  
  36.         printf("%c\n",choice);  
  37.         system("cls");  
  38.         if(choice=='1')  
  39.         {  
  40.             add_flight(flight);  
  41.             getch();  
  42.             system("cls");  
  43.         }  
  44.         else if(choice=='2')  
  45.         {  
  46.             book(flight,PList,WList);  
  47.             getch();  
  48.             system("cls");  
  49.         }  
  50.         else if(choice=='3')  
  51.         {  
  52.             cancel(PList,flight);  
  53.             getch();  
  54.             system("cls");  
  55.         }  
  56.         else if(choice=='4')  
  57.         {  
  58.             flight_check(flight);  
  59.             getch();  
  60.             system("cls");  
  61.         }  
  62.         else if(choice=='5')  
  63.         {  
  64.             passenger_check(PList);  
  65.             getch();  
  66.             system("cls");  
  67.         }  
  68.         else if(choice=='6')  
  69.         {  
  70.             check_all_wait(WList);  
  71.             getch();  
  72.             system("cls");  
  73.         }  
  74.         else if(choice=='7')  
  75.         {  
  76.             modify_flight(flight,PList);  
  77.             getch();  
  78.             system("cls");  
  79.         }  
  80.         else if(choice=='0')  
  81.         {  
  82.             printf("\t\t再见!\n");  
  83.             t=0;  
  84.         }  
  85.     }  
  86.     save_flight(flight);  
  87.     save_passenger(PList);  
  88.     save_wait(WList);  
  89.     return 0;  
  90. }  

你可能感兴趣的:(飞机订票系统源代码)