问题描述与题目要求
问题描述: 假定某民航有M个航次的班机,每个航次都只到达一个地方。试为该机场售票处设计一个自动订票和退票系统,要求系统具有以下功能:
(1) 订票:若该航次余票大于等于乘客订票数,则在该航次的乘客表中,插入订票乘客的信息项,并修改该航次有关数据,否则给出相应信息。
(2) 退票:若该航次当前退票数小于等于乘客原订票数,则在相应的乘客表中找到该乘客项,修改该航次及乘客表中有关数据;当某乘客由于退票使订票数为零时,则从乘客表中撤消该数据项。
要求:
(1)描述对航次表和乘客表选用的数据结构。
(2)编程实现飞机票订票和退票系统。
模型假设
1.假设所有输入均为整数且在int类型的表示范围内
2.假设航次是从1到n的连续整数
3.假设每个乘客 ID 均唯一
数据结构的选用
联想到图中的邻接链表,采用相似的数据结构描述该问题
航次表: 用一个数组flight_info_list存储每个航次的乘客表,该数组下标即为航班航次,对应元素即为该航次相关信息(乘客表,航班编号及航班余票数)
乘客表: 用双向链表存储每个航次的乘客表passenger_info_list,每个结点存储乘客的 ID,订票数以及指向前、后结点的指针
编程实现(C语言实现)
/*
* @Description: 模拟航班的订票系统
* 模型假设:
* 1. 飞机最大载客量为300人
* 2. 共10个航次
* 用双向链表存储乘客信息
* 用array存储航班信息
* @Author: Fishermanykx
* @Date: 2019-09-29 10:32:56
* @LastEditors: Fishermanykx
* @LastEditTime: 2019-09-30 12:29:16
*/
#include
#include
#include
#define MAX_CAPACITY 300 // 假定飞机最大载客量为300
#define TOTAL_AIRLINE 10 // 假定不同航线最大数目为10
#define BOOK_TICKET 1
#define REFUND -1
#define EXIT_SYSTEM 0
#define PRINT_INFO 11
#define ROOT 123456
// 某航次航班
struct SingleFlight {
int flight_id; // 航班编号,从1开始,到TOTAL_AIRLINE为止
int remain_tickets; // 该航班余票数
struct SinglePassenger* passenger_info_list; // 该航班乘客表
};
// 某航次航班的某个乘客的信息
struct PassengerInfo {
int passenger_id; // 乘客id
int ticket_number; // 该乘客购买票数
};
// 乘客表中的一个结点
struct SinglePassenger {
struct PassengerInfo passenger_info; // 乘客信息
struct SinglePassenger* prev_passenger; // 指向前一个乘客的指针
struct SinglePassenger* next_passenger; // 指向后一个乘客的指针
};
typedef struct SingleFlight SingleFlight;
typedef struct SinglePassenger SinglePassenger;
// 订票操作
SingleFlight* BookTicket(SingleFlight flight_info_list[]);
SinglePassenger* GetNewPassenger(const int new_passenger_id,
const int book_ticket_number);
SinglePassenger* AddNewPassenger(SinglePassenger* head,
const int new_passenger_id,
const int book_ticket_number);
// 退票操作
SingleFlight* Refund(SingleFlight flight_info_list[]);
SinglePassenger* RemovePassenger(SinglePassenger* head, const int passenger_id);
// 判断操作
bool IsPassengerExist(SinglePassenger* head, const int passenger_id);
// 打印操作
void PrintCurrentAirlineInfo(SingleFlight flight_info_list[]);
void PrintPassengerList(SinglePassenger* head, SingleFlight* flight_info_list,
int airline_id);
int main(void) {
int order, exit_loop = 1;
// 初始化航班信息
SingleFlight* flight_info_list;
flight_info_list =
(SingleFlight*)malloc(TOTAL_AIRLINE * sizeof(SingleFlight));
for (int i = 0; i < TOTAL_AIRLINE; ++i) {
flight_info_list[i].flight_id = i + 1;
flight_info_list[i].remain_tickets = MAX_CAPACITY;
flight_info_list[i].passenger_info_list = NULL;
}
/* 登录界面 */
printf("您好,欢迎使用此系统!\n\n");
printf("使用说明:\n");
printf("1. 本程序所有输入均为整数\n");
printf("2. 可供选择的航次编号为1-%d, 每架次最大载客量为%d\n", TOTAL_AIRLINE,
MAX_CAPACITY);
printf(
"3. 若订票,请输入1;若退票,请输入-1;若退出系统,请输入0; "
"若要以root用户登录,请输入root密码\n");
printf("使用说明到此结束,祝您使用愉快!\n");
// 判断是否以root登录
int log_in_as_root, root_key;
bool is_root = false;
printf("-------------------------------------------------------------\n\n");
printf("是否以root用户登录?若是,请输入1,否则请输入0:");
scanf("%d", &log_in_as_root);
if (log_in_as_root) printf("请输入root密码(按0退出root登录程序):");
while (log_in_as_root) {
scanf("%d", &root_key);
if (!root_key) {
break;
} else if (root_key != ROOT) {
printf("输入密码错误!请重新输入或按0退出root登录程序:");
} else {
is_root = true;
break;
}
}
// 欢迎界面
if (is_root)
printf("