最详细 <双向链表> 航班管理系统 + Makefile项目管理

在这里插入图片描述

数据结构:双向链表进行存储,便于增删
若用户文件为空,则初始化用户 账号: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: 编译脚本,定义了编译和链接规则。

编译和运行
  1. 安装编译器: 确保已安装 gcc 编译器。可以通过以下命令安装(适用于Ubuntu):

    sh复制代码sudo apt-get update
    sudo apt-get install gcc
    
  2. 编译项目: 在项目根目录(即包含 Makefile 的目录)下运行以下命令:

    sh
    复制代码
    make
    

    该命令会编译所有源文件,并将生成的对象文件放在 obj 目录中,最终生成可执行文件 main

  3. 运行程序: 编译成功后,在项目根目录下运行:

    sh
    复制代码
    ./main
    
功能说明
  1. 用户身份验证: 启动程序后,系统会提示用户输入用户名和密码进行身份验证。
  2. 菜单选项: 成功登录后,系统会显示主菜单,用户可以选择不同的功能:
    • 添加航班
    • 显示航班
    • 修改航班
    • 删除航班
    • 排序航班
    • 保存数据
    • 加载数据
    • 退出系统
  3. 添加航班: 用户可以输入航班号、起始地、目的地、起飞时间、降落时间等信息添加新的航班。
  4. 显示航班: 系统会列出所有已添加的航班信息。
  5. 修改航班: 用户可以根据航班号查找并修改特定航班的信息。
  6. 删除航班: 用户可以根据航班号查找并删除特定航班。
  7. 排序航班: 系统提供不同的排序方式,如按起飞时间、按降落时间等,对航班信息进行排序。
  8. 保存数据: 用户可以将当前的航班信息保存到文件中。
  9. 加载数据: 用户可以从文件中加载之前保存的航班信息。
注意事项
  1. 数据保存: 每次修改航班信息后,请记得保存数据,以免丢失。
  2. 用户管理: 默认情况下,系统会包含一个管理员账户,用户可以根据需要添加更多用户。
未来功能
  1. 图形用户界面: 未来版本可能会引入图形用户界面,使操作更加直观。
  2. 多用户支持: 未来版本可能会增加多用户同时操作的支持。

希望本用户手册能帮助您顺利使用该航班管理系统。如有任何问题,请参阅项目的文档资料或联系项目维护人员。

在这里插入图片描述

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值