210牛逼!!
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<malloc.h>
#define NONE 0
#define PUSHED 1
#define DEL -1
using namespace std;
typedef int Status;
class airline;
class client;
struct Hash_Node {
//存在于每个 airline 元素中,key值可以不存进txt,但必须要定义计算key值的函数
/*哈希表结点模板--针对不同情景建立不同的哈希表*/
Status ANS = NONE; //节点状态 PUSHED /NONE /DEL
int key; //每个节点的函数结果(哈希值) 不需要初始化
airline* nearby = NULL; //每个节点对应的 具有相同Hash值的 邻近的下一个airline节点
int times = 0; //被计算的key的权值(倍数)
/*public:
Hash_Node()
{
nearby = NULL;
times=0;
}*/
};
struct CHash_Node {
//存在于每个 client 元素中,key值可以不存进txt,但必须要定义计算key值的函数
/*哈希表结点模板--针对不同情景建立不同的哈希表*/
Status ANS = NONE; //节点状态 PUSHED /NONE /DEL
int key; //每个节点的函数结果(哈希值) 不需要初始化
client* nearby = NULL; //每个节点对应的 具有相同Hash值的 邻近的下一个client节点
};
struct client
{
/*客户*/
char name[20]; /*姓名*/ //Hash
int ordering_number; /*订票量*/
int grade; /*舱位等级*/
/*缺少联系方式 变量*/ /*可以创新发展 手机 的方式*/
char cellphone[12]; /* 新添-- 联系方式--手机号码*/
char id_number[19]; /* 新添-- 身份证号*/
client *next; /*用了链表存储结构保存client*/
CHash_Node node; /* client类的Hash节点 */
public:
void get_key(); /*Hash节点的key值计算--姓名*/
};
void client::get_key()
{
//client类 姓名--key值计算
/*字符串哈希实现*/
}
class airline
{
/*航班信息*/
private:
char end_station[20]; /*终点站名*/ //Hash
char air_num[10]; /*航班号*/ //(可依照排序) //Hash
char plane_num[10]; /*飞机型号*/
string day; /* 更改-- 飞行日期(例如:2020年01月05日)*/ //我觉得可以不Hash
char time[5]; /* 新添-- 飞行时间(例如:17:15)*/
int people_quota; /*乘员定额*/
double price; /*票价*/
int more_ticket; /*余票量*/
char passenger_list[50]; /*客户名单*/
char waiting_list[50]; /*等候替补的客户名单*/
Hash_Node node; /* airline类的Hash节点 */
static int number; /*航班总数*/ //静态常量
public:
void print()
{
/*打印航班信息*/
cout<<" 终点站名:"<<end_station<<"\t 航班号:"<<air_num<<"\t 飞机号:"<<plane_num << "\t 日期:"<<day
<<"\t 时间:"<<time<<"\t 乘员定额:"<<people_quota<<"\t 票价:"<<price<<"\t 余票量:"<<more_ticket<<"\n\n";
}
void get_station_key(); /*Hash节点的key值计算--终点站名*/
void get_num_key(); /*Hash节点的key值计算--航班号*/
friend airline* get_airline(); /*读取文件中的航班信息*/ //定位航班指针的函数
friend void client_list(); //查看某航班乘客名单(管理员操作)
friend void put_airline(airline*); //输出修改后的航班信息
friend void print_airline(); //打印所有航班信息(管理员操作)
friend void search(); //查询操作
friend void booking(); //订票操作 /*这些都是接下来下面的具体函数,只不过这些函数都是airline的友元函数*/
friend void refund(); //退票操作 /*有更高的对其私有成员的访问权限*/
friend client* get_passenger(airline); /* 读取某航班乘客信息/返回某航班乘客的指针 */ // 1
friend client* get_wait(airline); /* 读取某航班等候替补名单 */ // 2
friend void put_passenger(airline,client*);/* 输出乘客信息到文件 */ // 1
friend void put_wait(airline,client*); /* 输出等候替补名单 */ // 2
friend void re_price(); //修改某航班票价(管理员操作)
friend airline* Get_num_Hash_Map(airline* line); //建立Hash表(Hash操作)
// friend void app_airline(); //增加航班(管理员操作)
};
int airline::number=0; /*静态常量类外定义实现*/
char Name[20]=""; /*用于用户登录的姓名,并初始化为空白*/
char Id_number[19] = ""; /*用于用户登录的身份证号码,并初始化为空白*/
char Cellphone[12] = ""; /*用于用户登录的手机号码,并初始化为空白*/
airline *L; /*全局变量,飞机航线头指针*/
airline* Get_num_Hash_Map(airline* line)
{
//建立Hash表
int num = (line->number/3)+1;// (line->number/3)+1 = 7 是哈希函数 的MOD,是个变量
//int num = 7;
airline *numline = (airline*)malloc(num*sizeof(airline)); //建立动态数组
for (int i = 0; i < num; i++)
{
line[i].get_num_key();
if (numline[line[i].node.key].node.ANS == NONE)
{
/*Hash_Map该数组元素未占用,则把元素的指针指向该airline[i]的地址*/
numline[line[i].node.key] = line[i];
numline[line[i].node.key].node.ANS = PUSHED;//改变节点状态值,为其他if判断做条件
}
else if (numline[line[i].node.key].node.ANS == PUSHED)
{
/*Hash_Map该数组元素被占用,则把元素对应的ailine.anode.nearby是NULL的节点的指向该airline[i]的地址*/
/*开辟新的节点(node的内部操作)或者 再取值寻找一个空闲的地址*/
/*我们认为开辟新节点更容易,但是更要求在查找的时候要做好 一一对应 的算法*/
airline* p;//临时指针
p = &numline[line[i].node.key];
while (p)
p = p->node.nearby;
/*line[i]嵌入*/
*p = line[i]; //*p是 p指针指向的nearby ,而p是 p指针指向的nearby 的地址,不能等于line[i],要注意!
}
else if (numline[line[i].node.key].node.ANS == DEL)
{
/*删除复原操作*/
}
}
return numline;
/*Hash_Node* numlist,*p,*q;
p = numlist;
int hashnum = line->number;*/
/*for (int i = 0; i < hashnum; i++)
{//建立纵向链表
q = new Hash_Node;//开辟新空间给下一个节点,并让q指针指向之
p->ANS = PUSHED;//数据元素1 -- 状态
p->key = NULL;//数据元素2 -- hash值
p->nextnode=q;
//Hash操作中,相同的hash值右开辟的条件是if(nearby)
p = p->nextnode;//p移位到下一个节点
}
p = numlist;
p->nearby = NULL;*/
}
void airline::get_station_key()
{
/*Hash节点的key值计算--终点站名*/
/*字符串哈希实现*/
}
void airline::get_num_key()
{
/*Hash节点的key值计算--航班号*/
/*一般常量哈希实现*/
this->node.key = (atoi(this->air_num)-48) % 7; //num Key值计算 // Hash函数 1 //注意atoi()函数的使用!!
this->node.times = (atoi(this->air_num) - 48) / 7; //num node.times (倍数)计算
}
void app_client(client