数据结构:双向链表进行存储,便于增删
若用户文件为空,则初始化用户 账号:admin 密码:123
用户手册
运行环境 LinuxC
项目概述
本项目是一个航班管理系统,使用C语言编写,支持添加、显示、修改、删除航班信息,用户身份验证,航班排序,以及从文件中保存和加载数据。
目录结构
hb/
├── doc/
├── inc/
│ ├── flight.h
│ └── ...
├── obj/
├── src/
│ ├── flight.c
│ ├── main.c
│ ├── menu.c
│ ├── pwdMatch.c
│ ├── sortFly.c
│ ├── users.c
│ └── ...
├── Makefile
文件说明
-
doc/: 存放项目的文档资料。
-
-
inc/
- 存放头文件。
flight.h
: 包含航班相关的函数声明和结构体定义。
-
obj/: 存放编译生成的对象文件。
-
-
src/
- 存放源代码文件。
flight.c
: 实现航班相关的函数。main.c
: 主函数,程序入口。menu.c
: 实现菜单显示和处理。pwdMatch.c
: 实现用户身份验证。sortFly.c
: 实现航班排序功能。users.c
: 实现用户管理功能。
-
Makefile: 编译脚本,定义了编译和链接规则。
编译和运行
-
安装编译器: 确保已安装
gcc
编译器。可以通过以下命令安装(适用于Ubuntu):sh复制代码sudo apt-get update sudo apt-get install gcc
-
编译项目: 在项目根目录(即包含
Makefile
的目录)下运行以下命令:sh 复制代码 make
该命令会编译所有源文件,并将生成的对象文件放在
obj
目录中,最终生成可执行文件main
。 -
运行程序: 编译成功后,在项目根目录下运行:
sh 复制代码 ./main
功能说明
- 用户身份验证: 启动程序后,系统会提示用户输入用户名和密码进行身份验证。
- 菜单选项: 成功登录后,系统会显示主菜单,用户可以选择不同的功能:
- 添加航班
- 显示航班
- 修改航班
- 删除航班
- 排序航班
- 保存数据
- 加载数据
- 退出系统
- 添加航班: 用户可以输入航班号、起始地、目的地、起飞时间、降落时间等信息添加新的航班。
- 显示航班: 系统会列出所有已添加的航班信息。
- 修改航班: 用户可以根据航班号查找并修改特定航班的信息。
- 删除航班: 用户可以根据航班号查找并删除特定航班。
- 排序航班: 系统提供不同的排序方式,如按起飞时间、按降落时间等,对航班信息进行排序。
- 保存数据: 用户可以将当前的航班信息保存到文件中。
- 加载数据: 用户可以从文件中加载之前保存的航班信息。
注意事项
- 数据保存: 每次修改航班信息后,请记得保存数据,以免丢失。
- 用户管理: 默认情况下,系统会包含一个管理员账户,用户可以根据需要添加更多用户。
未来功能
- 图形用户界面: 未来版本可能会引入图形用户界面,使操作更加直观。
- 多用户支持: 未来版本可能会增加多用户同时操作的支持。
希望本用户手册能帮助您顺利使用该航班管理系统。如有任何问题,请参阅项目的文档资料或联系项目维护人员。
flight.h
/**
* @brief 初始化链表头节点
*
* @return HeadNode* 返回初始化后的头节点指针
*/
#ifndef FLIGHT_H
#define FLIGHT_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <termios.h>
#include <unistd.h>
#define MAX_USERS 10 // 定义最大用户数量
// 航班信息结构体
typedef struct Flight
{
char number[10]; // 航班号
char staddress[20]; // 出发地点
char arraddress[20]; // 到达地点
char date[20]; // 日期
char stime[10]; // 出发时间
char atime[10]; // 到达时间
float price; // 票价
char type[10]; // 类型
} Flight;
// 航班管理双向链表节点信息
typedef struct FlightNode
{
Flight fly; // 航班的信息数据
struct FlightNode *prev; // 前一个节点
struct FlightNode *next; // 后一个节点
} FlightNode;
// 头节点信息
typedef struct HeadNode
{
FlightNode *head; // 指向双向链表的头节点
FlightNode *tail; // 指向双向链表的尾节点
int numbers; // 链表中的节点数量
} HeadNode;
// 用户信息结构体
typedef struct User
{
char username[20]; // 用户名
char password[20]; // 密码
int isVip; // 是否为管理员,1表示管理员,0表示普通用户
} User;
int num_users; // 用户数量
User users[MAX_USERS];
// 航班系统函数声明
/**
* @brief 初始化链表头节点
*
* @return HeadNode* 返回初始化后的头节点指针
*/
HeadNode *headnode_init();
/**
* @brief 创建航班节点
*
* @param fly 指向航班信息的指针
* @return FlightNode* 返回创建的航班节点指针
*/
FlightNode *flight_create(Flight *fly);
/**
* @brief 添加航班信息到链表尾部
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool addTail_flight(HeadNode *headnode);
/**
* @brief 删除航班信息
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool delete_flight(HeadNode *headnode);
/**
* @brief 修改航班信息
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool modify_flight(HeadNode *headnode);
/**
* @brief 查询航班信息
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool find_flight(HeadNode *headnode);
/**
* @brief 显示所有航班信息
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool show_flights(HeadNode *headnode);
/**
* @brief 按航班号升序排序
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool sort_flight_number(HeadNode *headnode);
/**
* @brief 按出发时间升序排序
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool sort_flight_stime(HeadNode *headnode);
/**
* @brief 按票价升序排序
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool sort_flight_price(HeadNode *headnode);
/**
* @brief 显示排序菜单,并执行排序
*
* @param headnode 链表头节点指针
*/
extern void sort_flight(HeadNode *headnode);
/**
* @brief 保存航班信息到文件
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool save_file(HeadNode *headnode);
/**
* @brief 清空航班链表
*
* @param headnode 链表头节点指针
*/
extern void clear_flight_list(HeadNode *headnode);
/**
* @brief 从文件加载航班信息
*
* @param headnode 链表头节点指针
* @return bool 成功返回true,失败返回false
*/
extern bool load_file(HeadNode *headnode);
/**
* @brief 显示排序菜单
*/
extern void sort_flight_menu();
/**
* @brief 显示登录界面
*/
extern void login();
/**
* @brief 显示管理员登录菜单
*/
extern void admin_login_menu();
/**
* @brief 管理员操作航班信息
*
* @param head 链表头节点指针
*/
extern void flight_admin(HeadNode *head);
/**
* @brief 用户操作航班信息
*
* @param head 链表头节点指针
*/
extern void flight_user(HeadNode *head);
/**
* @brief 模拟获取用户数据而不显示内容
*/
extern int getch();
/**
* @brief 保存用户数据到文件
*/
bool save_users();
/**
* @brief 从文件加载用户数据
*/
bool load_users();
/**
* @brief 添加初始用户数据
*/
void add_initial_users();
/**
* @brief 添加用户
*/
bool add_user();
/**
* @brief 删除用户
*/
bool delete_user();
/**
* @brief 修改用户
*/
bool modify_user();
/**
* @brief 显示所有用户
*/
void show_users();
/**
* @brief 用户注册功能
*/
void register_user();
/**
* @brief 用户管理
*/
void users_manger();
/**
* @brief 用户管理界面
*/
void users_manger_menu();
/**
* @brief 主界面
*/
void main_menu();
/**
* @brief (管理员)功能界面
*/
void admin_user_menu();
/**
* @brief 检查用户数据文件是否存在
*/
bool file_exists();
/**
* @brief 用户登录
*
* @param head 链表头节点指针
* @param users 用户信息数组
* @return bool 成功返回true,失败返回false
*/
extern bool login_user(HeadNode *head, User users[]);
#endif // FLIGHT_H
flight.c
#include"flight.h"
struct HeadNode *headnode_init()
{
// 为头节点申请空间
HeadNode *headnode = malloc(sizeof(HeadNode));
if (headnode == NULL)
return NULL;
// 初始化头节点
headnode->head = NULL;
headnode->tail = NULL;
headnode->numbers = 0;
return headnode;
}
// 初始化双链表节点信息(新节点)
struct FlightNode *flight_create(Flight *fly)
{
FlightNode *pnew = malloc(sizeof(FlightNode));
if (pnew == NULL)
return NULL;
// 初始化航班信息
strcpy(pnew->fly.number, fly->number);
strcpy(pnew->fly.staddress, fly->staddress);
strcpy(pnew->fly.arraddress, fly->arraddress);
strcpy(pnew->fly.date, fly->date);
strcpy(pnew->fly.stime, fly->stime);
strcpy(pnew->fly.atime, fly->atime);
pnew->fly.price = fly->price;
strcpy(pnew->fly.type, fly->type);
pnew->next = NULL;
pnew->prev = NULL;
return pnew;
}
// 1、添加航班信息 (创建链表)
bool addTail_flight(HeadNode *headnode)
{
Flight pnew;
printf("请输入航班号:");
scanf("%s", pnew.number);
FlightNode *p = headnode->head;
// 遍历查找航班号是否重复添加
while (p)
{
if (strcmp(p->fly.number, pnew.number) == 0)
{
printf("航班号重复!无法添加!\n");
return false;
}
else
p = p->next;
}
printf("请输入起点站: ");
scanf("%s", pnew.staddress);
while(getchar()!='\n');
printf("请输入终点站: ");
scanf("%s", pnew.arraddress);
while(getchar()!='\n');
printf("请输入班期 (格式 2024.12.12 ): ");
scanf("%s", pnew.date);
while(getchar()!='\n');
printf("请输入起飞时间: ");
scanf("%s", pnew.stime);
while(getchar()!='\n');
printf("请输入到达时间: ");
scanf("%s", pnew.atime);
while(getchar()!='\n');
printf("请输入票价: ");
scanf("%f", &pnew.price)