其他经典算法-第4关:开散列与闭散列

文章展示了C++中使用数组和链表实现的两种散列法:闭散列(ArrayHashTable)和开散列(LinkedHashTable)。闭散列使用静态数组存储数据,开散列则用链表处理冲突。两种方法都包含插入、删除和查找操作。

#include<iostream>

using namespace std;

enum kind{Active,Empty,Deleted};

class ArrayHashTable{//闭散列法

    public:

        ArrayHashTable(const int d,int sz=20){

            tableSize=sz;

            divitor=d;

            table=new int[tableSize];

            info=new kind[tableSize];

            for(int i=0;i<tableSize;i++){

                table[i]=0;

                info[i]=Empty;

            }

        }

        ~ArrayHashTable(){

            delete[] table;

            delete[] info;

        }

        bool findPos(int k,int &i){//寻找k关键码所在位置i

            i=k%divitor;

            int j=i;

            do{

                if(info[i]==Active&&table[i]==k)

                    return true;

                if(info[i]==Empty)

                    return false;

                i=(i+1)%tableSize;

            }

            while(j!=i);

            return false;

        }

        bool insert(int k){//插入关键码k

            int i;

            if(findPos(k,i))

                return false;

            if(info[i]!=Active){

                table[i]=k;

                info[i]=Active;

                return true;

            }else

                return false;

        }

        bool remove(int k){//删除关键码k

            int i;

            if(!findPos(k,i))

                return false;

            table[i]=Deleted;

            return true;

        }

        int *getArray(){

            return table;

        }

    private:

        int divitor;

        int tableSize;

        int *table;

        kind *info;

};


 

class Node{

    public:

        int data;

        Node *next;

        Node(int d,Node *n=NULL){

            data=d;

            next=n;

        }

};

class LinkedHashTable{//开散列法

    public:

        LinkedHashTable(int d,int sz=20){

            tableSize=sz;

            divitor=d;

            hs=new Node*[sz];

            for(int i=0;i<sz;i++)

            hs[i]=new Node(0);

        }

        ~LinkedHashTable(){

            delete []hs;

        }

        bool findPos(int k,Node *&p,Node *&last){

            int i=k%divitor;

            last=hs[i];

            p=hs[i]->next;

            while(p!=NULL&&p->data!=k){

                p=p->next;

                last=last->next;

            }

            if(p!=NULL&&p->data==k)

                return true;

             else

                 return false;

        }

        bool insert(int k){

            Node *p,*last;

            int i=k%divitor;

            if(findPos(k,p,last))

                return false;

            last->next=new Node(k);

            return true;

        }

        bool remove(int k){

            Node *p,*last;

            if(!findPos(k,p,last))

                return false;

            last->next=p->next;

            return true;

        }

        Node **getArray(){

            return hs;

        }

    private:

        int divitor;

        int tableSize;

        Node **hs;

};

void test(Node *&q){

    q=new Node(4);

}

int main(){

    //闭散列法

   

    ArrayHashTable *hs=new ArrayHashTable(11,12);

   

    int a[8];

    int a2[8];

    int len = 0;

    for(int i=0;i<8;i++){

        cin>>a[i];

        a2[i]=a[i];

        len++;

//      cin>>a2[i];

    }

   

   

   

    cout<<"闭散列方法\n";

//    int a[]={37,25,14,36,49,68,57,11};

    /********** Begin **********/

    for (int i = 0; i < len; i++) {

        hs->insert(a[i]);

    }

    int* arr = hs->getArray();

    for (int i = 0; i < 12; i++) {

        cout << arr[i] << " ";

    }

    cout << endl;

    delete hs;

    /********** End **********/

   

    cout<<"开散列方法\n";

//    //开散列法

    /********** Begin **********/

    LinkedHashTable* lht = new LinkedHashTable(11, 12);

    for (int i = 0; i < len; i++) {

        lht->insert(a2[i]);

    }

    Node** table = lht->getArray();

        /********** Begin **********/

    for (int i = 0; i < 12; i++) {

        Node* node = table[i]->next;

        while (node) {

            cout << node->data << " ";

            node = node->next;

        }

        cout << endl;

    }

    delete lht;

    /********** End **********/

    return 0;

}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值