閉散列表及其查找算法的實現

在一個數組中模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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章