数据结构课程设计【航空订票系统】

C++ 专栏收录该内容
37 篇文章 0 订阅
/*             
 * Copyright (c) 2017,烟台大学计算机学院             
 * All right reserved.             
 * 文件名称:main.cpp            
 * 作者:于嵩             
 * 完成日期:2017年12月22日             
 * 版本号:v1.0             
 *             
 * 问题描述:航空订票系统             
*/             
/******************************
* 版权所有 (C)2017 YuSong。
* 
* 文件名称:dlinklist.h
* 文件标识:无
* 内容摘要:自定义数据类型和算法及重载函数声明
* 其他说明:无
* 当前版本:V1.0
* 作    者:于嵩
* 完成日期:2017/12/22
******************************/

#ifndef DLINKLIST_H_INCLUDED
#define DLINKLIST_H_INCLUDED
# include <iostream>
using namespace std;
struct Darray
{
	int num;//航站编号
	char terminal_name[12];//终点站名称
	char airline_number[12];//航班号
	char flight_number[12];//飞机号
	char flight_date[12];//日期
	int crew_quota;//成员定额
	int left_tickets;//余票额
};

struct Custom
{
	char name[12];//客户姓名
	char sex[3];//客户性别
	char phonenumber[20];//客户手机号码
	char idcard[20];//客户身份证号码
	int num;//客户选择的机次号
};
class DNode        //定义双链表结点类型
{
public:
	Darray data;
	DNode *prior;    //指向前驱结点
	DNode *next;     //指向后继结点
	bool operator = (Darray &);//声明逻辑运算符重载函数为成员函数
	friend bool operator != (Darray &,Darray &);//声明逻辑运算符重载函数为友元函数
	friend ostream & operator << (ostream &output, Darray &t); //声明流运算符重载函数为友元函数
	
};

class DCustom        //定义双链表结点类型
{
public:
	Custom data;
	DCustom *prior;    //指向前驱结点
	DCustom *next;     //指向后继结点
	bool operator = (Custom &);//声明逻辑运算符重载函数为成员函数
	friend bool operator != (Custom &, Custom &);//声明逻辑运算符重载函数为友元函数
	friend ostream & operator << (ostream &output, Custom &t); //声明流运算符重载函数为友元函数

};



template <typename T, class B>
void CreateListF(T *&L, B a[], int n);//头插法建双链表

template <typename T, class B>
void CreateListR(T *&L, B a[], int n);//尾插法建双链表

template <typename T>
void InitList(T *&L); //初始化双链表

template <typename T>
void DestroyList(T *&L); //销毁双链表

template <typename T>
bool ListEmpty(T *L); //判断链表是否为空

template <typename T>
int ListLength(T *L); //求链表的长度

template <typename T>
void DispList(T *L, int); //输出链表

template <typename T, class B>
bool GetElem(T *L, int i, B *&e); //获取节点的值

template <typename T, class B>
int LocateElem(T *L, B e); //查找一个节点

template <typename T, class B>
bool ListInsert(T *&L, int i, B e);//插入一个节点

template <typename T>
bool ListDelete(T *&L, int i); //删除一个节点

template <typename T, class B>
bool JudgeExist(T *&, B *&, B *&);//判断是否在双链表内

template <typename T, class B>
Darray* FindStation(T *&, B *);//查找遍历函数


#endif

/******************************
* 版权所有 (C)2017 YuSong。
*
* 文件名称:SystemTools.h
* 文件标识:无
* 内容摘要:用户类声明及功能函数声明
* 其他说明:无
* 当前版本:V1.0
* 作    者:于嵩
* 完成日期:2017/12/22
******************************/

#pragma once
# include "dlinklist.h"

class Tools
{
public:
	static Darray* INPUT_FILE_STATIONDATA(int &);//读入航站信息
	static Custom* INPUT_FILE_CUSTOMDATA(int &);//读入用户信息
	static void OUTPUT_FILE_CUSTOMDATA(DCustom *);//写出用户信息
	static void OUTPUT_FILE_STATIONDATA(DNode * L);//写出航站信息
	static void WAITING();//过渡函数
	static void DISPLAY(DNode *,DCustom *);//显示主界面
	static void CHECK_ROUTE(DNode *);//查询航线
	static void BOOKING_TICKETS(DNode *, DCustom *);//订票预约
	static bool REFUND_TICKETS(DNode *, DCustom *);//退票改签
	static bool Tools::FIND_CUSTOMERINFORMATION(DNode *, DCustom *);//查询用户信息
	static bool Tools::ENTER_STATION_FILE(DNode *);//录入航班信息
	static bool Tools::EDIT_STATION_FILE(DNode *);//修改航班信息
	static bool Tools::FIND_ALL_CUSTOMER_DATA(DCustom *);//输出所有用户信息

	
};

/******************************
* 版权所有 (C)2017 YuSong。
* 
* 文件名称:dlinklist.template
* 文件标识:无
* 内容摘要:使用了函数模板的函数定义
* 其他说明:无
* 当前版本:V1.0
* 作    者:于嵩
* 完成日期:2017/12/22
******************************/

/***********************
* 功能描述:头插法建双链表
* 输入参数:T类型变量,B类型变量,int类型变量
* 输出参数:无
* 返回值:无
***********************/
template <typename T, class B>
void CreateListF(T *&L, B a[], int n)
//头插法建双链表
{
	T *s;
	int i;
	L = (T *)malloc(sizeof(T));   //创建头结点
	L->prior = L->next = NULL;
	for (i = 0; i<n; i++)
	{
		s = (T *)malloc(sizeof(T));//创建新结点
		s->data = a[i];
		s->next = L->next;            //将*s插在原开始结点之前,头结点之后
		if (L->next != NULL) L->next->prior = s;
		L->next = s;
		s->prior = L;
	}
}

/***********************
* 功能描述:尾插法建双链表
* 输入参数:T类型变量,B类型变量,int类型变量
* 输出参数:无
* 返回值:无
***********************/
template <typename T, class B>
void CreateListR(T *&L, B a[], int n)
//尾插法建双链表
{
	
	T *s, *r;
	int i;
	L = (T *)malloc(sizeof(T));   //创建头结点
	L->prior = L->next = NULL;
	r = L;                    //r始终指向终端结点,开始时指向头结点
	for (i = 0; i<n; i++)
	{
		s = (T *)malloc(sizeof(T));//创建新结点
		s->data = a[i];
		r->next = s;
		s->prior = r; //将*s插入*r之后
		r = s;
	}
	r->next = NULL;           //终端结点next域置为NULL
	
}

/***********************
* 功能描述:创建头节点
* 输入参数:T类型变量
* 输出参数:无
* 返回值:无
***********************/
template <typename T>
void InitList(T *&L)
{
	L = (T *)malloc(sizeof(T));   
	L->prior = L->next = NULL;
}
template <typename T>
void DestroyList(T *&L)
{
	T *p = L, *q = p->next;
	while (q != NULL)
	{
		free(p);
		p = q;
		q = p->next;
	}
	free(p);
}

/***********************
* 功能描述:判断链表是否为空
* 输入参数:T类型变量
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
template <typename T>
bool ListEmpty(T *L)
{
	return(L->next == NULL);
}
template <typename T>
int ListLength(T *L)
{
	T *p = L;
	int i = 0;
	while (p->next != NULL)
	{
		i++;
		p = p->next;
	}
	return(i);
}

/***********************
* 功能描述:输出链表元素
* 输入参数:T类型变量,int类型变量
* 输出参数:无
* 返回值:无
***********************/
template <typename T>
void DispList(T *L, int k)
{
	T *p = L->next;
	if(k==1)
	cout<< setw(14) << "机次编号" << setw(14) << "终点站" << setw(14) << "航班号" << setw(14) << "飞机号" << setw(14) << "飞行日期" << setw(14) << "乘员定额" << setw(14) << "余票额\n";
	else if(k==2)
	cout << setw(14) << "选择机次" << setw(14) << "姓名" << setw(14) << "性别" << setw(20) << "手机号码" << setw(20) << "身份证号码\n";

	while (p != NULL)
	{
		cout << p->data;
		p = p->next;
	}
	printf("\n");
}

/***********************
* 功能描述:从链表中获取元素
* 输入参数:T类型变量,B类型变量,int类型变量
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
template <typename T, class B>
bool GetElem(T *L, int i, B *&e)
{
	
	T *p = L;
	p=L->next;
	while (p->data.num!=i && p!=NULL)
	{
		p = p->next;
	}
	if (p == NULL)
		return false;
	else
	{
		e=&(p->data);
		return true;
	}
}

/***********************
* 功能描述:定位链表元素
* 输入参数:T类型变量,B类型变量
* 输出参数:无
* 返回值:int类型变量
***********************/
template <typename T, class B>
int LocateElem(T *L, B e)
{
	int n = 1;
	T *p = L->next;
	while (p != NULL && p->data != e)
	{
		n++;
		p = p->next;
	}
	if (p == NULL)
		return(0);
	else
		return(n);
}

/***********************
* 功能描述:插入链表元素
* 输入参数:T类型变量,B类型变量,int类型变量
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
template <typename T, class B>
bool ListInsert(T *&L, int i, B e)
{
	int j = 0;
	T *p = L, *s;
	while (j<i - 1 && p != NULL)
	{
		j++;
		p = p->next;
	}
	if (p == NULL)    //未找到第i-1个结点
		return false;
	else            //找到第i-1个结点*p
	{
		s = (T *)malloc(sizeof(T));   //创建新结点*s
		s->data = e;
		s->next = p->next;        //将*s插入到*p之后
		if (p->next != NULL) p->next->prior = s;
		s->prior = p;
		p->next = s;
		return true;
	}
}

/***********************
* 功能描述:链表节点删除
* 输入参数:T类型变量,int类型变量
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
template <typename T>
bool ListDelete(T *&L, int i)
{
	T *p = L, *q;
	while (p->next != NULL && p->next->data.num!=i)
	{
		
		p = p->next;
	}
	if (p == NULL)                //未找到第i-1个结点
		return false;
	else                        //找到第i-1个结点*p
	{
		q = p->next;              //q指向要删除的结点
		if (q == NULL)
			return false;       //不存在第i个结点
		p->next = q->next;        //从单链表中删除*q结点
		if (p->next != NULL) p->next->prior = p;
		free(q);                //释放*q结点
		return true;
	}
}

/***********************
* 功能描述:判断元素是否在链表中并返回地址
* 输入参数:T类型变量,B类型变量
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
template <typename T, class B>
bool JudgeExist(T *&L,B *&e,B *&s)
{
	T *p=L;
	p=L->next;
	while(p!=NULL)
	{
		if(!(strcmp(p->data.name,e->name) || strcmp(p->data.phonenumber,e->phonenumber) || strcmp(p->data.idcard,e->idcard)))
			{
				s=&(p->data);
				return true;
			}
			p=p->next;
	}
	if(p==NULL)
		return false;

}

/***********************
* 功能描述:两链表通过数据建立联系并返回地址
* 输入参数:T类型变量,B类型变量
* 输出参数:无
* 返回值:Darray *类型变量
***********************/
template <typename T, class B>
Darray * FindStation(T *&L, B *e)
{
	T *p=L;
	p=L->next;
	while(p!=NULL)
	{
		if(p->data.num==e->num)
		return &(p->data);
		p=p->next;
	}
	if(p==NULL)
		return false;
}



/******************************
* 版权所有 (C)2017 YuSong。
*
* 文件名称:dlinklist.cpp
* 文件标识:无
* 内容摘要:运算符重载函数定义
* 其他说明:无
* 当前版本:V1.0
* 作    者:于嵩
* 完成日期:2017/12/22
******************************/

# include <stdio.h>
# include <malloc.h>
# include <iostream>
# include <iomanip>
# include "dlinklist.h"
using namespace std;

/***********************
* 功能描述:重载赋值运算符,使之能匹配自定义数据类型的赋值操作。
* 输入参数:Darray类型的变量,引用方式传入。
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
bool DNode::operator= (Darray &e)
{
	strcpy(DNode::data.airline_number, e.airline_number);//将结构体数组元素整体赋值给链表节点元素
	strcpy(DNode::data.flight_number, e.flight_number);
	strcpy(DNode::data.flight_date, e.flight_date);
	strcpy(DNode::data.terminal_name, e.terminal_name);
	DNode::data.num = e.num;
	DNode::data.left_tickets = e.left_tickets;
	DNode::data.crew_quota = e.crew_quota;
	return true;

}
/***********************
* 功能描述:重载!=运算符,使之能匹配自定义数据类型的赋值操作。
* 输入参数:Darray类型的两个变量,引用方式传入。
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
bool operator!= (Darray &t,Darray &e)
{
	if (t.num == e.num)
		return true;
	else 
		return false;
}
/***********************
* 功能描述:重载流插入运算符,使之能匹配自定义数据类型的输出操作。
* 输入参数:ostream类型变量,Darray类型变量,引用方式传入。
* 输出参数:无
* 返回值:output
***********************/
ostream & operator << (ostream &output, Darray &t)
{
	output << setw(14) << t.num << setw(14) << t.terminal_name << setw(14) << t.airline_number << setw(14) << t.flight_number << setw(14) << t.flight_date << setw(14) << t.crew_quota << setw(14) << t.left_tickets << endl;
	return output;
}
/***********************
* 功能描述:重载赋值运算符,使之能匹配自定义数据类型的赋值操作。
* 输入参数:Custom类型的变量,引用方式传入。
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
bool DCustom::operator= (Custom &e)
{
	strcpy(DCustom::data.idcard, e.idcard);//将结构体数组元素整体赋值给链表节点元素
	strcpy(DCustom::data.name, e.name);
	strcpy(DCustom::data.phonenumber, e.phonenumber);
	strcpy(DCustom::data.sex, e.sex);
	DCustom::data.num = e.num;
	return true;
}
/***********************
* 功能描述:重载!=运算符,使之能匹配自定义数据类型的赋值操作。
* 输入参数:Custom类型的变量,引用方式传入。
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
bool operator!= (Custom &t, Custom &e)
{
	if (!(strcmp(t.phonenumber,e.phonenumber) || strcmp(t.idcard,e.idcard) || strcmp(t.name,e.name)))
		return true;
	else
		return false;
}
/***********************
* 功能描述:重载流插入运算符,使之能匹配自定义数据类型的输出操作。
* 输入参数:ostream类型变量,Custom类型变量,引用方式传入。
* 输出参数:无
* 返回值:output
***********************/
ostream & operator << (ostream &output, Custom &t)
{
	output << setw(14) << t.num << setw(14) << t.name << setw(14) << t.sex << setw(20) << t.phonenumber << setw(20) << t.idcard<< endl;
	return output;
}



/******************************
* 版权所有 (C)2017 YuSong。
*
* 文件名称:SystemTools.cpp
* 文件标识:无
* 内容摘要:用户类声明及功能函数定义
* 其他说明:无
* 当前版本:V1.0
* 作    者:于嵩
* 完成日期:2017/12/22
******************************/

# include <iostream>
# include <fstream>
# include <iomanip>
# include <time.h>
# include <windows.h>
# include "dlinklist.h"
# include "SystemTools.h"
# include "dlinklist.template"
using namespace std;

/***********************
* 功能描述:从文件中读入航班数据进内存。
* 输入参数:int型变量
* 输出参数:无
* 返回值:Darray *类型变量
***********************/
Darray * Tools::INPUT_FILE_STATIONDATA(int &i)
{
	Darray p[300]; //定义一个临时存放数据的数组
	ifstream infile("file.txt", ios::in);
	if (!infile)
	{
		cerr << "open file error!\n";
		
	}
	while (infile)
	{
		infile >> p[i].num >> p[i].terminal_name >> p[i].airline_number >> p[i].flight_number >> p[i].flight_date >> p[i].crew_quota >> p[i].left_tickets;
		i++;
	}
	infile.close();
	return p;

}

/***********************
* 功能描述:从文件中读入用户数据进内存。
* 输入参数:int型变量
* 输出参数:无
* 返回值:Custom *类型变量
***********************/
Custom * Tools::INPUT_FILE_CUSTOMDATA(int &i)
{
	Custom p[300]; //定义一个临时存放数据的数组
	ifstream infile("custom file.txt", ios::in);
	if (!infile)
	{
		cerr << "open file error!\n";

	}
	while (infile)
	{
		infile  >> p[i].num >> p[i].name >> p[i].sex >> p[i].phonenumber >> p[i].idcard;
		i++;
	}
	infile.close();
	return p;

}

/***********************
* 功能描述:从内存中写出用户数据到文件
* 输入参数:DCustom *类型变量
* 输出参数:output
* 返回值:无
***********************/
void Tools::OUTPUT_FILE_CUSTOMDATA(DCustom * L)
{
	ofstream outfile("custom file.txt", ios::out);
	DCustom *p = L->next;
	while (p != NULL)
	{
		outfile << p->data;
		p = p->next;
	}
	printf("\n");
}

/***********************
* 功能描述:从内存中写出航班数据到文件
* 输入参数:DNode *类型变量
* 输出参数:output
* 返回值:无
***********************/
void Tools::OUTPUT_FILE_STATIONDATA(DNode * L)
{
	ofstream outfile("file.txt", ios::out);
	DNode *p = L->next;
	while (p != NULL)
	{
		outfile << p->data;
		p = p->next;
	}
	printf("\n");
}

/***********************
* 功能描述:显示交互界面
* 输入参数:DNode *类型变量,DCustom *类型变量
* 输出参数:无
* 返回值:无
***********************/
void Tools::DISPLAY(DNode *L,DCustom *P)
{
	while (1)
	{
		putchar('\n');
		putchar('\n');
		cout << "\t\t\t           ¥·¥" << endl;
		cout << "\t  ¥·¥·¥·¥·¥··航空订票系统··¥·¥·¥·¥·¥" << endl;
		putchar('\n');
		time_t timep;
		time(&timep);//显示当前时间,库函数
		cout << "\t\t   当前时间:" << ctime(&timep);
		putchar('\n');
		cout << "\t-----------------0.查询航线";
		cout << " \t1.订票预约------------------" << endl;
		putchar('\n');
		cout << "\t-----------------2.退票改签";
		cout << " \t3.查询信息------------------" << endl;
		putchar('\n');
		cout << "\t-----------------4.录入航线";
		cout << " \t5.航线修改------------------" << endl;
		putchar('\n');
		cout << "\t-----------------6.查询全部";
		cout << " \t7.退出系统------------------" << endl;
		putchar('\n');

		int k;	
		cout << "····请选择功能序号:";
		cin >> k;
		putchar('\n');
		putchar('\n');
		switch (k)
		{
		case 0: Tools::CHECK_ROUTE(L); break;//输出所有航班信息
		case 1: Tools::BOOKING_TICKETS(L, P); break;//预约订票
		case 2: Tools::REFUND_TICKETS(L, P); break;//退票改签
		case 3: Tools::FIND_CUSTOMERINFORMATION(L, P); break;//查询信息
		case 4: Tools::ENTER_STATION_FILE(L); break;//增加航班
		case 5: Tools::EDIT_STATION_FILE(L); break;//修改航班
		case 6: Tools::FIND_ALL_CUSTOMER_DATA(P); break;//查询全部
		case 7: exit(0); 

		}
	}
}

/***********************
* 功能描述:提醒用户等待
* 输入参数:无
* 输出参数:无
* 返回值:无
***********************/
void Tools::WAITING()
{
	putchar('\n');
	char str[20] = "正在处理,请稍后";
	cout << "····"<<str;
	int count;
	for (count = 0; count < 5; count++)
	{
		Sleep(200);
		cout << '.';
	}

}

/***********************
* 功能描述:输出所有航班信息
* 输入参数:DNode *类型变量
* 输出参数:DispList函数
* 返回值:无
***********************/
void Tools::CHECK_ROUTE(DNode *p)
{

	putchar('\n');
	cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~·您正在使用查询航线功能·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
	putchar('\n');
	Tools::WAITING();
	putchar('\n');
	putchar('\n');
	cout << "····当前可用航线:"<<endl;
	putchar('\n');
	Sleep(1000);
	DispList(p,1);//执行输出链表函数
	putchar('\n');
	system("pause");


}

/***********************
* 功能描述:输入客户信息后执行订票操作
* 输入参数:DNode *类型变量,DCustom *类型变量
* 输出参数:无
* 返回值:无
***********************/
void Tools::BOOKING_TICKETS(DNode *p, DCustom *l)
{
	putchar('\n');
	cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~·您正在使用订票预约功能·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
	putchar('\n');
	Custom t;
	cout << "····您需要输入您的详细信息。" << endl;
	putchar('\n');
	cout << "····请输入您的姓名:";
	cin >> t.name;
	putchar('\n');
	putchar('\n');
	cout << "····请输入您的性别:";
	cin >> t.sex;
	putchar('\n');
	putchar('\n');
	cout << "····请输入您的联系方式:";
	cin >> t.phonenumber;
	putchar('\n');
	putchar('\n');
	cout << "····请输入您的有效证件号码:";
	cin >> t.idcard;
	putchar('\n');
	putchar('\n');
	cout << "····信息录入完毕。" << endl;
	Tools::WAITING();
	putchar('\n');
	putchar('\n');
	cout << "····您是否需要过目所有以开放航线?(y/n)";
	char choice;
	cin >> choice;
	if (choice == 'y')
		Tools::CHECK_ROUTE(p);//执行输出航线函数
	else
		putchar('\n');
	bool iswrong = true;
	bool iswrong2 = true;
	while (iswrong2)
	{
		while (iswrong)
		{
			putchar('\n');
			cout << "····请输入您要选择乘坐的航线编号:";
			cin >> t.num;
			putchar('\n');
			putchar('\n');
			cout << "····确认选择?(y/n)";
			cin >> choice;
			if (choice == 'y')
				iswrong = false;
		}
		putchar('\n');
		Darray *e;
		e = FindStation(p, &t);//通过航线编号来调用函数,返回与航线编号对应的节点地址
		if (e->left_tickets == 0)
		{
			putchar('\n');
			putchar('\n');
			cout << "····该航班票已售空,请重新选择!" << endl;
			putchar('\n');
			iswrong = true;
		}
		else
		{
			e->left_tickets--;
			iswrong2 = false;
		}
	}
	ListInsert(l, ListLength(l)+1, t);//执行修改和插入操作

	Tools::WAITING();
	Tools::OUTPUT_FILE_CUSTOMDATA(l);//写出用户信息
	Tools::OUTPUT_FILE_STATIONDATA(p);//写出航线信息
	putchar('\n');
	putchar('\n');
	cout << "····订票预约成功完成。您前面还有排队预约客户" <<ListLength(l)-1<<"名。"<< endl;
	putchar('\n');
	system("pause");
	
}

/***********************
* 功能描述:输入客户信息以后执行退票改签操作
* 输入参数:DNode *类型变量,DCustom *类型变量
* 输出参数:无
* 返回值:无
***********************/
bool Tools::REFUND_TICKETS(DNode *p, DCustom *l)
{
	putchar('\n');
	cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~·您正在使用退票改签功能·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
	putchar('\n');
	cout << "····请确认您已在本系统预约过票务:(y/n)";
	char choice;
	cin >> choice;
	if (choice == 'n')
		return false;
	putchar('\n');
	putchar('\n');
	cout << "····请输入您的预留信息。" << endl;
	putchar('\n');
	bool istrue1 = true;
	bool istrue2 = true;
	Custom *t = new Custom;
	Custom *s = new Custom;
	while (istrue1)//判断输入是否有误循环体
	{
		
			cout << "····请输入您的姓名:";
			cin >> t->name;
			putchar('\n');
			putchar('\n');
			cout << "····请输入您的手机号码:";
			cin >> t->phonenumber;
			putchar('\n');
			putchar('\n');
			cout << "····请输入您的有效证件号码:";
			cin >> t->idcard;
			putchar('\n');
			putchar('\n');
			if (JudgeExist(l, t, s))
			{
				istrue1 = false;

			}
			else
			{
				cout << "····您的输入有误,请重新输入!" << endl;
				putchar('\n');
			}
		
		
	}
	cout << "····请选择:1.退票 2.改签";
	cin >> choice;
	putchar('\n');
	putchar('\n');
	if (choice == '1')
	{
		Darray* x = new Darray;
		x=FindStation(p, s);
		Tools::WAITING();
		cout << "····您当前预定票务:" << endl;
		putchar('\n');
		cout << setw(14) << "机次编号" << setw(14) << "终点站" << setw(14) << "航班号" << setw(14) << "飞机号" << setw(14) << "飞行日期" << setw(14) << "乘员定额" << setw(14) << "余票额\n";
		cout << *x;
		putchar('\n');
		putchar('\n');
		cout << "····确定要退票吗?(y/n)";
		char y;
		cin >> y;
		if (y == 'y')
		{
			ListDelete(l, s->num);
			x->left_tickets++;
			Tools::WAITING();
			Tools::OUTPUT_FILE_CUSTOMDATA(l);//写出用户信息
			putchar('\n');
			putchar('\n');
			cout << "····您的预约已取消。" << endl;
		}
		else
			return false;
		
	}
	else if (choice == '2')
	{
		Darray* x = new Darray;
		x = FindStation(p, s);
		Tools::WAITING();
		cout << "····您当前预定票务:" << endl;
		putchar('\n');
		cout << setw(14) << "机次编号" << setw(14) << "终点站" << setw(14) << "航班号" << setw(14) << "飞机号" << setw(14) << "飞行日期" << setw(14) << "乘员定额" << setw(14) << "余票额\n";
		cout << *x;
		putchar('\n');
		putchar('\n');
		cout << "····确定要改签吗?(y/n)";
		char y;
		cin >> y;
		if (y == 'y')
		{
			x->left_tickets++;
			putchar('\n');
			Tools::WAITING();
			putchar('\n');
			putchar('\n');
			Tools::CHECK_ROUTE(p);//执行输出航线函数
			putchar('\n');
			putchar('\n');
			Darray *e;
			bool istrue = true;
			while (istrue)
			{
				cout << "····请输入您要选择的航线编号:";
				int num_choice;
				cin >> num_choice;
				putchar('\n');
				putchar('\n');
				Tools::WAITING();
				putchar('\n');
				s->num = num_choice;
				e = FindStation(p, s);
				if (e->left_tickets == 0)
				{
					putchar('\n');
					putchar('\n');
					cout << "····该航班票已售空,请重新选择!" << endl;
					putchar('\n');
					putchar('\n');
				}
				else
					istrue = false;
			}
			e->left_tickets--;
			Tools::OUTPUT_FILE_CUSTOMDATA(l);//写出用户信息
			Tools::OUTPUT_FILE_STATIONDATA(p);//写出航线信息
			putchar('\n');
			putchar('\n');
			cout << "····改签操作成功完成。" << endl;
			putchar('\n');
			system("pause");

		}
		

		}
		else
			return false;

	}

/***********************
* 功能描述:输入客户信息以后执行查询操作
* 输入参数:DNode *类型变量,DCustom *类型变量
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
bool Tools::FIND_CUSTOMERINFORMATION(DNode *p, DCustom *l)
{
	putchar('\n');
	cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~·您正在使用查询信息功能·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
	putchar('\n');
	cout << "····请确认您已在本系统预约过票务:(y/n)";
	char choice;
	cin >> choice;
	if (choice == 'n')
		return false;
	putchar('\n');
	putchar('\n');
	cout << "····请输入您的预留信息。" << endl;
	putchar('\n');
	bool istrue1 = true;
	bool istrue2 = true;
	Custom *t = new Custom;
	Custom *s = new Custom;
	while (istrue1)
	{

		cout << "····请输入您的姓名:";
		cin >> t->name;
		putchar('\n');
		putchar('\n');
		cout << "····请输入您的手机号码:";
		cin >> t->phonenumber;
		putchar('\n');
		putchar('\n');
		cout << "····请输入您的有效证件号码:";
		cin >> t->idcard;
		putchar('\n');
		putchar('\n');
		if (JudgeExist(l, t, s))
		{
			istrue1 = false;

		}
		else
		{
			cout << "····您的输入有误,请重新输入!" << endl;
			putchar('\n');
		}
	}
		Tools::WAITING();
		Darray *x = new Darray;
		x = FindStation(p, s);
		putchar('\n');
		putchar('\n');
		cout << "····您当前预定票务:" << endl;
		putchar('\n');
		cout << setw(14) << "机次编号" << setw(14) << "终点站" << setw(14) << "航班号" << setw(14) << "飞机号" << setw(14) << "飞行日期" << setw(14) << "乘员定额" << setw(14) << "余票额\n";
		cout << *x;
		system("pause");


	
}

/***********************
* 功能描述:确认权限后执行写入航班信息操作
* 输入参数:DNode *类型变量
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
bool Tools::ENTER_STATION_FILE(DNode *p)
{
	putchar('\n');
	cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~·您正在使用增加航线功能·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
	putchar('\n');
	cout << "····系统需要确认您的最高访问权限。" << endl;
	putchar('\n');
	cout << "····请输入系统管理员用户名:";
	char name[20];
	cin >> name;
	if (!strcmp(name, "Administrator"))
	{
		putchar('\n');
		putchar('\n');
	}
	else
	{
		putchar('\n');
		cout << "····您没有权限!" << endl;
		putchar('\n');
		system("pause");
		return false;
	}
	cout << "····请输入管理员密钥:";
	char password[20];
	cin >> password;
	if (!strcmp(password, "admin"))
	{
		putchar('\n');
		putchar('\n');
	}
	else
	{
		putchar('\n');
		putchar('\n');
		cout << "····输入密钥有误!" << endl;
		putchar('\n');
		return false;
	}
	Darray e;
	cout << "····请输入要增加的航站名称:";
	cin >> e.terminal_name;
	putchar('\n');
	putchar('\n');
	cout << "····请输入航班号:";
	cin >> e.airline_number;
	putchar('\n');
	putchar('\n');
	cout << "····请输入飞机号:";
	cin >> e.flight_number;
	putchar('\n');
	putchar('\n');
	cout << "····请输入日期:";
	cin >> e.flight_date;
	putchar('\n');
	putchar('\n');
	cout << "····请输入成员定额:";
	cin >> e.crew_quota;
	putchar('\n');
	putchar('\n');
	e.left_tickets = e.crew_quota;
	e.num = ListLength(p) + 1;
	ListInsert(p, e.num, e);//执行插入函数
	Tools::WAITING();
	putchar('\n');
	putchar('\n');
	cout << "····信息成功写入。" << endl;
	putchar('\n');
	Tools::OUTPUT_FILE_STATIONDATA(p);//写出航线信息
	return true;
}

/***********************
* 功能描述:确认权限以后执行编辑航班信息操作
* 输入参数:DNode *类型变量
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
bool Tools::EDIT_STATION_FILE(DNode *p)
{
	putchar('\n');
	cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~·您正在使用航线修改功能·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
	putchar('\n');
	cout << "····请输入系统管理员用户名:";
	char name[20];
	cin >> name;
	if (!strcmp(name, "Administrator"))
	{
		putchar('\n');
		putchar('\n');
	}
	else
	{
		putchar('\n');
		cout << "····您没有权限!" << endl;
		putchar('\n');
		system("pause");
		return false;
	}
	cout << "····请输入管理员密钥:";
	char password[20];
	cin >> password;
	if (!strcmp(password, "admin"))
	{
		putchar('\n');
		putchar('\n');
	}
	else
	{
		putchar('\n');
		putchar('\n');
		cout << "····输入密钥有误!" << endl;
		putchar('\n');
		return false;
	}

	Tools::CHECK_ROUTE(p);
	putchar('\n');
	putchar('\n');
	cout << "····请输入您要修改的航线编号:";
	Darray *e = new Darray;
	cin >> e->num;
	e=FindStation(p, e);
	putchar('\n');
	cout << setw(14) << "机次编号" << setw(14) << "终点站" << setw(14) << "航班号" << setw(14) << "飞机号" << setw(14) << "飞行日期" << setw(14) << "乘员定额" << setw(14) << "余票额\n";
	cout << *e;
	putchar('\n');
	putchar('\n');
	cout << "····请输入新的航班号:";
	cin >> e->airline_number;
	putchar('\n');
	putchar('\n');
	cout << "····请输入新的飞机号:";
	cin >> e->flight_number;
	putchar('\n');
	putchar('\n');
	cout << "····请输入日期:";
	cin >> e->flight_date;
	putchar('\n');
	putchar('\n');
	cout << "····请输入成员定额:";
	cin >> e->crew_quota;
	putchar('\n');
	putchar('\n');
	cout << "····请输入余票额:";
	cin >> e->left_tickets;
	putchar('\n');
	putchar('\n');
	Tools::WAITING();
	Tools::OUTPUT_FILE_STATIONDATA(p);//写出航线函数
	putchar('\n');
	putchar('\n');
	cout << "····信息已成功修改。" << endl;
	putchar('\n');
	system("pause");
	return true;

}

/***********************
* 功能描述:确认权限以后执行查询全部用户信息操作
* 输入参数:DCustom *类型变量
* 输出参数:无
* 返回值:0-失败,1-成功
***********************/
bool Tools::FIND_ALL_CUSTOMER_DATA(DCustom *p)
{
	putchar('\n');
	cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~·您正在使用查询信息功能·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
	putchar('\n');
	cout << "····系统需要确认您的最高访问权限。" << endl;
	putchar('\n');
	cout << "····请输入系统管理员用户名:";
	char name[20];
	cin >> name;
	if (!strcmp(name, "Administrator"))
	{
		putchar('\n');
		putchar('\n');
	}
	else
	{
		putchar('\n');
		cout << "····您没有权限!" << endl;
		putchar('\n');
		system("pause");
		return false;
	}
	cout << "····请输入管理员密钥:";
	char password[20];
	cin >> password;
	if (!strcmp(password, "admin"))
	{
		putchar('\n');
		putchar('\n');
	}
	else
	{
		putchar('\n');
		putchar('\n');
		cout << "····输入密钥有误!" << endl;
		putchar('\n');
		return false;
	}
	cout << "····系统将输出所有订票用户名单。" << endl;
	putchar('\n');
	Tools::WAITING();
	putchar('\n');
	putchar('\n');
	cout << setw(14) << "航班号" << setw(14) << "姓名" << setw(14) << "性别" << setw(20) << "手机号码" << setw(20) << "有效证件号码" << endl;
	putchar('\n');
	DispList(p, ListLength(p));
	putchar('\n');
	system("pause");

}



		



/******************************
* 版权所有 (C)2017 YuSong。
*
* 文件名称:main.cpp
* 文件标识:无
* 内容摘要:主函数
* 其他说明:无
* 当前版本:V1.0
* 作    者:于嵩
* 完成日期:2017/12/22
******************************/

# include <iostream>
# include "dlinklist.h"
# include "SystemTools.h"
# include "dlinklist.template"
using namespace std;
int main()
{
	int i = 0;
	Darray *L=new Darray;
	L=Tools::INPUT_FILE_STATIONDATA(i);//将计数变量作为参数,从文件中读取航站信息,更改计数变量并返回头节点
	DNode *P=new DNode;
	CreateListR(P, L, i-1);//建立了航站信息双向链表
	int j = 0;
	Custom *L1 = new Custom;
	L1 = Tools::INPUT_FILE_CUSTOMDATA(j);//将计数变量作为参数,从文件中读取用户信息,更改计数变量并返回头节点
	DCustom *P1 = new DCustom;
	CreateListR(P1, L1, j - 1);//建立了用户信息双向链表
	Tools::DISPLAY(P,P1);//将两个链表头指针作为参数,执行用户交互函数
	system("pause");
	return 0;
}

运行界面:




评论 1 您还未登录,请先 登录 后发表或查看评论
问题描述:航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。 设计任务:通过此系统可以实现如下功能: 录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定) 查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额; 订票:(订票情况可以存在一个数据文件中,结构自己设定)根据客户提出的要求(日期、航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需要重新询问客户要求。若需要,可预约登记排队等候。如果该航班已经无票,可以提供相关可选择航班; 退票:根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户……退票成功后修改相关数据文件。 客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。 修改航班信息:当航班信息改变可以修改航班数据文件 要求:根据以上功能说明,设计航班信息,订票信息的存储结构设计程序完成功能。 测试数据:由学生任意指定,但报告上要求写出多批数据测试结果。 实现提示:每条航线应包含的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包括姓名、订票额、座位号)和预约登记的客户名单(包括日期、姓名、所需票额)。这最后两项显然是一个线性表和一个队列。为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预料,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

re_surmount

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值