开散列表及其查找算法的实现

本文探讨了如何实现开散列表,通过一个头结点数组,将散列后的元素插入到对应数组元素后的链表中。内容涵盖散列函数的设计和冲突解决策略,以及相关查找算法的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个头结点数组,散列后的元素插入数组元素后的链表中。

#ifndef listAddress_H_
#define listAddress_H_
#include <iostream>
using namespace std;

struct node
{
    int data;
    node* next;
};

class hashTable
{
private:
    int size;
    node*table;
public:
    hashTable();
    ~hashTable();
    void insert(int elem);
    void deletex(int elem);
    bool search(int elem);
    void print();
};

hashTable::hashTable()
{
    cout<<"please input the size of hashTable.\n";
    cin>>size;
    table= new node[size];
    for(int i=0; i<size; i++)
    {
        table[i].data=i;
        table[i].next=NULL;
    }
}

hashTable::~hashTable()
{
    delete []table;
}

void hashTable::insert(int elem)
{
    int index=elem%size;
    node*cur=&table[index];
    while(cur->next)
    {
        cur=cur->next;
    }
    cur->next=new node;
    cur->next->data=elem;
    cur->next->next=NULL;
}

bool hashTable::search(int elem)
{
    int index=elem%size;
    node*cur=&table[index];
    while(cur->next)
    {
        if(cur->next->data==elem)
            return 1;//1 representative founded.
        else
            cur=cur->next;
    }
    return 0;
}

void hashTable::deletex(int elem)
{
    if(!search(elem))
    {
        cout<<"the elem you want to delete is not exist.\n";
        return;
    }
    int index=elem%size;
    node*cur=&table[index];
    while(cur->next)
    {
        if(cur->next->data==elem)
        {
            cur->next=cur->next->next;
            delete cur->next;
            cur->next=NULL;
            return;
        }
        cur=cur->next;
    }
}

void hashTable::print()
{
    for(int i=0; i<size; i++)
    {
        node *p=&table[i];
        while(p->next)
        {
            cout<<i<<"  "<<p->next->data<<endl;
            p=p->next;
        }
    }
}
#endif

测试:

#include <iostream>
#include "listAddress.h"
using namespace std;

int main()
{
    //test input : 7
    hashTable test;
    test.insert(21);
    test.insert(35);
    test.insert(100);
    test.insert(3);
    test.insert(78);
    test.insert(99);
    test.insert(20);
    test.insert(10);
   // test.deletex(10);
    //test.insert(10);
    test.deletex(100);
    test.deletex(100);
    test.print();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值