在一個數組中模size進行散列,用count來判滿,也叫開放地址法。
#ifndef openAddress_H_
#define openAddress_H_
#include <iostream>
using namespace std;
struct openAddressNode
{
int data;
bool used;
};
class hashTable
{
private:
int size;
int count;//判滿用
openAddressNode *table;
public:
hashTable();
~hashTable();
void insert(int elem);
void deletex(int elem);
void print();
int search(int elem);
};
hashTable::hashTable()
{
cout<<"Please input size.\n";
cin>>size;
count=0;
table=new openAddressNode[size];
int i;
for(i=0;i<size;i++)
{
table[i].data=0;
table[i].used=0;
}
}
hashTable::~hashTable()
{
delete []table;
}
void hashTable::insert(int elem)
{
if(count==size)
{
cout<<"hashTable is full! "<<elem<<" insert failed.\n";
return;
}
int index=elem%size;
while(table[index].used)
{
index++;
index=index%size;
}
table[index].data=elem;
table[index].used=1;
count++;
}
void hashTable::print()
{
int i=0;
for(i=0;i<size;i++)
{
if(table[i].used)
cout<<i<<" "<<table[i].data<<endl;
}
}
void hashTable::deletex(int elem)
{
int index=search(elem);
if(index!=-1)
{
table[index].data=0;
table[index].used=0;
count--;
}
}
int hashTable::search(int elem)
{
int index=elem%size;
int flag=index;
while(table[index].data!=elem)
{
index++;
index=index%size;
if(!table[index].used || index==flag)
{
return -1;
}
}
return index;
}
#endif
測試:
#include <iostream>
#include <cstdio>
#include "openAddress.h"
using namespace std;
int main()
{
//for input 7
//freopen("in.txt","r",stdin);
hashTable test;
test.insert(100);
test.insert(20);
test.insert(21);
test.insert(35);
test.insert(3);
test.insert(78);
test.insert(99);
test.deletex(3);
test.insert(10);
test.print();
return 0;
}