实验八第2题 散列表

要求

使用线性开型寻址实现

描述

给定散列函数的除数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;
   }
  }
 }
 
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值