標籤:hashtable 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 = 3; } 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); } } } void Show() { for(int) } 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); return 0;}
C++散列表(二次探測)