C++简单哈希表

58 篇文章 0 订阅
21 篇文章 0 订阅

简单的哈希表。。一个数组。。装着每一个链表的首地址。

需要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);
	

}
嗯。。测了下。。能跑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值