航班管理系统(C语言) 您所在的位置:网站首页 怎么看机票退票信息查询 航班管理系统(C语言)

航班管理系统(C语言)

2024-07-17 01:23| 来源: 网络整理| 查看: 265

航班管理系统需求 功能概述

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

用户角色及功能 1.账号注册与登录 注册新用户:用户可以通过输入用户名和密码进行注册。用户登录:用户通过输入注册的用户名和密码进行登录。 2.普通用户功能 查看航班信息:用户可以查看航班的起始点、目的地、航班时间、剩余票数、价格等信息。查看已购买的航班信息:用户可以查看自己已购买的航班信息。退票:用户可以退还已购买的机票。 3.管理员功能 增加航班信息:管理员可以增加新的航班信息。删除航班信息:管理员可以删除已存在的航班信息。修改航班信息:管理员可以修改已存在的航班信息。查看航班信息:管理员可以查看所有航班信息。 航班信息结构 起始点(字符串)目的地(字符串)航班时间(字符串,建议格式为 "YYYY-MM-DD HH ")剩余票数(正整数)价格(正整数) 数据结构 使用单链表存储用户信息和航班信息。用户和航班信息使用结构体定义。使用指针操作链表进行增删改查操作。 已完成部分 只能注册一个账号(需修改为多用户注册)普通用户查看航班信息普通用户查看已购买的航班信息普通用户退票管理员增、删、改、查航班信息 待完成部分 实现多用户注册功能管理员增加、修改航班信息时进行合法性验证 首次完成日期:

2021/09/12 18:00

修改日期

2024/07/14 20:25

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

#include #include #include #include #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 #include #include #include #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 和#include 标准输入输出用于与用户进行交互,如输入航班信息和显示结果。字符串操作用于处理航班名称、起始点、目的地等信息。 动态内存分配: #include 使用 malloc 函数在运行时动态分配内存,如为新的航班节点分配内存。 链表: 使用链表数据结构存储航班信息和用户信息。链表节点结构体包含航班数据和指向下一个节点的指针。 构体: 定义 User 结构体来存储用户信息(账号、密码)。定义 Flight 结构体来存储航班信息(航班名称、起始点、目的地、航班时间、剩余票数、价格)。链表节点 LNode 结构体包含航班数据和指向下一个节点的指针。 指针和链表操作: 使用指针操作链表,如添加、删除和查找航班信息。链表的增删改查操作涉及到指针的移动和节点的连接。 条件判断和循环控制: 使用 if、while、switch 等控制结构实现用户交互逻辑和功能选择。如:检查用户输入是否合法,提供用户选择继续或退出的选项。 输入校验: 验证用户输入的航班信息是否合法,如航班时间格式、价格和剩余票数是否为正整数。 字符串比较: 使用 strcmp 函数比较字符串,如检查是否存在相同航班,验证登录信息等。 函数分解和模块化设计: 将功能分解为多个函数,如 InitList、get_newNode、addflight、deleteflight、findflight 等。每个函数负责实现特定的功能,增强代码的可读性和可维护性。 用户注册和登录功能: 提供用户注册功能,用户可以输入账号和密码进行注册。提供用户登录功能,区分管理员和普通用户,登录后进入相应的操作界面。 管理员和普通用户操作界面: 提供管理员操作界面,包括增加、删除、查询和修改航班信息。提供普通用户操作界面,包括查找航班、查看已购买航班、购买航班和退票功能。


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有