要求
使用线性开型寻址实现
描述
给定散列函数的除数D和操作数m,输出每次操作后的状态。
有以下三种操作:
插入x,若散列表已存在x,输出“Existed”,否则插入x到散列表中,输出所在的下标。
查询x,若散列表不含有x,输出“-1”,否则输出x对应下标。
删除x,若散列表不含有x,输出“Not Found”,否则输出删除x过程中移动元素的个数。
格式
输入格式
第一行两个整数D,m。分别代表散列函数的除数D和操作数m。
接下来m行,每行两个整数opt和x,分别代表操作类型和操作数。
若opt为0,代表插入x。
若opt为1,代表查询x。
若opt为2,代表删除x。
#include<iostream>
using namespace std;
int num=0; //用来记录装了多少个
class hashtable
{
public:
hashtable(int);
~hashtable();
void insert(int );
void find(int);
void delete1(int);
void output();
int hsearch(int k);
private:
int* table;
int D;
};
//输出
void hashtable::output ()
{
for(int i=0;i<D;i++)
{
cout<<"a["<<i<<"]="<<table[i]<<endl;
}
}
//构造
hashtable::hashtable(int a)
{
D=a;
table = new int[D];
for(int i=0;i<D;i++)
{
table[i]=-1;
}
}
//析构
hashtable::~hashtable()
{
delete table;
}
//插入
void hashtable::insert(int e)
{
int k=e;
int b=hsearch(k);
if(table[b]==-1){
table[b]=e;
cout<<b<<endl;
}
else
{
cout<<"Existed"<<endl;
}
}
//查询
void hashtable::find(int k)
{
int b=hsearch(k);
if(table[b]==-1||table[b]!=k)
{
cout<<-1<<endl;
}
else
cout<<b<<endl;
}
//查找k在表中位置
int hashtable::hsearch(int k)
{
int i=k%D;
int j=i;
do{
if(table[j]==-1||table[j]==k) return j;
j=(j+1)%D;
}while(j!=i);
return j;
}
//删除
void hashtable::delete1(int e)
{
int k=e;
int b=hsearch(e); //e的起始桶
int count=0;
if(table[b]==-1) //如果起始同为空
{
cout<<"Not Found"<<endl;
}
else if(table[b]==k) //如果要删除的元素在它起始桶
{
table[b]=-1;
int i=b;
int z=b;
int x;
do{
i=(i+1)%D; //起始桶下一个元素
if(table[i]==-1) //如果为空
{
break;
}
x=table[i]%D; //起始桶下一个元素 的起始桶
if(i!=x&&x<=z&&i>z){ //起始桶下一个元素不等于x,
table[z]=table[i];
table[i]=-1;
// cout<<"把索引 "<<i<<" 覆盖 "<<z;
count++;
z = i;
}
else if((i!=x&&i<x&&z<i)||(i!=x&&i<x&&z>=x))
{
table[z]=table[i];
table[i]=-1;
// cout<<"把索引 "<<i<<" 覆盖 "<<z;
count++;
z=i;
}
}while(table[i+1]!=-1&&(i+1)!=b);
cout<<count<<endl;
}
}
int main()
{
int D,m;
int cho,x;
cin>>D>>m;
hashtable p(D);
for(int i=0;i<m;i++)
{
cin>>cho>>x;
switch (cho){
case 0:{
p.insert(x);
break;
}
case 1:{
p.find(x);
break;
}
case 2:{
p.delete1(x);
break;
}
default:{
break;
}
}
}
}