---------------hashing .h-------------------

#include<iostream>
#include
<stdlib.h>
using namespace std;
const int DefaultSize=100;
enum KindOfStatus{Active,
Empty,Deleted};  //元素分类(活动//删)
template
<class E,class K>
class HashTable
{
public:

    HashTable(
const int d,int sz=DefaultSize);
    ~HashTable(){delete []ht;delete []info;}
    bool Insert(
const E &e1);  //在散列表中插入e1
    bool Remove(
const K k1); //在散列表中删除
    E Search(
const K k1,E& e1)const;//在散列表搜索k1
    void makeEmpty();       
//置散列表为空
private:
    
int divitor;          //散列表的除数
    
int CurrentSize,TableSize;  //当前桶数及最大桶数
    E 
*ht;                     //散列表存储数组
    KindOfStatus 
*info;        //状态数组
    
int FindPos(const K k1)const//散列函数,计算初始桶号

};

---------------hashing.cpp----------------------------
#include"hashing.h"
template
<class E,class K>
HashTable
<E,K>::HashTable(const int d,int sz)
{
    divitor
=d;
    TableSize
=sz;
    CurrentSize
=0;
    ht
=new E[TableSize];
    info
=new KindOfStatus[TableSize];
    
for(int i=0;i<TableSize;i++)
        info[i]
=Empty;
};

template
<class E,class K>
int HashTable<E,K>::FindPos(const K k1)const
{
    
int i=k1%divitor;//计算初始桶号
    
int j=i;       //检测下一空桶下标
    
do
    {    
        
if(info[j]==Empty||info[j]==Active&&ht[j]==k1)    return j;   //找到
        j
=(j+1)%TableSize;            //当做循环表处理,找下一个空桶
    }
while(j!=i);
    return j;
};

template
<class E,class K>
bool HashTable
<E,K>::Insert(const E& e1)
{
    K k1
=e1;       //重载函数::抽取函数
    
int i=FindPos(k1); //用散列函数计算桶号
    
if(info[i]!=Active)
    {
        ht[i]
=e1;
        info[i]
=Active;
        CurrentSize
++;
        return 
true;
    }
    
if(info[i]==Active&&ht[i]==e1)
    {
        cout
<<"表中已有元素,不能插入!"<<endl;
        return 
false;
    }
    cout
<<"表已满,不能插入数据!";
    return 
false;
};

template
<class E,class K>
bool HashTable
<E,K>::Remove(const K k1)
{
    
int i=FindPos(k1);
    
if(info[i]==Active)
    {
        info[i]
=Deleted;
        CurrentSize
--;
        return 
true;
    }
    
else return false;
};

template
<class E,class K>
E HashTable
<E,K>::Search(const K k1,E& e1)const
{
    
int i=FindPos(k1);
    
if(info[i]!=Active||ht[i]!=k1) return false;
    e1
=ht[i];
    return e1;
};

template
<class E,class K>
void HashTable
<E,K>::makeEmpty()
{
    
for(int i=0;i<TableSize;i++)
        info[i]
=Empty;
    CurrentSize
=0;
};
---------------main.cpp--------------------------

#include"hashing.cpp"
int menu()
{
    int choice;

    cout<<"               *************散列函数的基本操作************"<<endl<<endl;
    cout<<"                         在散列表插入元素,请按1"<<endl;
    cout<<"                         逻辑删除散列表元素,请按2"<<endl;
    cout<<"                         在散列表中搜索关键码的值,请按3"<<endl;
    cout<<"                         退出,请按4"<<endl<<endl;
    cout<<"               *****************************************"<<endl<<endl;

    cout<<"                          请选择:";
    cin>>choice;
    return choice;
}

int main()
{
    HashTable<int,int> hash(2,10);
    bool exit=false;
    while(true)
    {
        int choice=menu();
        switch(choice)
        {
        case 1:
            int s;
            cout<<"                   请输入要插入值关键码:";
            cin>>s;
            cout<<"                   "<<hash.Insert(s)<<endl;break;
        case 2:
            int c;
            cout<<"                   请输入要输出值关键码:";
            cin>>c;
            cout<<"                   "<<hash.Remove(c)<<endl;break;
        case 3:
            int y;
            cout<<"                   请输入要查询值的关键码:";
            cin>>y;
            int z;
            cout<<"                   "<<hash.Search(y,z)<<endl;break;
        case 4:
            exit=true;break;
            
        }
        system("pause");
        system("cls");
       
        if(exit==true)
            break;
    }
    return 0;
}