链表法解决hash冲突[亲测有效]

/*@链表法解决hash冲突*大单元数组,小单元链表*/#pragmaonce#includeusingnamespacestd;templatestructNode{s

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

/* @链表法解决hash冲突
* 大单元数组,小单元链表
*/
#pragma once 
#include <string>
using namespace std;

template<typename map_t>
struct Node
{
    size_t key;
    map_t content;
        
    Node *next;
    bool isEmpty;

    Node():next(NULL),isEmpty(true){}
};

// 根据hash函数将content添加到hash表中
template<typename map_t>
class ListHash
{
public:
    ListHash();
    ~ListHash();

    bool insert(size_t key, const map_t& val);
    bool find(size_t key, map_t& val);
    bool erase(size_t key);

private:
    size_t hash(size_t key);

private:
    size_t m_nElementSize;
    Node<map_t> *m_pNodeArray;
};

//////////////////////////实现/////////////////////////
template<typename map_t>
ListHash<map_t>::ListHash()
{
    m_nElementSize = 3;
    m_pNodeArray = NULL;
    m_pNodeArray = new Node<map_t>[m_nElementSize];
}

template<typename map_t>
ListHash<map_t>::~ListHash()
{
    delete[] m_pNodeArray;
    m_pNodeArray = NULL;
}

template<typename map_t>
size_t ListHash<map_t>::hash( size_t key )
{
    return key % m_nElementSize;
}


template<typename map_t>
bool ListHash<map_t>::insert( size_t key, const map_t& val )
{
    size_t idx = hash(key);
    Node<map_t> *pNode = &m_pNodeArray[idx];
    if (m_pNodeArray[idx].isEmpty)
    {
        pNode->key = key;
        pNode->content = val;
        pNode->isEmpty = false;
        pNode->next = NULL;
    }
    else
    {
        while (pNode->next != NULL)
        {
            pNode = pNode->next;
        }

        Node<map_t> *pTempNode = new Node<map_t>;
        pTempNode->key = key;
        pTempNode->content = val;
        pTempNode->isEmpty = false;
        pTempNode->next = NULL;

        pNode->next = pTempNode;
    }

    return true;
}

template<typename map_t>
bool ListHash<map_t>::erase( size_t key )
{
    size_t idx = hash(key);
    Node<map_t> *pNode = &m_pNodeArray[idx];
    Node<map_t> *pPrepNode = NULL;

    while (pNode!= NULL)
    {
        if (pNode->key == key)
        {
            if (pPrepNode)
            {
                pPrepNode->next = pNode->next;
            }
            delete pNode;
            return true;
        }

        pPrepNode = pNode;
        pNode = pNode->next;
    }
    return false;
}

template<typename map_t>
bool ListHash<map_t>::find( size_t key, map_t& val )
{
    size_t idx = hash(key);
    Node<map_t> *pNode = &m_pNodeArray[idx];

    while (pNode!= NULL)
    {
        if (pNode->key == key)
        {
            val = pNode->content;
            return true;
        }

        pNode = pNode->next;
    }
    return false;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120238.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

    Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]matterport版mask_rcnn系列:1.Mask_RCNN训练自己的数据2.目标检测:使用Open_cv在图像上批量画boundingbox3.Mask_RCNN:使用COCO权重进行特定类别预测(只标记出你需要的类别)4.Mask_RCNN:ValueError:Dimension1inbothshapes……………

    2022年10月4日
    2
  • c语言之voliate「建议收藏」

    c语言之voliate「建议收藏」volatile:意思:“易变的”特点:1.告诉编译器不做任何优化2.用volatile定义的变量会在程序外被改变,每次使用都要在原始内存地址读取数据,不能被备份缺点:使用过多会降低代码性能使用场合:1.中断服务程序中为其他程序检测的变量,要用volaite2.多任务环境下各个任务间共享的标志,用volatile(操作系统)3.存储器映射的硬件寄存器用vol…

    2022年5月5日
    94
  • struts2拦截器学习

    struts2拦截器学习一、什么是拦截器?提到拦截器,使我不得不想起武侠剧中劫匪们常说的一句话:“此山是我开,此树是我栽,要打此路过,留下买路财!”。难不成程序中也有“打劫”的,说的没错,拦截器就是个打劫的。在现实生活中,劫匪劫的大都是钱财,当然也有别的什么,那么程序中的“劫匪”劫的又是什么呢?或者说程序中为什么需要它?在我们的日常编程中少不了写一些重复的代码,例如在一个地方中写了一段代码,后来发现这段代码在其

    2022年10月7日
    2
  • awvs原理_csgo奇葩武器代码

    awvs原理_csgo奇葩武器代码awvs10.5下载http://www.32r.com/soft/12986.html

    2022年9月22日
    5
  • docker下载安装教程_mac装sql server

    docker下载安装教程_mac装sql server前言Docker提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D

    2022年7月31日
    4
  • shell批量新建文件

    shell批量新建文件shell批量新建文件,文件名依次为a1,a2……a100#!/bin/bashPath=/home/yifan/maying/shell/case2[-d$Path]||mkdir$Pathint=1while(($int&lt;=100))dofilename="a"$int""touch$Path/$filenamelet"int++"do…

    2022年6月22日
    66

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号