c语言机票座位预定系统_C语言实现飞机订票系统

本文介绍了一个使用C语言编写的飞机订票和退票系统,系统包括订票和退票功能,采用双向链表存储乘客信息,数组存储航班信息。用户可以输入航次、乘客ID和订票数进行操作,系统会根据输入更新航班余票和乘客表。此外,还实现了非法输入处理和root用户查看所有航班信息的功能。
摘要由CSDN通过智能技术生成

问题描述与题目要求

问题描述: 假定某民航有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("

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值