哈希表

//.h
#pragma once
#include <assert.h>

template <class TVALUE>
class CHash_Table
{
public:
	CHash_Table( int nSize = 100);
	~CHash_Table(void);

public:
	bool    InsertItem(int Key, TVALUE Value);
	bool    DeleteItem(int Key);
	TVALUE* FindItem(int Key);

private:
	int     HashFuncation(int Key);

private:
	typedef struct _HASHNODE
	{
		int        m_Key;
		TVALUE     m_Value;
		_HASHNODE* m_pNext;
	}HASHNODE;

	int		    m_nHashTableSize;
	HASHNODE**  m_pHashTable;
};

template <class TVALUE>
CHash_Table<TVALUE>::CHash_Table( int nSize/* = 100 */ )
{
	assert(nSize > 0);

	m_nHashTableSize = nSize;
	m_pHashTable     = new HASHNODE*[m_nHashTableSize];

	assert (m_pHashTable != NULL);

	for (int i = 0; i < m_nHashTableSize; i++)
	{
		m_pHashTable[i] = NULL;
	}
}

template <class TVALUE>
CHash_Table<TVALUE>::~CHash_Table( void )
{
	for (int i = 0; i < m_nHashTableSize; i++)
	{
		if (m_pHashTable[i] != NULL)
		{
			HASHNODE *pTmp = m_pHashTable[i];

			while (pTmp != NULL)
			{
				m_pHashTable[i] = pTmp->m_pNext;
				delete pTmp;

				pTmp = m_pHashTable[i];
			}
		}
	}
}

template <class TVALUE>
bool CHash_Table<TVALUE>::InsertItem( int Key, TVALUE Value )
{
	int nPos = HashFuncation(Key);

	HASHNODE *pNewNode = new HASHNODE;
	if (pNewNode == NULL)
		return false;

	pNewNode->m_Key    = Key;
	pNewNode->m_Value  = Value;
	pNewNode->m_pNext  = m_pHashTable[nPos];

	m_pHashTable[nPos] = pNewNode;

	return true;
}

template <class TVALUE>
bool CHash_Table<TVALUE>::DeleteItem( int Key )
{
	int nPos = HashFuncation(Key);

	HASHNODE *pPreNode = m_pHashTable[nPos];
	HASHNODE *pCurNode = m_pHashTable[nPos];

	while (pCurNode != NULL && pCurNode->m_Key != Key)
	{
		pPreNode = pCurNode;
		pCurNode = pCurNode->m_pNext;
	}

	if (pCurNode != NULL && pCurNode->m_Key == Key)
	{
		pPreNode->m_pNext = pCurNode->m_pNext;
		delete pCurNode;

		return true;
	}
		
	return false;
}

template <class TVALUE>
TVALUE* CHash_Table<TVALUE>::FindItem( int Key )
{
	int nPos = HashFuncation(Key);

	HASHNODE *pArry = m_pHashTable[nPos];

	while (pArry != NULL && pArry->m_Key != Key)
	{
		pArry = pArry->m_pNext;
	}

	if (pArry != NULL)
		return &pArry->m_Value;
	else
		return NULL;
}

template <class TVALUE>
int CHash_Table<TVALUE>::HashFuncation( int Key )
{
	int nFlg = Key>>31;
	Key = (Key^nFlg) - nFlg;  //求绝对值 

	return Key % m_nHashTableSize;
}


 

//.cpp
void TestHashTable()
{
	CHash_Table<int> HashTable(20);

	for (int i = 0; i < 80; i++)
		HashTable.InsertItem(i, rand() % 100);

	HashTable.InsertItem(-90, rand() % 100);

	int *pValue = NULL;
	pValue = HashTable.FindItem(10);
	pValue = HashTable.FindItem(80);

	bool bSuccess = false;
	bSuccess = HashTable.DeleteItem(50);
	bSuccess = HashTable.DeleteItem(80);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值