C++散列表二次探测
#include <iostream>
#include <malloc.h>
using namespace std;
enum KindOfStatus
{
Empty=0,
Avtive,
Deleted,
};
template<typename Type>
class HashTable
{
public:
HashTable(int sz)
{
data = new Type[sz];
ofs = new KindOfStatus[sz];
for(int i=0;i<sz;i++)
{
ofs[i] = Empty;
}
//Space = sz;
DefaultSize = sz;
}
void Insert(Type a[],int n)
{
for(int i=0;i<n;i++)
{
Insert(a[i]);
}
}
private:
void Insert(int val)
{
int index = Hash(val);
int result = Find(index,val);
if(data[result]==val)
{
cout<<"已经存在这个值了!!!"<<endl;
return;
}
else
{
data[result]=val;
ofs[result]=Avtive;
}
}
int Find(int n,int val)
{
int index = n;
if(ofs[index]==Empty || data[index]==val)return index;
else
{
int k = 1;
int i;
int j;
while(1)
{
i = (index+k)%DefaultSize;
j = (index-k+DefaultSize)%DefaultSize;
if(ofs[i]==Empty || data[i]==val)return i;
if(ofs[j]==Empty || data[j]==val)return j;
if(2*k+1>=DefaultSize)
break;
k++;
}
if(2*k+1>=DefaultSize)//说明空间已经满了,在这里重新开辟一倍的空间.
{
int savedata[DefaultSize];
int saveofs[DefaultSize];
int i=0;
for(;i<DefaultSize;i++)
{
savedata[i]=data[i];
}
int save = DefaultSize;
DefaultSize=DefaultSize*2+1;
data = (Type *)realloc(data,DefaultSize);
for(i=0;i<DefaultSize;i++)
{
ofs[i]=Empty;
}
for(i=0;i<save;i++)
{
data[i]=savedata[i];
ofs[i]=Avtive;
}
Find(n,val);
}
}
}
public:
void Show()
{
for(int i=0;i<DefaultSize;i++)
{
cout<<ofs[i]<<endl;
cout<<data[i]<<endl;
cout<<"-------------------"<<endl;
}
}
int Hash(int val)
{
return val%DefaultSize;
}
private:
int DefaultSize;//空间大小.
Type *data;
KindOfStatus *ofs;
};
int main()
{
HashTable<int> ht(3);
int a[]={1,4,7,10};
ht.Insert(a,4);
ht.Show();
return 0;
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。