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;
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。