📄 myhash.cpp
字号:
//基于数组的HASH类,用于存放航班信息
#include"flight.h"
Hash::Hash(char**key, int size,char**key2){ //构造函数,导入关键字表
keysize=size; maxsize=7*keysize;
kt1=key; //目的地关键字表
kt2=key2; //飞行日关键字表
ht=new list_node*[maxsize]; //创建HASH总表,存放不同目的地不同飞行日航班
for(int i=0;i<maxsize;i++)ht[i]=NULL; //初始化HASH表
}
Hash::~Hash(){ //析构函数,释放HASH表内容
for(int i=0;i<maxsize;i++)
for(list_node*temp=ht[i];temp!=NULL;){
ht[i]=ht[i]->next;
delete temp;
temp=ht[i];
}
}
bool Hash::hash_insert(airline&line){ //插入航班信息
int i=line.getDes()*7+line.getDay();
if(i>=maxsize)return false; //目标超出HASH表大小
list_node*elem=new list_node; //创建新节点
elem->next=NULL;
elem->data=new airline(line); //创建节点元素并赋值
if(ht[i]==NULL){ //链表为空,直接插入新元素
ht[i]=elem;
return true;
}
if(ht[i]->data->getHour()>line.getHour()){//在头节点插入元素
elem->next=ht[i];
ht[i]=elem;
return true;
}
list_node*temp=ht[i];
while(temp->next!=NULL&&temp->next->data->getHour()<line.getHour())
temp=temp->next; //查找插入位置
if(temp->next==NULL)temp->next=elem; //在尾节点插入元素
else{ //在链表中插入元素
elem->next=temp->next;
temp->next=elem;
}
return true;
}
bool Hash::hash_search(int key){ //根据目的地查询
if(key*7>=maxsize)return false;
int count=0; //记数变量,记录航班数
for(int i=key*7;i<key*7+7;i++) //查找一周内到该目的地的全部航班
for(list_node*temp=ht[i];temp!=NULL;temp=temp->next){
temp->data->printall(kt1,kt2); //显示航班信息
count++; //存在相关航班时,计数器加一
}
if(count)return true;
else
{cout<<"no flight."<<endl;return false;}
}
bool Hash::hash_search(int key1,int key2){ //根据目的地及飞行日查询
if(key1*7+key2>=maxsize)return false;
if(ht[key1*7+key2]==NULL){cout<<"no flight"<<endl;return false;}
for(list_node*temp=ht[key1*7+key2];temp!=NULL;temp=temp->next)//查找当天出发的全部航班
temp->data->printall(kt1,kt2); //显示航班信息
return true;
}
airline* Hash::hash_find(int key1,int key2,int key3){//根据客户选择返回所需航班
for(list_node*temp=ht[key1*7+key2];temp!=NULL&&temp->data->getplane()!=key3;temp=temp->next);
if(temp==NULL)return NULL;
else return temp->data;
}
bool Hash::hash_remove(int key1,int key2,int key3){//删除指定航班
if(key1*7+key2>=maxsize)return false;
if(ht[key1*7+key2]==NULL){cout<<"no flight"<<endl;return false;}
if(ht[key1*7+key2]->data->getplane()==key3){//当要删除的航班位于头节点时
list_node*temp=ht[key1*7+key2];
ht[key1*7+key2]=temp->next;
delete temp;
cout<<"finished!"<<endl;
return true;
}
for(list_node*temp=ht[key1*7+key2];temp->next!=NULL&&temp->next->data->getplane()!=key3;temp=temp->next);//位于一般节点时
if(temp->next==NULL){cout<<"no flight"<<endl;return false;}//未找到相应航班
else{
list_node*temp2=temp->next;
temp->next=temp2->next;
delete temp2;
cout<<"finished!"<<endl;
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -