数据结构课设-航空客运订票系统(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,有用的话还请点个star~

写在最后

由于个人测试能力有限,测试重点只在客户订单和候补队列上,若读者有测试到其他bug,请通过评论区或者私信博主告知bug,亦可提供建议。

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
目 录 摘 要 1 前 言 2 基本算法的实现 3 采用类C语言定义相关的数据类型 3 各模块的伪码算法 4 函数的调用关系图 6 调试分析 7 测试结果 8 源程序(带注释) 11 总 结 22 参考文献 23 致 谢 24 附件Ⅰ 部分源程序代码 25 摘 要 该设计要求对飞机航班信息进行排序和查找。可按航班的班号、起点站、到达站、起飞时间以及到达时间等信息时行查询。对于本设计,主要是通过线性表的逻辑结构、存储结构,线性表及队列上基本运算实现的。可以让我们学会如何把学到的知识用于解决实际问题。 关键词: 航班信息;客户信息;链式存储结构; 前 言 飞机在现今的社会中已是越来越重要了,人们在旅游、工作、学习等生活中对飞机几乎是不可缺少了。而由乘坐飞机所引起的问题也深入到了计算机领域,飞机订票系统就是解决这种问题的一种途径。如人们常常在订票前要对问很多信息(飞机的起落时间,机票的价格,乘坐的人数以及是否有票等等)。这个系统主要是由线性表的链式存储结构以及队列的存储结构来存储航班信息与客户信息的。它的主要功能:1、是录入航班信息,其调用函数为—insert_airline;2、查询航线(航班号,飞机号,日期,航班容量,余票数),其调用函数为:search_air;3、订票(根据客户提供的情况,办理订票手续),其调用函数为:book_air;4、承办退票业务(根据客户提供的情况,办理退票手续),其调用函数为:del_cus;5、删除已有航班信息 ,其调用函数为:del_airline . 设计这样的一个系统可以很快的查出人们所需要的信息,能省去很多的步骤,而且还非常的准确。
目录 总体设计 2 概要设计 2 详细设计 3 调试分析 11 测试数据及截图 11 时间复杂度分析 15 问题思考 15 算法的改进设想 15 课设总结体会 15 附录 17 程序说明 17 源代码 17 主要参考文献 30 总体设计 通过此系统可以实现如下功能:   1).录入:可以录入航班情况(数据存储在一个数据文件中)   2).查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞 抵达城市,航班票价,票价折扣,确定航班是否满仓);   可以输入起飞抵达城市,查询飞机航班情况;   3).订票:(订票情况存在一个数据文件中)   可以订票,如果该航班已经无票,可以提供相关可选择航班;   4).退票: 可退票,退票后修改相关数据文件;   客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。   5).修改航班信息:   当航班信息改变可以修改航班数据文件 概要设计 每个模块的算法设计说明如下: (1)录入模块: 查找单链表的链尾,在链头插入一个"航班信息"的新结点。 (2)浏览模块: 顺着单链表输出航班信息。 (3)修改模块: 输入密码,确认是否有权限对航班信息进行修改,有则进行修改,否则不能修改。 提供两种修改方式:添加航班和对已有的航班信息进行改动(修改和删除),1添加航线 ,0对已有的航班信息进行改动(修改和删除)。 对已有的航班信息进行改动(修改和删除):顺着单链表查找,若找到则进行相关操 作。 (4)查询模块: 提供两种查方式:按航号和起飞抵达城市查询,0代表按航号查询,1代表按起飞抵达 城市查询。 顺着单链表查找,如果与航班号(起飞抵达城市)一致,输出相关信息并询问乘客是 否要订票,若订进入订票模块;否则,查询不成功。 (5)订票模块: 查找乘客要订的航班号,判断此航班是否有空位,有则输入乘客有关信息,订票成 功;否则查找这个月此乘客起飞城市和降落城市的有空位航班,供乘客选择,若有则订 票,若无则订票不成功并把此乘客的信息录入此航班等候订票队列中,退出订票。 (6)退票模块: 输入要退票的乘客姓名以及所退票的编号,查找乘客资料的链表中是否有这位乘客, 有则删去此结点,并判断是否有等候订票的乘客(有则通知等候订票乘客订票,无则余 票加乘客所退票数);无则退票失败。 (7)文件模块: 顺着单链表链表的信息写入文件。 详细设计 由于此系统流程图太多,流程图所对应的源代码较长,所占篇幅也较大,并且流程图 所对应的源程序在订票系统源程序中都有,这里就不再赘述。需要说明的是插入、查找 、修改和删除这些线性表的基本操作的流程图在订票系统源程序中没有单独函数,是因 为此系统主要是运用线性表的基本操作解决实际问题,具体问题所对应的基本操作代码 有所不同,但思维是相同的,所以这几个操作的源代码已经对应写入了其他具体操作的 函数中,这里也不再给出。 根据订票系统功能的需要定义了如下的结构体: typedef struct wat_ros /*等候订票乘客的信息*/ { char name[20];/*姓名*/ char phone[15];/*等候订票乘客的联系方式*/ struct wat_ros *next; }qnode,*qptr; typedef struct pqueue { qptr front;/*等候替补客户名单域的头指针*/ qptr rear;/*等候替补客户名单域的属指针*/ }linkqueue; typedef struct ord_ros { char name[20];/*客户姓名*/ char IDnum[20];/*客户有效证件的编号*/ char airnum[7];/*航班号*/ int dpl;/*订票量*/ char piaohaio[20];//票的编号,由航班号起飞日期此航班订票前的余票量 struct ord_ros *next; }Lnode ,*linklist; typedef struct airline { char qdname[20];/*起点站名*/ char zhname[20];/*终点站名 */ char air_num[7];/*航班号*/ char plane_num[10];/*飞机型号*/ char year[5]; char month[3]; char day[3];/*飞行日期*/ char qhour[3]; char qminute[3];/*起飞时间*/ char jhour[3]; char jminute[3];/*降落时间*/ float zhekou;/*没有折扣为十折*/ float price;/*票价*/ int tkt_amt;/*乘员定额*/ int tkt_sur;/*余票量*/ Lnode *o
航空客运订票系统可以使用C语言实现数据结构是系统中非常重要的一部分。在系统设计中,合理选择合适的数据结构能够提高系统的性能和效率。 在航空客运订票系统中,我们可以使用以下数据结构来存储和管理相关的数据: 1. 数组:可以用来存储航班信息、乘客信息等固定大小的数据。航班信息可以包括航班号、起飞时间、到达时间等;乘客信息可以包括乘客姓名、证件号码、联系方式等。 2. 链表:可以用来存储乘客订票信息,每个节点表示一个乘客的订票信息,包括航班号、座位号、订票时间等。链表的插入和删除操作比较方便,适合频繁的增删操作。 3. 栈:可以用来存储航班的座位信息,每个栈元素表示一个座位号,可以标记该座位是否已经被预定。当乘客购票时,将座位从栈顶弹出;当乘客退票时,将座位压入栈顶。 4. 队列:可以用来存储乘客的候补信息。当航班已满时,将乘客的候补信息入队;当有乘客退票时,从队列中取出候补乘客进行订票。 5. 树:可以用来组织航空公司的航班信息,每个节点表示一个航班,包括航班号、起飞时间、到达时间等。树结构可以方便地进行航班的查找和排序操作。 除了上述数据结构,还可以使用其他一些辅助数据结构来提高系统的性能和易用性,例如哈希表来存储乘客的信息,以便快速查找和修改。 综上所述,航空客运订票系统实现离不开C语言和合适的数据结构。选择适当的数据结构可以提高系统的效率和易用性,使得航空客运订票系统更加稳定和高效。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不要做码农呀

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值