航班管理系统(C语言)

航班管理系统需求

功能概述

本系统是一个航班管理系统,包含普通用户和管理员两种角色。普通用户可以查看航班信息、查看已购买的航班信息以及退票;管理员可以进行航班信息的增、删、改、查操作。

用户角色及功能

1.账号注册与登录

  • 注册新用户:用户可以通过输入用户名和密码进行注册。
  • 用户登录:用户通过输入注册的用户名和密码进行登录。

2.普通用户功能

  • 查看航班信息:用户可以查看航班的起始点、目的地、航班时间、剩余票数、价格等信息。
  • 查看已购买的航班信息:用户可以查看自己已购买的航班信息。
  • 退票:用户可以退还已购买的机票。

3.管理员功能

  • 增加航班信息:管理员可以增加新的航班信息。
  • 删除航班信息:管理员可以删除已存在的航班信息。
  • 修改航班信息:管理员可以修改已存在的航班信息。
  • 查看航班信息:管理员可以查看所有航班信息。

航班信息结构

  • 起始点(字符串)
  • 目的地(字符串)
  • 航班时间(字符串,建议格式为 "YYYY-MM-DD HH
    ")
  • 剩余票数(正整数)
  • 价格(正整数)

数据结构

  • 使用单链表存储用户信息和航班信息。
  • 用户和航班信息使用结构体定义。
  • 使用指针操作链表进行增删改查操作。

已完成部分

  • 只能注册一个账号(需修改为多用户注册)
  • 普通用户查看航班信息
  • 普通用户查看已购买的航班信息
  • 普通用户退票
  • 管理员增、删、改、查航班信息

待完成部分

  • 实现多用户注册功能
  • 管理员增加、修改航班信息时进行合法性验证

首次完成日期:

2021/09/12 18:00

修改日期

2024/07/14 20:25

历时10h
参考资料:
一、数据结构—单链表的基本操作(源代码)
二、C语言实现学生信息管理系统(单链表有错误,仅供参考!)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define ID 30
#define PW 30

typedef struct User {
    char id[ID];
    char pw[PW];
    struct User* next;
} User;

typedef struct Flight {
    char name[10];
    char start[10];
    char bourn[10];
    char f_schedule[16]; // 航班时间的格式 "YYYY-MM-DD HH:MM"
    int spare_votes;
    int price;
} flight;

typedef struct LNode {
    flight data;
    struct LNode* next;
} Node, *LinkList;

User* userList = NULL;

void InitList(LinkList* pHead);
LinkList get_newNode(LinkList* L);
void print_List(LinkList* L);
void addflight(LinkList* L);
void deleteflight(LinkList* L);
void findflight(LinkList* L);
void changeflight(LinkList* L);
void admin(LinkList* L);
void findownerflight(LinkList* z);
LinkList buy(LinkList* L);
void buyticket(LinkList* L, LinkList* z);
void Refund(LinkList* L);
void common_user(LinkList* L, LinkList* z);
void login();
void sign(LinkList* L, LinkList* z);

int main() {
    LinkList L, USER;
    InitList(&L);
    InitList(&USER);
    printf("\n");

    int flag = 1;
    while (flag) {
        printf("\n");
        printf("\t***********************\t\n");
        printf("\t******航班购票系统******\t\n");
        printf("\t****1.注册    2.登录****\t\n");
        printf("\t*********0.退出*********\t\n");
        printf("\t***********************\t\n");
        char num[10];
        scanf("%s", num);
        if (strspn(num, "0123456789") == strlen(num)) {
            int nu = atoi(num);
            switch (nu) {
                case 0:
                    printf("已退出系统!\n");
                    flag = 0;
                    break;
                case 1:
                    login();
                    break;
                case 2:
                    sign(&L, &USER);
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
}

void InitList(LinkList* pHead) {
    *pHead = (LinkList)malloc(sizeof(Node));
    if (*pHead) {
        (*pHead)->next = NULL;
    } else {
        printf("\n开辟内存失败\n");
    }
}

LinkList get_newNode(LinkList* L) {
    LinkList newNode = (LinkList)malloc(sizeof(Node));
    if (newNode) {
        printf("请输入要增加的航班名称: \t");
        scanf("%s", newNode->data.name);
        printf("请输入该航班的起始点: \t");
        scanf("%s", newNode->data.start);
        printf("请输入该航班的目的地: \t");
        scanf("%s", newNode->data.bourn);
        printf("请输入该航班的航班时间 (格式 YYYY-MM-DD HH:MM):\t");
        scanf("%s", newNode->data.f_schedule);

        // 添加输入校验
        int valid_input = 0;
        while (!valid_input) {
            printf("请输入该航班的价格: \t");
            if (scanf("%d", &newNode->data.price) == 1 && newNode->data.price > 0) {
                valid_input = 1;
            } else {
                printf("输入无效,请输入正整数。\n");
                while (getchar() != '\n'); // 清除输入缓冲区
            }
        }

        valid_input = 0;
        while (!valid_input) {
            printf("请输入该航班的剩余票数:\t");
            if (scanf("%d", &newNode->data.spare_votes) == 1 && newNode->data.spare_votes > 0) {
                valid_input = 1;
            } else {
                printf("输入无效,请输入正整数。\n");
                while (getchar() != '\n'); // 清除输入缓冲区
            }
        }

        LinkList temp = (*L)->next;
        while (temp) {
            if (strcmp(temp->data.name, newNode->data.name) == 0 &&
                strcmp(temp->data.start, newNode->data.start) == 0 &&
                strcmp(temp->data.bourn, newNode->data.bourn) == 0 &&
                strcmp(temp->data.f_schedule, newNode->data.f_schedule) == 0) {
                printf("\n此航班已存在!请再次确认!\n");
                free(newNode);
                return NULL;
            }
            temp = temp->next;
        }
        newNode->next = NULL;
        return newNode;
    } else {
        printf("\n开辟内存失败\n");
        return NULL;
    }
}

void print_List(LinkList* L) {
    LinkList p = (*L)->next;
    if (!p) {
        printf("暂无航班!\n");
    } else {
        int i = 0;
        while (p) {
            printf("\n航班的名称:%s\n", p->data.name);
            printf("航班的起始点:%s\n", p->data.start);
            printf("航班的目的地:%s\n", p->data.bourn);
            printf("航班的航班时间:%s\n", p->data.f_schedule);
            printf("航班的剩余票数:%d\n", p->data.spare_votes);
            printf("航班的价格:%d\n", p->data.price);
            printf("\n");
            i++;
            p = p->next;
        }
        printf("共有%d个航班!\n", i);
    }
}

void addflight(LinkList* L) {
    int flag = 1;
    while (flag) {
        char s[2];
        LinkList tail = *L;
        while (tail->next) {
            tail = tail->next;
        }
        LinkList newNode = get_newNode(L);
        if (newNode) {
            tail->next = newNode;
        }
        while (flag) {
            printf("是否继续增加航班信息?是:1 否:0\n");
            scanf("%s", s);
            if (strspn(s, "01") == strlen(s)) {
                int ch = atoi(s);
                if (ch == 0) {
                    printf("已退出增加航班!\n");
                    flag = 0;
                } else {
                    break;
                }
            } else {
                printf("请输入正确的序号!\n");
            }
        }
    }
}

void deleteflight(LinkList* L) {
    printf("请输入要删除的航班信息:\t\n");
    flight temp;
    printf("航班名称:\t");
    scanf("%s", temp.name);
    printf("航班起始点:\t");
    scanf("%s", temp.start);
    printf("航班目的地:\t");
    scanf("%s", temp.bourn);
    printf("航班时间:\t");
    scanf("%s", temp.f_schedule);

    LinkList p = *L, q;
    while (p->next) {
        if (strcmp(p->next->data.name, temp.name) == 0 &&
            strcmp(p->next->data.start, temp.start) == 0 &&
            strcmp(p->next->data.bourn, temp.bourn) == 0 &&
            strcmp(p->next->data.f_schedule, temp.f_schedule) == 0) {
            q = p->next;
            p->next = q->next;
            free(q);
            printf("删除成功\n");
            return;
        }
        p = p->next;
    }
    printf("删除失败! 请检查此航班是否存在!\n");
}

void findflight(LinkList* L) {
    int flag = 1;
    while (flag) {
        printf("\n\t** 请输入要查询的方式 **:\n");
        printf("\t**1.按航班的名称查询  **\n");
        printf("\t**2.按航班的起始点    **\n");
        printf("\t**3.按航班的目的地  **\n");
        printf("\t**4.按航班的航班时间  **\n");
        printf("\t**5.查询所有航班  **\n");
        printf("\t**6.退出查询  **\n");
        char choose[5];
        scanf("%s", choose);
        if (strspn(choose, "0123456789") == strlen(choose)) {
            int ch = atoi(choose);
            LinkList q = (*L)->next;
            int count = 0;
            switch (ch) {
                case 1: {
                    char flight_name[10];
                    printf("请输入要查询的航班名称:\t");
                    scanf("%s", flight_name);
                    while (q) {
                        if (strcmp(q->data.name, flight_name) == 0) {
                            printf("\n该航班的名称:%s\n", q->data.name);
                            printf("该航班的起始点:%s\n", q->data.start);
                            printf("该航班的目的地:%s\n", q->data.bourn);
                            printf("该航班的航班时间:%s\n", q->data.f_schedule);
                            printf("该航班的剩余票数:%d\n", q->data.spare_votes);
                            printf("该航班的价格:%d\n", q->data.price);
                            count++;
                        }
                        q = q->next;
                    }
                    if (count == 0) {
                        printf("该航班不存在!\n");
                    } else {
                        printf("要查询的航班共有%d个\n", count);
                    }
                    break;
                }
                case 2: {
                    char flight_start[10];
                    printf("请输入要查询的航班起始点:\t");
                    scanf("%s", flight_start);
                    while (q) {
                        if (strcmp(q->data.start, flight_start) == 0) {
                            printf("\n该航班的名称:%s\n", q->data.name);
                            printf("该航班的起始点:%s\n", q->data.start);
                            printf("该航班的目的地:%s\n", q->data.bourn);
                            printf("该航班的航班时间:%s\n", q->data.f_schedule);
                            printf("该航班的剩余票数:%d\n", q->data.spare_votes);
                            printf("该航班的价格:%d\n", q->data.price);
                            count++;
                        }
                        q = q->next;
                    }
                    if (count == 0) {
                        printf("该航班不存在!\n");
                    } else {
                        printf("要查询的航班共有%d个\n", count);
                    }
                    break;
                }
                case 3: {
                    char flight_bourn[10];
                    printf("请输入要查询的航班目的地:\t");
                    scanf("%s", flight_bourn);
                    while (q) {
                        if (strcmp(q->data.bourn, flight_bourn) == 0) {
                            printf("\n该航班的名称:%s\n", q->data.name);
                            printf("该航班的起始点:%s\n", q->data.start);
                            printf("该航班的目的地:%s\n", q->data.bourn);
                            printf("该航班的航班时间:%s\n", q->data.f_schedule);
                            printf("该航班的剩余票数:%d\n", q->data.spare_votes);
                            printf("该航班的价格:%d\n", q->data.price);
                            count++;
                        }
                        q = q->next;
                    }
                    if (count == 0) {
                        printf("该航班不存在!\n");
                    } else {
                        printf("要查询的航班共有%d个\n", count);
                    }
                    break;
                }
                case 4: {
                    char flight_schedule[16];
                    printf("请输入要查询的航班时间:\t");
                    scanf("%s", flight_schedule);
                    while (q) {
                        if (strcmp(q->data.f_schedule, flight_schedule) == 0) {
                            printf("\n该航班的名称:%s\n", q->data.name);
                            printf("该航班的起始点:%s\n", q->data.start);
                            printf("该航班的目的地:%s\n", q->data.bourn);
                            printf("该航班的航班时间:%s\n", q->data.f_schedule);
                            printf("该航班的剩余票数:%d\n", q->data.spare_votes);
                            printf("该航班的价格:%d\n", q->data.price);
                            count++;
                        }
                        q = q->next;
                    }
                    if (count == 0) {
                        printf("该航班不存在!\n");
                    } else {
                        printf("要查询的航班共有%d个\n", count);
                    }
                    break;
                }
                case 5:
                    print_List(L);
                    break;
                case 6:
                    flag = 0;
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
    printf("已退出查询!\n");
}

void changeflight(LinkList* L) {
    int flag = 1;
    while (flag) {
        flight temp;
        printf("请输入要修改的航班信息:\t\n");
        printf("航班名称:\t");
        scanf("%s", temp.name);
        printf("航班起始点:\t");
        scanf("%s", temp.start);
        printf("航班目的地:\t");
        scanf("%s", temp.bourn);
        printf("航班时间:\t");
        scanf("%s", temp.f_schedule);

        LinkList w = (*L)->next;
        int found = 0;
        while (w) {
            if (strcmp(w->data.name, temp.name) == 0 &&
                strcmp(w->data.start, temp.start) == 0 &&
                strcmp(w->data.bourn, temp.bourn) == 0 &&
                strcmp(w->data.f_schedule, temp.f_schedule) == 0) {
                printf("\n修改后的航班名称:\n");
                scanf("%s", w->data.name);
                printf("修改后的起始点:\n");
                scanf("%s", w->data.start);
                printf("修改后的目的地:\n");
                scanf("%s", w->data.bourn);
                printf("修改后的航班时间:\n");
                scanf("%s", w->data.f_schedule);
                printf("修改后的剩余票数:\n");
                scanf("%d", &w->data.spare_votes);
                printf("修改后的价格:\n");
                scanf("%d", &w->data.price);
                found = 1;
                break;
            }
            w = w->next;
        }
        if (!found) {
            printf("修改失败!无此航班!\n");
        } else {
            printf("修改成功!\n");
        }
        while (flag) {
            char n[5];
            printf("是否需要继续修改其他航班信息?继续:1 退出 :0\n");
            scanf("%s", n);
            if (strspn(n, "01") == strlen(n)) {
                int nn = atoi(n);
                if (nn == 0) {
                    flag = 0;
                } else {
                    break;
                }
            } else {
                printf("请正确输入!\n");
            }
        }
    }
}

void admin(LinkList* L) {
    char choose[10];
    int flag = 1;
    while (flag) {
        printf("\n");
        printf("请输入你要进行的操作:\t\n\n");
        printf("\t***1.增加航班信息  ***\t\n");
        printf("\t***2.删除航班信息  ***\t\n");
        printf("\t***3.查找航班信息  ***\t\n");
        printf("\t***4.修改航班信息  ***\t\n");
        printf("\t***5.退出管理员操作***\t\n");
        scanf("%s", choose);
        if (strspn(choose, "0123456789") == strlen(choose)) {
            int ch = atoi(choose);
            switch (ch) {
                case 1:
                    addflight(L);
                    break;
                case 2:
                    deleteflight(L);
                    break;
                case 3:
                    findflight(L);
                    break;
                case 4:
                    changeflight(L);
                    break;
                case 5:
                    flag = 0;
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
    printf("已退出管理员操作!\n");
}

void findownerflight(LinkList* z) {
    int flag = 1;
    while (flag) {
        LinkList q = (*z)->next;
        int i = 1, found = 0;
        while (q) {
            printf("\n购买的第%d个航班信息:\n", i);
            printf("已购买航班的名称:%s\n", q->data.name);
            printf("已购买航班的起始点:%s\n", q->data.start);
            printf("已购买航班的目的地:%s\n", q->data.bourn);
            printf("已购买航班的航班时间:%s\n", q->data.f_schedule);
            printf("已购买航班的剩余票数:%d\n", q->data.spare_votes);
            printf("已购买航班的价格:%d\n", q->data.price);
            i++;
            found = 1;
            q = q->next;
        }
        if (!found) {
            printf("你未购买任何航班\n");
        }
        while (flag) {
            char n[5];
            printf("是否退出?继续查看:1 退出 :0\n");
            scanf("%s", n);
            if (strspn(n, "01") == strlen(n)) {
                int nn = atoi(n);
                if (nn == 0) {
                    printf("退出成功!\n");
                    flag = 0;
                } else {
                    break;
                }
            } else {
                printf("请正确输入!\n");
            }
        }
    }
}

LinkList buy(LinkList* L) {
    printf("\n请输入要购买的航班信息:\t\n");
    flight temp;
    printf("航班名称:\t");
    scanf("%s", temp.name);
    printf("航班起始点:\t");
    scanf("%s", temp.start);
    printf("航班目的地:\t");
    scanf("%s", temp.bourn);
    printf("航班时间:\t");
    scanf("%s", temp.f_schedule);

    LinkList w = (*L)->next;
    while (w) {
        if (strcmp(w->data.name, temp.name) == 0 &&
            strcmp(w->data.start, temp.start) == 0 &&
            strcmp(w->data.bourn, temp.bourn) == 0 &&
            strcmp(w->data.f_schedule, temp.f_schedule) == 0) {
            if (w->data.spare_votes > 0) {
                LinkList u = (LinkList)malloc(sizeof(Node));
                strcpy(u->data.name, w->data.name);
                strcpy(u->data.start, w->data.start);
                strcpy(u->data.bourn, w->data.bourn);
                strcpy(u->data.f_schedule, w->data.f_schedule);
                u->data.spare_votes = w->data.spare_votes;
                u->data.price = w->data.price;
                u->next = NULL;
                printf("购买成功!\n");
                w->data.spare_votes--;
                return u;
            } else {
                printf("该航班已无剩余票数!\n");
                return NULL;
            }
        }
        w = w->next;
    }
    printf("购买失败!无此航班!\n");
    return NULL;
}

void buyticket(LinkList* L, LinkList* z) {
    int flag = 1;
    while (flag) {
        printf("\t**1.搜索航班信息 **\n");
        printf("\t**2.购买机票     **\n");
        printf("\t**3.退出购票     **\n");
        char n[5];
        scanf("%s", n);
        if (strspn(n, "123") == strlen(n)) {
            int nn = atoi(n);
            LinkList tail;
            switch (nn) {
                case 1:
                    findflight(L);
                    break;
                case 2:
                    tail = *z;
                    while (tail->next) {
                        tail = tail->next;
                    }
                    LinkList newNode = buy(L);
                    if (newNode) {
                        tail->next = newNode;
                    }
                    break;
                case 3:
                    printf("退出成功!\n");
                    flag = 0;
                    break;
            }
        } else {
            printf("请正确输入!\n");
        }
    }
}

void Refund(LinkList* L) {
    printf("请输入要退票的航班信息:\t\n");
    flight temp;
    printf("航班名称:\t");
    scanf("%s", temp.name);
    printf("航班起始点:\t");
    scanf("%s", temp.start);
    printf("航班目的地:\t");
    scanf("%s", temp.bourn);
    printf("航班时间:\t");
    scanf("%s", temp.f_schedule);

    LinkList p = *L, q;
    while (p->next) {
        if (strcmp(p->next->data.name, temp.name) == 0 &&
            strcmp(p->next->data.start, temp.start) == 0 &&
            strcmp(p->next->data.bourn, temp.bourn) == 0 &&
            strcmp(p->next->data.f_schedule, temp.f_schedule) == 0) {
            q = p->next;
            p->next = q->next;
            free(q);
            printf("退票成功\n");
            return;
        }
        p = p->next;
    }
    printf("退票失败! 请检查是否已购买此机票!\n");
}

void common_user(LinkList* L, LinkList* z) {
    int flag = 1;
    while (flag) {
        printf("\n\t***1.查找航班信息      ***\t\n");
        printf("\t***2.查看已购买航班    ***\t\n");
        printf("\t***3.购买航班    ***\t\n");
        printf("\t***4.退票             ***\t\n");
        printf("\t***5.退出普通用户操作  ***\t\n");
        printf("\n请输入你要进行的操作:\t\n");
        char choose[10];
        scanf("%s", choose);
        if (strspn(choose, "0123456789") == strlen(choose)) {
            int ch = atoi(choose);
            switch (ch) {
                case 1:
                    findflight(L);
                    break;
                case 2:
                    findownerflight(z);
                    break;
                case 3:
                    buyticket(L, z);
                    break;
                case 4:
                    Refund(z);
                    break;
                case 5:
                    flag = 0;
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
    printf("退出普通用户操作成功!\n");
}

void login() {
    int flag = 1;
    while (flag) {
        printf("\t**1.开始注册    2.返回主界面**\t\n");
        char input_num[10];
        scanf("%s", input_num);
        if (strspn(input_num, "0123456789") == strlen(input_num)) {
            int n = atoi(input_num);
            switch (n) {
                case 1: {
                    User* newUser = (User*)malloc(sizeof(User));
                    printf("请输入账号: \n");
                    scanf("%s", newUser->id);
                    printf("请输入密码: \n");
                    scanf("%s", newUser->pw);
                    newUser->next = userList;
                    userList = newUser;
                    printf("\n注册成功!请返回登录!\n");
                    break;
                }
                case 2:
                    printf("退出注册成功!\n");
                    flag = 0;
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
}

void sign(LinkList* L, LinkList* z) {
    char login_id[ID];
    char login_pw[PW];
    printf("请输入账号: \t");
    scanf("%s", login_id);
    printf("请输入密码: \t");
    scanf("%s", login_pw);

    if (strcmp(login_id, "admin") == 0 && strcmp(login_pw, "8888888") == 0) {
        printf("\n管理员账号登录成功!\n");
        admin(L);
    } else {
        User* temp = userList;
        while (temp) {
            if (strcmp(temp->id, login_id) == 0 && strcmp(temp->pw, login_pw) == 0) {
                printf("\n普通用户登录成功!\n");
                common_user(L, z);
                return;
            }
            temp = temp->next;
        }
        printf("此账号未注册!请先注册!\n");
    }
}

代码解释

1.代码结构

代码由几个部分组成,包括主函数、初始化函数、用户操作函数和航班操作函数。

2. 头文件和宏定义

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define ID 30
#define PW 30

  • 引入了标准输入输出、标准库、字符串操作和字符类型头文件。
  • 定义了账号和密码的长度宏。

3. 数据结构定义

typedef struct User {
    char id[ID];
    char pw[PW];
    struct User* next;
} User;

typedef struct Flight {
    char name[10];
    char start[10];
    char bourn[10];
    char f_schedule[16]; // 航班时间的格式 "YYYY-MM-DD HH:MM"
    int spare_votes;
    int price;
} flight;

typedef struct LNode {
    flight data;
    struct LNode* next;
} Node, *LinkList;

  • 定义了用户和航班信息的结构体。
  • 用户结构体包含账号、密码和指向下一个用户的指针。
  • 航班结构体包含航班名称、起始点、目的地、航班时间、剩余票数和价格。
  • 链表节点结构体包含航班数据和指向下一个节点的指针。

4. 全局变量

User* userList = NULL;

定义了一个全局用户链表头指针。

5. 函数声明

void InitList(LinkList* pHead);
LinkList get_newNode(LinkList* L);
void print_List(LinkList* L);
void addflight(LinkList* L);
void deleteflight(LinkList* L);
void findflight(LinkList* L);
void changeflight(LinkList* L);
void admin(LinkList* L);
void findownerflight(LinkList* z);
LinkList buy(LinkList* L);
void buyticket(LinkList* L, LinkList* z);
void Refund(LinkList* L);
void common_user(LinkList* L, LinkList* z);
void login();
void sign(LinkList* L, LinkList* z);

  • 声明了系统中使用的所有函数。

6. 主函数

int main() {
    LinkList L, USER;
    InitList(&L);
    InitList(&USER);
    printf("\n");

    int flag = 1;
    while (flag) {
        printf("\n");
        printf("\t***********************\t\n");
        printf("\t******航班购票系统******\t\n");
        printf("\t****1.注册    2.登录****\t\n");
        printf("\t*********0.退出*********\t\n");
        printf("\t***********************\t\n");
        char num[10];
        scanf("%s", num);
        if (strspn(num, "0123456789") == strlen(num)) {
            int nu = atoi(num);
            switch (nu) {
                case 0:
                    printf("已退出系统!\n");
                    flag = 0;
                    break;
                case 1:
                    login();
                    break;
                case 2:
                    sign(&L, &USER);
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
}

  • 初始化两个链表,一个用于航班信息,一个用于已购买航班信息。
  • 提供主菜单供用户选择注册、登录或退出系统。
  • 处理用户输入,并调用相应的函数。

7. 初始化链表

void InitList(LinkList* pHead) {
    *pHead = (LinkList)malloc(sizeof(Node));
    if (*pHead) {
        (*pHead)->next = NULL;
    } else {
        printf("\n开辟内存失败\n");
    }
}

  • 分配内存并初始化链表头节点。

8. 添加新航班节点

LinkList get_newNode(LinkList* L) {
    LinkList newNode = (LinkList)malloc(sizeof(Node));
    if (newNode) {
        printf("请输入要增加的航班名称: \t");
        scanf("%s", newNode->data.name);
        printf("请输入该航班的起始点: \t");
        scanf("%s", newNode->data.start);
        printf("请输入该航班的目的地: \t");
        scanf("%s", newNode->data.bourn);
        printf("请输入该航班的航班时间 (格式 YYYY-MM-DD HH:MM):\t");
        scanf("%s", newNode->data.f_schedule);

        int valid_input = 0;
        while (!valid_input) {
            printf("请输入该航班的价格: \t");
            if (scanf("%d", &newNode->data.price) == 1 && newNode->data.price > 0) {
                valid_input = 1;
            } else {
                printf("输入无效,请输入正整数。\n");
                while (getchar() != '\n'); 
            }
        }

        valid_input = 0;
        while (!valid_input) {
            printf("请输入该航班的剩余票数:\t");
            if (scanf("%d", &newNode->data.spare_votes) == 1 && newNode->data.spare_votes > 0) {
                valid_input = 1;
            } else {
                printf("输入无效,请输入正整数。\n");
                while (getchar() != '\n'); 
            }
        }

        LinkList temp = (*L)->next;
        while (temp) {
            if (strcmp(temp->data.name, newNode->data.name) == 0 &&
                strcmp(temp->data.start, newNode->data.start) == 0 &&
                strcmp(temp->data.bourn, newNode->data.bourn) == 0 &&
                strcmp(temp->data.f_schedule, newNode->data.f_schedule) == 0) {
                printf("\n此航班已存在!请再次确认!\n");
                free(newNode);
                return NULL;
            }
            temp = temp->next;
        }
        newNode->next = NULL;
        return newNode;
    } else {
        printf("\n开辟内存失败\n");
        return NULL;
    }
}

  • 提供输入航班信息的接口,并检查输入的合法性。
  • 检查是否存在相同航班,避免重复添加。

9. 打印航班列表

void print_List(LinkList* L) {
    LinkList p = (*L)->next;
    if (!p) {
        printf("暂无航班!\n");
    } else {
        int i = 0;
        while (p) {
            printf("\n航班的名称:%s\n", p->data.name);
            printf("航班的起始点:%s\n", p->data.start);
            printf("航班的目的地:%s\n", p->data.bourn);
            printf("航班的航班时间:%s\n", p->data.f_schedule);
            printf("航班的剩余票数:%d\n", p->data.spare_votes);
            printf("航班的价格:%d\n", p->data.price);
            printf("\n");
            i++;
            p = p->next;
        }
        printf("共有%d个航班!\n", i);
    }
}

  • 遍历航班链表,并打印每个航班的信息。

10. 添加航班信息

void addflight(LinkList* L) {
    int flag = 1;
    while (flag) {
        char s[2];
        LinkList tail = *L;
        while (tail->next) {
            tail = tail->next;
        }
        LinkList newNode = get_newNode(L);
        if (newNode) {
            tail->next = newNode;
        }
        while (flag) {
            printf("是否继续增加航班信息?是:1 否:0\n");
            scanf("%s", s);
            if (strspn(s, "01") == strlen(s)) {
                int ch = atoi(s);
                if (ch == 0) {
                    printf("已退出增加航班!\n");
                    flag = 0;
                } else {
                    break;
                }
            } else {
                printf("请输入正确的序号!\n");
            }
        }
    }
}

  • 管理员可以添加新的航班信息。
  • 提供继续添加的选项。

11. 删除航班信息

void deleteflight(LinkList* L) {
    printf("请输入要删除的航班信息:\t\n");
    flight temp;
    printf("航班名称:\t");
    scanf("%s", temp.name);
    printf("航班起始点:\t");
    scanf("%s", temp.start);
    printf("航班目的地:\t");
    scanf("%s", temp.bourn);
    printf("航班时间:\t");
    scanf("%s", temp.f_schedule);

    LinkList p = *L, q;
    while (p->next) {
        if (strcmp(p->next->data.name, temp.name) == 0 &&
            strcmp(p->next->data.start, temp.start) == 0 &&
            strcmp(p->next->data.bourn, temp.bourn) == 0 &&
            strcmp(p->next->data.f_schedule, temp.f_schedule) == 0) {
            q = p->next;
            p->next = q->next;
            free(q);
            printf("删除成功\n");
            return;
        }
        p = p->next;
    }
    printf("删除失败! 请检查此航班是否存在!\n");
}

  • 管理员可以根据指定信息删除航班。

12. 查找航班信息

void findflight(LinkList* L) {
    int flag = 1;
    while (flag) {
        printf("\n\t** 请输入要查询的方式 **:\n");
        printf("\t**1.按航班的名称查询  **\n");
        printf("\t**2.按航班的起始点    **\n");
        printf("\t**3.按航班的目的地  **\n");
        printf("\t**4.按航班的航班时间  **\n");
        printf("\t**5.查询所有航班  **\n");
        printf("\t**6.退出查询  **\n");
        char choose[5];
        scanf("%s", choose);
        if (strspn(choose, "0123456789") == strlen(choose)) {
            int ch = atoi(choose);
            LinkList q = (*L)->next;
            int count = 0;
            switch (ch) {
                case 1: {
                    char flight_name[10];
                    printf("请输入要查询的航班名称:\t");
                    scanf("%s", flight_name);
                    while (q) {
                        if (strcmp(q->data.name, flight_name) == 0) {
                            printf("\n该航班的名称:%s\n", q->data.name);
                            printf("该航班的起始点:%s\n", q->data.start);
                            printf("该航班的目的地:%s\n", q->data.bourn);
                            printf("该航班的航班时间:%s\n", q->data.f_schedule);
                            printf("该航班的剩余票数:%d\n", q->data.spare_votes);
                            printf("该航班的价格:%d\n", q->data.price);
                            count++;
                        }
                        q = q->next;
                    }
                    if (count == 0) {
                        printf("该航班不存在!\n");
                    } else {
                        printf("要查询的航班共有%d个\n", count);
                    }
                    break;
                }
                case 2: {
                    char flight_start[10];
                    printf("请输入要查询的航班起始点:\t");
                    scanf("%s", flight_start);
                    while (q) {
                        if (strcmp(q->data.start, flight_start) == 0) {
                            printf("\n该航班的名称:%s\n", q->data.name);
                            printf("该航班的起始点:%s\n", q->data.start);
                            printf("该航班的目的地:%s\n", q->data.bourn);
                            printf("该航班的航班时间:%s\n", q->data.f_schedule);
                            printf("该航班的剩余票数:%d\n", q->data.spare_votes);
                            printf("该航班的价格:%d\n", q->data.price);
                            count++;
                        }
                        q = q->next;
                    }
                    if (count == 0) {
                        printf("该航班不存在!\n");
                    } else {
                        printf("要查询的航班共有%d个\n", count);
                    }
                    break;
                }
                case 3: {
                    char flight_bourn[10];
                    printf("请输入要查询的航班目的地:\t");
                    scanf("%s", flight_bourn);
                    while (q) {
                        if (strcmp(q->data.bourn, flight_bourn) == 0) {
                            printf("\n该航班的名称:%s\n", q->data.name);
                            printf("该航班的起始点:%s\n", q->data.start);
                            printf("该航班的目的地:%s\n", q->data.bourn);
                            printf("该航班的航班时间:%s\n", q->data.f_schedule);
                            printf("该航班的剩余票数:%d\n", q->data.spare_votes);
                            printf("该航班的价格:%d\n", q->data.price);
                            count++;
                        }
                        q = q->next;
                    }
                    if (count == 0) {
                        printf("该航班不存在!\n");
                    } else {
                        printf("要查询的航班共有%d个\n", count);
                    }
                    break;
                }
                case 4: {
                    char flight_schedule[16];
                    printf("请输入要查询的航班时间:\t");
                    scanf("%s", flight_schedule);
                    while (q) {
                        if (strcmp(q->data.f_schedule, flight_schedule) == 0) {
                            printf("\n该航班的名称:%s\n", q->data.name);
                            printf("该航班的起始点:%s\n", q->data.start);
                            printf("该航班的目的地:%s\n", q->data.bourn);
                            printf("该航班的航班时间:%s\n", q->data.f_schedule);
                            printf("该航班的剩余票数:%d\n", q->data.spare_votes);
                            printf("该航班的价格:%d\n", q->data.price);
                            count++;
                        }
                        q = q->next;
                    }
                    if (count == 0) {
                        printf("该航班不存在!\n");
                    } else {
                        printf("要查询的航班共有%d个\n", count);
                    }
                    break;
                }
                case 5:
                    print_List(L);
                    break;
                case 6:
                    flag = 0;
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
    printf("已退出查询!\n");
}

  • 管理员或用户可以根据多种条件查询航班信息。

13. 修改航班信息

void changeflight(LinkList* L) {
    int flag = 1;
    while (flag) {
        flight temp;
        printf("请输入要修改的航班信息:\t\n");
        printf("航班名称:\t");
        scanf("%s", temp.name);
        printf("航班起始点:\t");
        scanf("%s", temp.start);
        printf("航班目的地:\t");
        scanf("%s", temp.bourn);
        printf("航班时间:\t");
        scanf("%s", temp.f_schedule);

        LinkList w = (*L)->next;
        int found = 0;
        while (w) {
            if (strcmp(w->data.name, temp.name) == 0 &&
                strcmp(w->data.start, temp.start) == 0 &&
                strcmp(w->data.bourn, temp.bourn) == 0 &&
                strcmp(w->data.f_schedule, temp.f_schedule) == 0) {
                printf("\n修改后的航班名称:\n");
                scanf("%s", w->data.name);
                printf("修改后的起始点:\n");
                scanf("%s", w->data.start);
                printf("修改后的目的地:\n");
                scanf("%s", w->data.bourn);
                printf("修改后的航班时间:\n");
                scanf("%s", w->data.f_schedule);
                printf("修改后的剩余票数:\n");
                scanf("%d", &w->data.spare_votes);
                printf("修改后的价格:\n");
                scanf("%d", &w->data.price);
                found = 1;
                break;
            }
            w = w->next;
        }
        if (!found) {
            printf("修改失败!无此航班!\n");
        } else {
            printf("修改成功!\n");
        }
        while (flag) {
            char n[5];
            printf("是否需要继续修改其他航班信息?继续:1 退出 :0\n");
            scanf("%s", n);
            if (strspn(n, "01") == strlen(n)) {
                int nn = atoi(n);
                if (nn == 0) {
                    flag = 0;
                } else {
                    break;
                }
            } else {
                printf("请正确输入!\n");
            }
        }
    }
}

  • 管理员可以修改指定的航班信息。

14. 管理员操作界面

void admin(LinkList* L) {
    char choose[10];
    int flag = 1;
    while (flag) {
        printf("\n");
        printf("请输入你要进行的操作:\t\n\n");
        printf("\t***1.增加航班信息  ***\t\n");
        printf("\t***2.删除航班信息  ***\t\n");
        printf("\t***3.查找航班信息  ***\t\n");
        printf("\t***4.修改航班信息  ***\t\n");
        printf("\t***5.退出管理员操作***\t\n");
        scanf("%s", choose);
        if (strspn(choose, "0123456789") == strlen(choose)) {
            int ch = atoi(choose);
            switch (ch) {
                case 1:
                    addflight(L);
                    break;
                case 2:
                    deleteflight(L);
                    break;
                case 3:
                    findflight(L);
                    break;
                case 4:
                    changeflight(L);
                    break;
                case 5:
                    flag = 0;
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
    printf("已退出管理员操作!\n");
}

  • 提供管理员操作界面,包括增加、删除、查询和修改航班信息。

15. 查看已购买航班

void findownerflight(LinkList* z) {
    int flag = 1;
    while (flag) {
        LinkList q = (*z)->next;
        int i = 1, found = 0;
        while (q) {
            printf("\n购买的第%d个航班信息:\n", i);
            printf("已购买航班的名称:%s\n", q->data.name);
            printf("已购买航班的起始点:%s\n", q->data.start);
            printf("已购买航班的目的地:%s\n", q->data.bourn);
            printf("已购买航班的航班时间:%s\n", q->data.f_schedule);
            printf("已购买航班的剩余票数:%d\n", q->data.spare_votes);
            printf("已购买航班的价格:%d\n", q->data.price);
            i++;
            found = 1;
            q = q->next;
        }
        if (!found) {
            printf("你未购买任何航班\n");
        }
        while (flag) {
            char n[5];
            printf("是否退出?继续查看:1 退出 :0\n");
            scanf("%s", n);
            if (strspn(n, "01") == strlen(n)) {
                int nn = atoi(n);
                if (nn == 0) {
                    printf("退出成功!\n");
                    flag = 0;
                } else {
                    break;
                }
            } else {
                printf("请正确输入!\n");
            }
        }
    }
}

  • 用户可以查看已购买的航班信息。

16. 购买航班

LinkList buy(LinkList* L) {
    printf("\n请输入要购买的航班信息:\t\n");
    flight temp;
    printf("航班名称:\t");
    scanf("%s", temp.name);
    printf("航班起始点:\t");
    scanf("%s", temp.start);
    printf("航班目的地:\t");
    scanf("%s", temp.bourn);
    printf("航班时间:\t");
    scanf("%s", temp.f_schedule);

    LinkList w = (*L)->next;
    while (w) {
        if (strcmp(w->data.name, temp.name) == 0 &&
            strcmp(w->data.start, temp.start) == 0 &&
            strcmp(w->data.bourn, temp.bourn) == 0 &&
            strcmp(w->data.f_schedule, temp.f_schedule) == 0) {
            if (w->data.spare_votes > 0) {
                LinkList u = (LinkList)malloc(sizeof(Node));
                strcpy(u->data.name, w->data.name);
                strcpy(u->data.start, w->data.start);
                strcpy(u->data.bourn, w->data.bourn);
                strcpy(u->data.f_schedule, w->data.f_schedule);
                u->data.spare_votes = w->data.spare_votes;
                u->data.price = w->data.price;
                u->next = NULL;
                printf("购买成功!\n");
                w->data.spare_votes--;
                return u;
            } else {
                printf("该航班已无剩余票数!\n");
                return NULL;
            }
        }
        w = w->next;
    }
    printf("购买失败!无此航班!\n");
    return NULL;
}

  • 用户可以根据输入信息购买航班,如果航班存在且有余票,则购买成功。

17. 购票界面

void buyticket(LinkList* L, LinkList* z) {
    int flag = 1;
    while (flag) {
        printf("\t**1.搜索航班信息 **\n");
        printf("\t**2.购买机票     **\n");
        printf("\t**3.退出购票     **\n");
        char n[5];
        scanf("%s", n);
        if (strspn(n, "123") == strlen(n)) {
            int nn = atoi(n);
            LinkList tail;
            switch (nn) {
                case 1:
                    findflight(L);
                    break;
                case 2:
                    tail = *z;
                    while (tail->next) {
                        tail = tail->next;
                    }
                    LinkList newNode = buy(L);
                    if (newNode) {
                        tail->next = newNode;
                    }
                    break;
                case 3:
                    printf("退出成功!\n");
                    flag = 0;
                    break;
            }
        } else {
            printf("请正确输入!\n");
        }
    }
}

  • 用户购票界面,包括搜索航班、购买机票和退出购票功能。

18. 退票功能

void Refund(LinkList* L) {
    printf("请输入要退票的航班信息:\t\n");
    flight temp;
    printf("航班名称:\t");
    scanf("%s", temp.name);
    printf("航班起始点:\t");
    scanf("%s", temp.start);
    printf("航班目的地:\t");
    scanf("%s", temp.bourn);
    printf("航班时间:\t");
    scanf("%s", temp.f_schedule);

    LinkList p = *L, q;
    while (p->next) {
        if (strcmp(p->next->data.name, temp.name) == 0 &&
            strcmp(p->next->data.start, temp.start) == 0 &&
            strcmp(p->next->data.bourn, temp.bourn) == 0 &&
            strcmp(p->next->data.f_schedule, temp.f_schedule) == 0) {
            q = p->next;
            p->next = q->next;
            free(q);
            printf("退票成功\n");
            return;
        }
        p = p->next;
    }
    printf("退票失败! 请检查是否已购买此机票!\n");
}

  • 用户可以退票,根据输入的航班信息进行退票操作。

19. 普通用户操作界面

void common_user(LinkList* L, LinkList* z) {
    int flag = 1;
    while (flag) {
        printf("\n\t***1.查找航班信息      ***\t\n");
        printf("\t***2.查看已购买航班    ***\t\n");
        printf("\t***3.购买航班    ***\t\n");
        printf("\t***4.退票             ***\t\n");
        printf("\t***5.退出普通用户操作  ***\t\n");
        printf("\n请输入你要进行的操作:\t\n");
        char choose[10];
        scanf("%s", choose);
        if (strspn(choose, "0123456789") == strlen(choose)) {
            int ch = atoi(choose);
            switch (ch) {
                case 1:
                    findflight(L);
                    break;
                case 2:
                    findownerflight(z);
                    break;
                case 3:
                    buyticket(L, z);
                    break;
                case 4:
                    Refund(z);
                    break;
                case 5:
                    flag = 0;
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
    printf("退出普通用户操作成功!\n");
}

  • 提供普通用户操作界面,包括查找航班、查看已购买航班、购买航班和退票功能。

20. 用户注册功能

void login() {
    int flag = 1;
    while (flag) {
        printf("\t**1.开始注册    2.返回主界面**\t\n");
        char input_num[10];
        scanf("%s", input_num);
        if (strspn(input_num, "0123456789") == strlen(input_num)) {
            int n = atoi(input_num);
            switch (n) {
                case 1: {
                    User* newUser = (User*)malloc(sizeof(User));
                    printf("请输入账号: \n");
                    scanf("%s", newUser->id);
                    printf("请输入密码: \n");
                    scanf("%s", newUser->pw);
                    newUser->next = userList;
                    userList = newUser;
                    printf("\n注册成功!请返回登录!\n");
                    break;
                }
                case 2:
                    printf("退出注册成功!\n");
                    flag = 0;
                    break;
                default:
                    printf("请输入正确的序号!\n");
                    break;
            }
        } else {
            printf("请输入正确的序号!\n");
        }
    }
}

  • 提供用户注册功能,用户可以输入账号和密码进行注册。

21. 用户登录功能

void sign(LinkList* L, LinkList* z) {
    char login_id[ID];
    char login_pw[PW];
    printf("请输入账号: \t");
    scanf("%s", login_id);
    printf("请输入密码: \t");
    scanf("%s", login_pw);

    if (strcmp(login_id, "admin") == 0 && strcmp(login_pw, "8888888") == 0) {
        printf("\n管理员账号登录成功!\n");
        admin(L);
    } else {
        User* temp = userList;
        while (temp) {
            if (strcmp(temp->id, login_id) == 0 && strcmp(temp->pw, login_pw) == 0) {
                printf("\n普通用户登录成功!\n");
                common_user(L, z);
                return;
            }
            temp = temp->next;
        }
        printf("此账号未注册!请先注册!\n");
    }
}

  • 提供用户登录功能,区分管理员和普通用户。
  • 如果是管理员,进入管理员操作界面;如果是普通用户,进入普通用户操作界面。

使用的技术和知识点

标准输入输出和字符串操作:

  • #include <stdio.h>#include <string.h>
  • 标准输入输出用于与用户进行交互,如输入航班信息和显示结果。
  • 字符串操作用于处理航班名称、起始点、目的地等信息。

动态内存分配:

  • #include <stdlib.h>
  • 使用 malloc 函数在运行时动态分配内存,如为新的航班节点分配内存。

链表:

  • 使用链表数据结构存储航班信息和用户信息。
  • 链表节点结构体包含航班数据和指向下一个节点的指针。

构体:

  • 定义 User 结构体来存储用户信息(账号、密码)。
  • 定义 Flight 结构体来存储航班信息(航班名称、起始点、目的地、航班时间、剩余票数、价格)。
  • 链表节点 LNode 结构体包含航班数据和指向下一个节点的指针。

指针和链表操作:

  • 使用指针操作链表,如添加、删除和查找航班信息。
  • 链表的增删改查操作涉及到指针的移动和节点的连接。

条件判断和循环控制:

  • 使用 ifwhileswitch 等控制结构实现用户交互逻辑和功能选择。
  • 如:检查用户输入是否合法,提供用户选择继续或退出的选项。

输入校验:

  • 验证用户输入的航班信息是否合法,如航班时间格式、价格和剩余票数是否为正整数。

字符串比较:

  • 使用 strcmp 函数比较字符串,如检查是否存在相同航班,验证登录信息等。

函数分解和模块化设计:

  • 将功能分解为多个函数,如 InitListget_newNodeaddflightdeleteflightfindflight 等。
  • 每个函数负责实现特定的功能,增强代码的可读性和可维护性。

用户注册和登录功能:

  • 提供用户注册功能,用户可以输入账号和密码进行注册。
  • 提供用户登录功能,区分管理员和普通用户,登录后进入相应的操作界面。

管理员和普通用户操作界面:

  • 提供管理员操作界面,包括增加、删除、查询和修改航班信息。
  • 提供普通用户操作界面,包括查找航班、查看已购买航班、购买航班和退票功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trust Tomorrow

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值