码迷,mamicode.com
首页 > 编程语言 > 详细

C++散列表二次探测

时间:2015-05-14 08:40:32      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:c++   散列表   hash   

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

C++散列表二次探测

标签:c++   散列表   hash   

原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/45715833

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!