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