ハッシュ表の例


#include "pch.h"
#include 
#include 

template
class HashTable {
private:
    struct Node
    {
        const int NULL_DATA = -1;
        enum { NODE_SIZE = 3 };
        T data[NODE_SIZE] = { NULL_DATA, NULL_DATA, NULL_DATA };
        struct Node *next = nullptr;
        enum {
            E_SUCCESS = 0,
            E_EXIST = 1,
            E_FULL = 2
        };
        int insert(T val) {
            for (int i = 0; i < NODE_SIZE; ++i) {
                if (data[i] == val) {
                    return E_EXIST;
                }
                if (data[i] == NULL_DATA) {
                    data[i] = val;
                    return E_SUCCESS;
                }
            }
            return E_FULL;
        }
        void dump() {
            for (int i = 0; i < NODE_SIZE; ++i) {
                std::cout << "\t" << data[i];
            }
            std::cout << std::endl;
        }
    };
private:
    enum { prime = 7 };
    Node* m_table[prime] = { nullptr, };
public:
    int hash(int key)
    {
        return key % prime;
    }

    int insert(T x)
    {
        int index = hash(x);
        Node *cur = m_table[index];
        Node *prev = cur;
        while (cur)
        {
            auto ret = cur->insert(x);
            if (Node::E_SUCCESS == ret || Node::E_EXIST == ret) {
                return 0;
            }
            prev = cur;
            cur = cur->next;
        }

        cur = new Node;
        assert(cur);
        cur->insert(x);
        if (prev) {
            prev->next = cur;
        }
        if(!m_table[index]) {
            m_table[index] = cur;
        }
        return 0;
    }
    void dump() {
        for (int i = 0; i < prime; ++i) {
            std::cout << "
[" << i << "]:
"; Node* ptr = m_table[i]; while (ptr) { ptr->dump(); ptr = ptr->next; } } } }; int main() { HashTable table; int array[] = { 4, 15,14,21,87,96,293,35,24,149,19,63,16,103,77,5,153,87,15,145,356,51,68,705,453 }; //int array[] = {1,8,15,22,29,36,43}; for (int i = 0; i < sizeof(array) / sizeof(int); i++) { table.insert(array[i]); } std::cout << sizeof(array) / sizeof(int) << " data
"; table.dump(); return 0; }