文件结构
|-- FlightBookTicketSystem.h(定义了接口)
|-- function.c(实现了接口)
|-- main.c(主程序入口)
代码拆分
函数接口定义
文件名:FlightBookTicketSystem.h
#pragma once
#ifndef FlightBookTicketSystem_H_INCLUDED
#define FlightBookTicketSystem_H_INCLUDED
/* 常量定义 */
#define MINSIZE 40
#define MAXSIZE 40
/* 函数结果状态 */
typedef enum Status
{
error,
ok
}Status;
/* 已订票的客户名单--线性表(双向链表)实现 */
typedef struct clientNode
{
char name[MINSIZE]; //姓名
int amount; //订票量
int rank; //舱位等级1,2或3
struct clientNode* prior, * next; //指针域,二叉链表
}clientNode, * clientList;
/* 等候替补的客户名单--链队列实现 */
typedef struct waitNode
{
char name[MAXSIZE]; //姓名
int amount; //订票量
struct waitNode* next; //指针域,单向链表
}waitNode, * waitPtr;
/* 链队列 */
typedef struct waitQueue
{
waitPtr front; //队头指针
waitPtr rear; //队尾指针
}waitQueue, * waitQueuePtr;
/* 航班总信息--线性表(带头结点的单链表)实现 */
typedef struct Flight
{
char destination[MAXSIZE]; //终点站名
char flightID[MAXSIZE]; //航班号
char planeID[MAXSIZE]; //飞机号
char time[MAXSIZE]; //起飞时间
int num; //乘员定额
int tickets; //余票量
clientList clist; //已订票的客户名单(包括姓名、订票量、舱位等级1,2或3)
waitQueue wqueue; //等候替补的客户名单(包括姓名、所需票量)
struct Flight* next; //指针域,单向链表
}Flight, * FlightList;
/* 防止用户乱输入其他的字符,规范用户输入整数 */
int judge_int(void);
/* 创建客户订单结点 */
clientList Creat_clientNode(char name[MAXSIZE], int amount, int rank);
/* 插入客户名单到总的已订票客户名单 */
Status Insert_clientList(clientList* total, clientList* c);
/* 删除航线总订单中的指定订单 */
Status Delete_clientList(clientList* total, clientList* c, int amount);
/* 入队 */
Status En_waitQueue(waitQueue* wqueue, char name[MINSIZE], int amount);
/* 出队 */
Status De_waitQueue(waitQueue* wqueue, waitPtr de);
/* 遍历队列 */
Status TraverseQueue(waitQueue wqueue, void(*visit)(waitPtr e));
/* 计算指定队列长度 */
int QueueLength(waitQueue wq, waitPtr query);
/* 初始化(航班总信息)单链表 */
Status Init_Flight(FlightList* f);
/* 创建航班结点 */
FlightList Creat_Flight(char* des, char* fid, char* pid, char* time, int num, int tickets);
/* 插入新的航班 */
Status Insert_Flight(FlightList* f1, FlightList* f2);
/* 删除指定航班 */
int Delete_Flight(FlightList* f, char* flightID);
/* 查询航线,输出航班信息 */
void SearchFlight(FlightList flight);
/* 订票 */
void booking(FlightList* f, int amount);
/* 客户订票 */
int BookTicket(FlightList* flight);
/* 替补订票 */
void booking_wait(FlightList* f, int amount, char* name);
/* 更新替补队列 */
void update_queue(FlightList* f, int amount);
/* 客户退票 */
int RefundTicket(FlightList* flight);
/* 显示所有航班信息 */
void DisplayAllInfo(FlightList flight);
/* 添加新的航班 */
void addFlight(FlightList* flight);
/* 删除指定航班 */
void deleteFlight(FlightList* flight);
/* 显示指定航线上的客户订单 */
void displayClientInfo(FlightList flight);
/* 查看候补队列 */
void DisplayWaitQueue(FlightList flight);
/* 候补队列查询 */
void QueryWaitQueue(FlightList flight);
/* 访问结点 */
void visit(waitPtr e);
/* 管理员验证 */
Status AdministratorVerify(void);
/* 主菜单 */
void MainMenu(void);
/* 用户菜单 */
void UserMenu(void);
/* 管理员菜单 */
void AdminMenu(void);
#endif
实现接口的功能
文件名:function.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include "FlightBookTicketSystem.h"
/* 不在vs上运行可去掉下面两行代码 */
#pragma warning(disable:4996) //visual studio安全性问题scanf,getchar
#pragma warning(disable:6031) //visual studio返回值被忽略问题strcmp
/* 初始化带头结点的单链表 */
Status Init_Flight(FlightList* f)
{
*f = (FlightList)malloc(sizeof(Flight));
if ((*f) == NULL)
{
printf("内存分配失败\n");
system("pause");
exit(0);
}
strcpy((*f)->destination, "");
strcpy((*f)->flightID, "");
strcpy((*f)->planeID, "");
strcpy((*f)->time, "");
(*f)->num = 0;
(*f)->tickets = 0;
(*f)->next = NULL;
return ok;
}
/* 构造航班结点 */
FlightList Creat_Flight(char* des, char* fid, char* pid, char* time, int num, int tickets)
{
FlightList fl = (FlightList)malloc(sizeof(Flight));
if (fl == NULL)
{
printf("内存分配失败\n");
system("pause");
exit(0);
}
strcpy(fl->destination, des);
strcpy(fl->flightID, fid);
strcpy(fl->planeID, pid);
strcpy(fl->time, time);
fl->num = num;
fl->tickets = tickets;
fl->clist = NULL;
fl->wqueue.front = NULL;
fl->wqueue.rear = NULL;
fl->next = NULL;
return fl;
}
/* 单链表的插入操作(按一定顺序插入) */
Status Insert_Flight(FlightList* f1, FlightList* f2)
{
FlightList p, pr;
p = *f1;
pr = NULL;
if ((*f2) == NULL)
{
return error;
}
while (p != NULL)
{
if ((strcmp(p->destination, "") != 0) && (strcmp(p->destination, (*f2)->destination) >= 0)) //比较终点站名顺序,插入顺序为按终点站名从小到大排序
{
break;
}
pr = p;
p = p->next;
}
if (pr == NULL)
{
return error;
}
pr->next = *f2;
(*f2)->next = p;
return ok;
}
/* 单链表的删除操作 */
int Delete_Flight(FlightList* f, char* flightID)
{
int flag = 0; //航班信息是否查询到的标志
FlightList p, pr;
p = *f;
pr = NULL;
if (strcmp(flightID, "") == 0)
{
return error;
}
while (p != NULL)
{
if (strcmp(p->flightID, flightID) == 0)
{
flag = 1;
break;
}
pr = p;
p = p->next;
}
if (pr == NULL)
{
return error;
}
if (flag == 1)
{
pr->next = p->next;
free(p);
}
return flag;
}
/* 单链表的遍历 */
void SearchFlight(FlightList flight)
{
system("cls");
printf("\n\n");
printf("************************************\n");
printf("* 欢迎使用航空客运系统 *\n");
printf("*----------------------------------*\n");
printf("* 当前为:查询窗口 *\n");
printf("************************************\n");
char destination[MAXSIZE] = { 0 };
printf("\n请输入终点站名:");
scanf("%s", destination);
int flag = 0;
FlightList p = flight;
while (p != NULL)
{
if (strcmp(destination, p->destination) == 0)
{
flag = 1;
break;
}
p = p->next;
}
if (flag == 1)
{
p = flight;
printf("查找成功!\n\n%s的航班信息如下:\n\n", destination);
printf("| 航班号 |-| 机型 |-| 起飞时间 |-| 剩余票数 |\n");
while (p != NULL)
{
if (strcmp(destination, p->destination) == 0)
{
printf(" %-14s%-11s%-23s%-10d\n", p->flightID, p->planeID, p->time, p->tickets);
}
p = p->next;
}
}
else
{
printf("查找失败!\n");
}
getchar();
printf("\n输入回车键返回上一界面......");
getchar();
system("cls");
}
/* 构造客户订单结点 */
clientList Creat_clientNode(char name[MAXSIZE], int amount, int rank)
{
clientList c = NULL;
c = (clientList)malloc(sizeof(clientNode));
if (c == NULL)
{
printf("内存分配失败\n");
system("pause");
exit(0);
}
strcpy(c->name, name);
c->amount = amount;
c->rank = rank;
c->prior = NULL;
c->next = NULL;
return c;
}
/* 双向链表的插入操作(按一定顺序插入) */
Status Insert_clientList(clientList* total, clientList* c)
{
clientList ptr = *total;
if ((*c) == NULL)
{
return error;
}
if (ptr == NULL)
{
*total = *c;
}
else
{
while (ptr)
{
if (strcmp(ptr->name, (*c)->name) >= 0) //比较姓名顺序,插入顺序为按客户姓名从小到大排序
{
if (ptr->prior == NULL) //比头结点小,插在头结点之前
{
(*c)->next = ptr;
ptr->prior = *c;
*total = *c;
break;
}
else //插在中间
{
(*c)->prior = ptr->prior;
(*c)->next = ptr;
(*c)->prior->next = *c;
ptr->prior = *c;
break;
}
}
else
{
if (ptr->next == NULL) //比尾结点大,插在尾结点之后
{
ptr->next = *c;
(*c)->prior = ptr;
break;
}
}
ptr = ptr->next;
}
}
return ok;
}
/* 双向链表的删除操作 */
Status Delete_clientList(clientList* total, clientList* c, int amount)
{
clientList ptr = *total;
if ((*c) == NULL || ptr == NULL)
{
return error;
}
if ((*c)->amount == amount) //退票量等于订票量
{
if (ptr == *c) //删除结点为头结点
{
ptr = ptr->next;
*total = ptr;
if (*total != NULL)
{
(*total)->prior = NULL;
}
free(*c);
}
else
{
if ((*c)->next != NULL)
{
(*c)->next->prior = (*c)->prior;
}
(*c)->prior->next = (*c)->next;
free(*c);
}
}
else //退票量小于订票量
{
(*c)->amount -= amount;
}
return ok;
}
/* 链式队列的入队操作 */
Status En_waitQueue(waitQueue* wqueue, char name[MINSIZE], int amount)
{
waitPtr ptr = (waitPtr)malloc(sizeof(waitNode));
if (ptr == NULL)
{
printf("内存分配失败\n");
system("pause");
exit(0);
}
strcpy(ptr->name, name);
ptr->amount = amount;
ptr->next = NULL;
if (wqueue->front == NULL)
{
wqueue->front = ptr;
wqueue->rear = ptr;
}
else
{
wqueue->rear->next = ptr;
wqueue->rear = ptr;
}
return ok;
}
/* 出队操作(优先队列:依次访问队列中的人员,若已退票量不少于其需求量,则为该客户出队) */
Status De_waitQueue(waitQueue* wqueue, waitPtr de)
{
if (wqueue->front == NULL)
{
return error;
}
waitPtr ph = wqueue->front;
waitPtr phr = ph->next;
if (wqueue->front == wqueue->rear) //队列中只有一个结点
{
wqueue->front = NULL;
wqueue->rear = NULL;
free(ph);
free(phr);
}
else if (ph == de) //删除结点为队头
{
wqueue->front = wqueue->front->next;
free(ph);
}
else
{
while (phr != NULL) //出队在队头之后
{
if (phr == de)
{
ph->next = de->next;
if (wqueue->rear == de) //出队在队尾
{
wqueue->rear = ph;
}
free(phr);
break;
}
phr = phr->next;
ph = ph->next;
}
}
return ok;
}
/* 链式队列的遍历操作 */
Status TraverseQueue(waitQueue wqueue, void(*visit)(waitPtr e))
{
waitPtr p = wqueue.front;
if (p == NULL)
{
return error;
}
while (p != NULL)
{
visit(p);
p = p->next;
}
return ok;
}
/* 计算队列长度 */
int QueueLength(waitQueue wq, waitPtr query)
{
waitPtr wp = wq.front;
int length = 0;
while (wp != query)
{
length++;
wp = wp->next;
}
return length;
}
void booking(FlightList* f, int amount)
{
(*f)->tickets -= amount;
char name[MAXSIZE] = { 0 };
printf("\n请输入您的名字:");
scanf("%s", name);
int rank = 0;
printf("\n请输入舱位等级(1-3):");
while (1)
{
rank = judge_int();
if (rank >= 1 && rank <= 3) //rank范围[1,3]
{
break;
}
else
{
printf("输入有误,请输入(1-3):");
}
}
clientList c = Creat_clientNode(name, amount, rank);
if (Insert_clientList(&((*f)->clist), &c))
{
printf("订票成功\n");
}
else
{
printf("订票失败\n");
}
}
/* 候补订票 */
void booking_wait(FlightList* f, int amount, char* name)
{
FlightList p = *f;
p->tickets -= amount;
int rank = 0;
printf("\n航班中有人退票\n\n请%s订票\n输入舱位等级(1-3):", name);
while (1)
{
rank = judge_int();
if (rank >= 1 && rank <= 3) //rank范围[1,3]
{
break;
}
else
{
printf("输入有误,请输入(1-3):");
}
}
clientList c = Creat_clientNode(name, amount, rank);
if (Insert_clientList(&((*f)->clist), &c))
{
printf("订票成功\n");
}
else
{
printf("订票失败\n");
}
}
int BookTicket(FlightList* flight)
{
system("cls");
printf("\n\n");
printf("************************************\n");
printf("* 欢迎使用航空客运系统 *\n");
printf("*----------------------------------*\n");
printf("* 当前为:订票窗口 *\n");
printf("************************************\n");
char flightID[MAXSIZE] = { 0 };
int amount = 0;
printf("\n请输入航班号:");
scanf("%s", flightID);
FlightList p = *flight;
int flag = 0;
while (p != NULL)
{
if (strcmp(flightID, p->flightID) == 0)
{
flag = 1;
printf("\n请输入订购的票数:");
while (1)
{
amount = judge_int();
if (amount > 0 && amount <= p->num)
{
break;
}
else if (amount <= 0)
{
printf("订票数应大于0,请重新输入:");
}
else
{
printf("订票数最大值为%d,请重新输入:", p->num);
}
}
if (p->tickets >= amount)
{
booking(&p, amount);
}
else if (p->tickets == 0)
{
printf("\n抱歉,本趟航班已满员\n");
printf("请问是否添加至候补队列?(y/n)\n");
while (1)
{
char queuechoice;
fflush(stdin);
scanf("%c", &queuechoice);
if (queuechoice == 'y' || queuechoice == 'Y')
{
char name[MAXSIZE] = { 0 };
printf("\n请输入您的名字:");
scanf("%s", name);
if (En_waitQueue(&(p->wqueue), name, amount))
{
printf("已添加至候补队列\n");
}
else
{
printf("添加至候补队列失败\n");
}
break;
}
else if (queuechoice == 'n' || queuechoice == 'N')
{
break;
}
else
{
printf("请重新输入(y/n)");
}
}
}
else if (p->tickets != 0 && p->tickets < amount)
{
printf("\n抱歉,余票不足\n");
printf("请问是否添加至候补队列?(y/n)\n");
while (1)
{
char queuechoice;
fflush(stdin);
scanf("%c", &queuechoice);
if (queuechoice == 'y' || queuechoice == 'Y')
{
char name[MAXSIZE] = { 0 };
printf("\n请输入您的名字:");
scanf("%s", name);
if (En_waitQueue(&(p->wqueue), name, amount))
{
printf("已添加至候补队列\n");
}
else
{
printf("添加至候补队列失败\n");
}
break;
}
else if (queuechoice == 'n' || queuechoice == 'N')
{
break;
}
else
{
printf("请重新输入(y/n)");
}
}
}
break;
}
p = p->next;
}
if (flag == 0)
{
printf("\n查询不到该航班!请返回重新输入\n");
}
getchar();
printf("\n输入回车键返回上一界面......");
getchar();
system("cls");
return flag;
}
/* 更新候补队列 */
void update_queue(FlightList* f, int amount)
{
FlightList pf = *f;
waitPtr pw = (*f)->wqueue.front;
while (pw != NULL)
{
if (pw->amount <= amount)
{
int waitamount = pw->amount;
char waitname[MAXSIZE] = { 0 };
strcpy(waitname, pw->name);
De_waitQueue(&((*f)->wqueue), pw);
booking_wait(f, waitamount, waitname);
break;
}
pw = pw->next;
}
}
int RefundTicket(FlightList* flight)
{
system("cls");
printf("\n\n");
printf("************************************\n");
printf("* 欢迎使用航空客运系统 *\n");
printf("*----------------------------------*\n");
printf("* 当前为:退票窗口 *\n");
printf("************************************\n");
char flightID[MAXSIZE] = { 0 };
int amount = 0;
char name[MAXSIZE] = { 0 };
printf("\n请输入航班号:");
scanf("%s", flightID);
printf("\n请输入您的名字:");
scanf("%s", name);
printf("\n请输入退订的票数:");
scanf("%d", &amount);
FlightList p = *flight;
int flag = 0;
clientList pc = NULL;
while (p != NULL)
{
if (strcmp(p->flightID, flightID) == 0)
{
pc = p->clist;
while (pc != NULL)
{
if (strcmp(pc->name, name) == 0)
{
flag = 1;
if (pc->amount >= amount) //退票量小于订票量
{
p->tickets += amount;
Delete_clientList(&(p->clist), &pc, amount);
printf("\n退票成功!退款金额将在两小时内返回支付账户\n");
if (p->wqueue.front != NULL)
{
update_queue(&p, amount);
}
}
else
{
printf("退票量大于订票量!\n");
printf("退票失败\n");
}
break;
}
pc = pc->next;
}
}
p = p->next;
}
if (flag == 0)
{
printf("\n查询不到该订单,退票失败\n");
}
getchar();
printf("\n输入回车键返回上一界面......");
getchar();
system("cls");
return flag;
}
void DisplayAllInfo(FlightList flight)
{
system("cls");
printf("\n\n");
printf("************************************\n");
printf("* 欢迎使用航空客运系统 *\n");
printf("*----------------------------------*\n");
printf("* 以下为所有航班信息 *\n");
printf("************************************\n");
FlightList p = flight;
printf("\n| 航班号 |-| 终点站 |-| 机型 |-| 起飞时间 |-| 可乘坐乘客数 |-| 剩余票数 |\n");
p = p->next;
while (p != NULL)
{
printf(" %-14s%-13s%-15s%-26s%-15d%-5d\n", p->flightID, p->destination, p->planeID, p->time, p->num, p->tickets);
p = p->next;
}
getchar();
printf("\n输入回车键返回上一界面......");
getchar();
system("cls");
}
void addFlight(FlightList* flight)
{
system("cls");
printf("\n\n");
printf("************************************\n");
printf("* 欢迎进入管理员窗口 *\n");
printf("*----------------------------------*\n");
printf("* 当前为:添加航班窗口 *\n");
printf("************************************\n");
char destination[MAXSIZE] = { 0 };
char flightID[MAXSIZE] = { 0 };
char planeID[MAXSIZE] = { 0 };
char time[MAXSIZE] = { 0 };
int num = 0;
int tickets = 0;
printf("\n请输入终点站名:");
scanf("%s", destination);
printf("\n请输入航班号:");
scanf("%s", flightID);
printf("\n请输入飞机号:");
scanf("%s", planeID);
printf("\n请输入起飞时间(格式为yyyy-mm-dd-hh:mm):");
scanf("%s", time);
printf("\n请输入乘员定额:");
num = judge_int();
tickets = num;
FlightList newFlight = Creat_Flight(destination, flightID, planeID, time, num, tickets);
if (Insert_Flight(flight, &newFlight))
{
printf("\n航班添加成功!\n");
}
getchar();
printf("\n输入回车键返回上一界面......");
getchar();
system("cls");
}
void deleteFlight(FlightList* flight)
{
system("cls");
printf("\n\n");
printf("************************************\n");
printf("* 欢迎进入管理员窗口 *\n");
printf("*----------------------------------*\n");
printf("* 当前为:删除航班窗口 *\n");
printf("************************************\n");
char flightID[MAXSIZE] = { 0 };
printf("\n请输入航班号:");
scanf("%s", flightID);
if (Delete_Flight(flight, flightID))
{
printf("\n航班删除成功!\n");
}
else
{
printf("\n航班删除失败!请输入系统存在的航班号!\n");
}
getchar();
printf("\n输入回车键返回上一界面......");
getchar();
system("cls");
}
void displayClientInfo(FlightList flight)
{
system("cls");
printf("\n\n");
printf("************************************\n");
printf("* 欢迎进入管理员窗口 *\n");
printf("*----------------------------------*\n");
printf("* 当前为:查看所有订单窗口 *\n");
printf("************************************\n");
int flag = 0;
char flightID[MAXSIZE] = { 0 };
printf("\n请输入航班号:");
scanf("%s", flightID);
FlightList p = flight;
while (p != NULL)
{
if (strcmp(flightID, p->flightID) == 0)
{
flag = 1;
break;
}
p = p->next;
}
if (flag == 1)
{
clientList cp = p->clist;
if (cp == NULL)
{
printf("\n该航线客户订单为空\n");
}
else
{
printf("\n航班:%s 的所有客户名单", flightID);
while (cp != NULL)
{
printf("\n");
printf("\n客户名字:%s 订票数:%d 舱位等级:%d 等舱", cp->name, cp->amount, cp->rank);
cp = cp->next;
}
}
}
else
{
printf("\n查询不到该航班信息,请输入正确的航班号!");
}
getchar();
printf("\n\n输入回车键返回上一界面......");
getchar();
system("cls");
}
void DisplayWaitQueue(FlightList flight)
{
system("cls");
printf("\n\n");
printf("************************************\n");
printf("* 欢迎进入管理员窗口 *\n");
printf("*----------------------------------*\n");
printf("* 当前为:查看候补队列窗口 *\n");
printf("************************************\n");
int flag = 0;
char flightID[MAXSIZE] = { 0 };
printf("\n请输入航班号:");
scanf("%s", flightID);
FlightList p = flight;
while (p != NULL)
{
if (strcmp(flightID, p->flightID) == 0)
{
flag = 1;
break;
}
p = p->next;
}
if (flag == 1)
{
waitQueue wq = p->wqueue;
if (wq.front == NULL)
{
printf("\n该航线候补队列为空\n");
}
else
{
printf("航班:%s 的所有候补队列名单\n\n", flightID);
if (!TraverseQueue(wq, visit))
{
printf("\n队列为空\n");
}
}
}
else
{
printf("\n查询不到该航班信息,请输入正确的航班号!");
}
getchar();
printf("\n\n输入回车键返回上一界面......");
getchar();
system("cls");
}
void QueryWaitQueue(FlightList flight)
{
system("cls");
printf("\n\n");
printf("************************************\n");
printf("* 欢迎使用航空客运系统 *\n");
printf("*----------------------------------*\n");
printf("* 当前为:查询候补队列窗口 *\n");
printf("************************************\n");
char flightID[MAXSIZE] = { 0 };
int amount = 0;
char name[MAXSIZE] = { 0 };
printf("\n请输入航班号:");
scanf("%s", flightID);
printf("\n请输入您的名字:");
scanf("%s", name);
int flag = 0;
int length = 0;
FlightList pf = flight;
waitPtr wp = NULL;
while (pf != NULL)
{
if (strcmp(pf->flightID, flightID) == 0)
{
wp = pf->wqueue.front;
while (wp != NULL)
{
if (strcmp(wp->name, name) == 0)
{
flag = 1;
length = QueueLength(pf->wqueue, wp);
printf("\n您当前排在第 %d 位\n", length + 1);
break;
}
wp = wp->next;
}
}
pf = pf->next;
}
if (flag == 0)
{
printf("\n查询不到对应信息\n");
}
getchar();
printf("\n输入回车键返回上一界面......");
getchar();
system("cls");
}
void visit(waitPtr e)
{
printf("姓名:%s\t订票量:%d\n", e->name, e->amount);
}
int judge_int(void)
{
int len, num = 0, arg = 1;
char word[10] = { 0 };
int m, j = 1, k;
while (j)
{
scanf("%s", word);
len = strlen(word);
for (m = 0;m < len;m++)
{
if (word[m] < '0' || word[m]>'9') //检验是否有乱输入其他字符
{
printf("请输入整数:");
break;
}
else
{
if (m == len - 1)
j = 0;
}
}
}
j = len - 1;
for (m = 0;m < len;m++) // 将字符重新转换为数字
{
for (k = 0;k < j;k++)
arg *= 10;
num += (word[m] - '0') * arg;
arg = 1;
j--;
}
return num;
}
Status AdministratorVerify(void) {
char pwd[20] = { "admin" }; //管理员密码
char password[20] = { 0 }; //待输入密码,用来验证
printf("请输入管理员密码:\n");
scanf("%s", password);
if (strcmp(pwd, password)) {
printf("密码错误,请重新输入:\n");
return error;
}
printf("验证成功\n");
return ok;
}
void MainMenu(void)
{
printf("\n\n");
printf("************************************\n");
printf("* 欢迎使用航空客运系统 *\n");
printf("*----------------------------------*\n");
printf("* 0.退出系统 *\n");
printf("* 1.用户界面 *\n");
printf("* 2.管理员界面 *\n");
printf("************************************\n");
}
void UserMenu(void)
{
printf("\n\n");
printf("************************************\n");
printf("* 欢迎使用航空客运系统 *\n");
printf("*----------------------------------*\n");
printf("* 0.返回上一级 *\n");
printf("* 1.查询航线 *\n");
printf("* 2.查看所有航班 *\n");
printf("* 3.订购机票 *\n");
printf("* 4.退订机票 *\n");
printf("* 5.候补队列查询 *\n");
printf("************************************\n");
}
void AdminMenu(void)
{
printf("\n\n");
printf("************************************\n");
printf("* 欢迎进入管理员系统 *\n");
printf("*----------------------------------*\n");
printf("* 0.返回上一级 *\n");
printf("* 1.添加航班 *\n");
printf("* 2.删除航班 *\n");
printf("* 3.查看所有航班 *\n");
printf("* 4.查看航线所有订单 *\n");
printf("* 5.查看航线候补订单 *\n");
printf("************************************\n");
}
主程序入口
文件名:main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include "FlightBookTicketSystem.h"
int main(void)
{
FlightList flight = NULL;
Init_Flight(&flight);
int choice = 0;
do
{
MainMenu();
choice = judge_int();
system("cls");
switch (choice)
{
case 0:
break;
//用户菜单
case 1: {
int choice = 0;
do
{
UserMenu();
choice = judge_int();
system("cls");
switch (choice)
{
case 0:
break;
case 1:
printf("\n\n\n\n\n\n\n\n\n\n");
SearchFlight(flight);
break;
case 2:
printf("\n\n\n\n\n\n\n\n\n\n");
DisplayAllInfo(flight);
break;
case 3:
printf("\n\n\n\n\n\n\n\n\n\n");
BookTicket(&flight);
break;
case 4:
printf("\n\n\n\n\n\n\n\n\n\n");
RefundTicket(&flight);
break;
case 5:
printf("\n\n\n\n\n\n\n\n\n\n");
QueryWaitQueue(flight);
break;
default:
printf("输入有误,请重新输入!");
break;
}
} while (choice != 0);
break;
}
//管理员菜单
case 2: {
while (1)
{
if (AdministratorVerify())
break;
}
int choice = 0;
do
{
AdminMenu();
choice = judge_int();
system("cls");
switch (choice)
{
case 0:
break;
case 1:
printf("\n\n\n\n\n\n\n\n\n\n");
addFlight(&flight);
break;
case 2:
printf("\n\n\n\n\n\n\n\n\n\n");
deleteFlight(&flight);
break;
case 3:
printf("\n\n\n\n\n\n\n\n\n\n");
DisplayAllInfo(flight);
break;
case 4:
printf("\n\n\n\n\n\n\n\n\n\n");
displayClientInfo(flight);
break;
case 5:
printf("\n\n\n\n\n\n\n\n\n\n");
DisplayWaitQueue(flight);
break;
default:
printf("输入有误,请重新输入!");
break;
}
} while (choice != 0);
break;
}
default:
printf("输入有误,请重新输入!");
break;
}
} while (choice != 0);
free(flight);
printf("\n\n\n\n\t\t感谢使用航空客运订票系统!\n\n\n");
system("pause");
return 0;
}
完整源码
源码放在GitHub,有用的话还请点个star~
写在最后
由于个人测试能力有限,测试重点只在客户订单和候补队列上,若读者有测试到其他bug,请通过评论区或者私信博主告知bug,亦可提供建议。