简单的哈希表。。一个数组。。装着每一个链表的首地址。
需要Node**mList
mList=new Node*[size]//这里没初始化
for(int i=0;i<size;i++) mList[i]=nullptr;
还有一个生成key的函数return (n^0xdeadbeef ) %size
下面是完整马
HPP
#include <iostream>
using namespace std;
template<typename T>
struct Hash_List
{
int data;
Hash_List*pNext;
Hash_List(int n)
{
this->data = n;
this->pNext = nullptr;
}
};
template <typename T>
class Hash_Table
{
public:
Hash_Table();
~Hash_Table();
int Hash_Func(int n);
void Hash_Insert(int n);
int Hash_Find(int n);
private:
int Size;
Hash_List<T>** hsTable;
};
template<typename T>
Hash_Table<T>::Hash_Table()
{
Size = 5555555;
hsTable = new Hash_List<T>*[Size];
for (int i = 0; i < Size; i++)
hsTable[i] = nullptr;
}
template<typename T>
Hash_Table<T>::~Hash_Table()
{
for (int i = 0; i < Size; i++)
{
Hash_List<T>*p = hsTable[i];
while (p != nullptr)
{
Hash_List<T>*d = p;
p = p->pNext;
delete d;
d = nullptr;
}
}
}
template<typename T>
int Hash_Table<T>::Hash_Func(int n)
{
return (n ^ 0xdeadbeef) % Size;
}
template<typename T>
int Hash_Table<T>::Hash_Find(int n)
{
int key = Hash_Func(n);
for(Hash_List<T>*pHead = hsTable[key];pHead!=nullptr;pHead=pHead->pNext)
{
if (pHead->data == n)
{
cout << "Find\n";
return 1;
}
}
cout << "No\n";
return 0;
}
template<typename T>
void Hash_Table<T>::Hash_Insert(int n)
{
int key=Hash_Func(n);
for (Hash_List<T>*p = hsTable[key]; p != nullptr; p = p->pNext)
{
if (p->data==n)
{
return;
}
}
Hash_List<T>*pNew = new Hash_List<T>(n);
if (pNew==nullptr)
{
return;
}
pNew->pNext = hsTable[key];
hsTable[key] = pNew;
}
CPP
#include "h.hpp"
int main()
{
Hash_Table<int>t;
t.Hash_Insert(36);
t.Hash_Insert(362);
t.Hash_Insert(33246);
t.Hash_Insert(465);
t.Hash_Insert(316);
t.Hash_Insert(6213);
t.Hash_Insert(65);
int g=t.Hash_Find(362);
}
嗯。。测了下。。能跑。