Advertisement

数据结构课设-航空客运订票系统(C语言实现)代码

阅读量:

目录

  • 文件结构

  • 代码拆分

    • 函数接口定义
    • 实现接口的功能
    • 主程序入口
  • 完整源码

  • 写在最后

文件结构

复制代码
    |-- 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,如有帮助不妨星标一下~

写在最后

由于个人测试能力的限制,在客户订单及候补队列队列上进行测试工作成为主要关注点。如果读者在使用过程中发现了其他问题,请通过评论区或私信博主反馈具体情况并提出建议

全部评论 (0)

还没有任何评论哟~