码迷,mamicode.com
首页 > 其他好文 > 详细

链表法解决hash冲突

时间:2017-10-15 21:10:43      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:code   temp   const   函数   color   erase   map   logs   根据   

/* @链表法解决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;
}

 

链表法解决hash冲突

标签:code   temp   const   函数   color   erase   map   logs   根据   

原文地址:http://www.cnblogs.com/xiaobingqianrui/p/7673699.html

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