前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >飞机订票系统源代码

飞机订票系统源代码

作者头像
全栈程序员站长
发布2022-07-04 13:38:03
1.4K0
发布2022-07-04 13:38:03
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

问题及代码:

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

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149424.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档