⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashtable.cpp

📁 指针链表
💻 CPP
字号:
/*
作者:kyo wang
你可以使用并传播此代码,但必须保留此注释部分
*/
#include "memory.h"
#include "hashtable.h"

#define HASHLISTCTRL	CPtrListCtrl

typedef struct tagHASHDATA
{
	int nHashIndex ;
	void *pData ;
} HASHDATA, *PHASHDATA;

int __stdcall HashFind(void *pData, void *pParam)
{
	PHASHDATA pHashData = (PHASHDATA) pData ;
	int nHashIndex = (int)pParam ;

	if ( pHashData->nHashIndex == nHashIndex )
	{
		return 1 ;
	}
	else
	{
		return 0 ;
	}
}

CHashTable::CHashTable(int nSize/* = 1024*/)
{
	m_nHashSize = nSize ;

	InitHashTable() ;
}

CHashTable::~CHashTable()
{
	int i ;
	for ( i = 0 ; i < m_nHashSize ; i++ )
	{
		CPtrCtrl *p = (CPtrCtrl *)m_pHashData[i] ;
		if ( p )
		{
			int nDataCount = p->GetCount() ;
			int i ;
			for ( i = 0 ; i < nDataCount ; i++ )
			{
				PHASHDATA pHashData = (PHASHDATA)p->GetAt(i) ;
				delete pHashData ;
			}
			p->DeleteAll() ;

			delete p ;
		}
	}

	delete []m_pHashData ;
}

void CHashTable::InitHashTable(void)
{
	m_pHashData = new DATAPTR[m_nHashSize] ;
	memset(m_pHashData, 0, m_nHashSize*sizeof(DATAPTR)) ;
}

void CHashTable::AddData(int nHashIndex, void *pData)
{
	int iNode = (nHashIndex % m_nHashSize) ;

	CPtrCtrl *p = (CPtrCtrl *)m_pHashData[iNode] ;
	if ( p == NULL )
	{
		p = new HASHLISTCTRL ;
		m_pHashData[iNode] = (DATAPTR)p ;
	}

	int nPos = p->FindFirst((void *)nHashIndex, HashFind) ;
	if ( nPos != -1 )
	{
		PHASHDATA pHashData = (PHASHDATA)p->GetAt(nPos) ;
		pHashData->pData = pData ;
	}
	else
	{
		PHASHDATA pHashData = new HASHDATA ;
		pHashData->nHashIndex = nHashIndex ;
		pHashData->pData = pData ;

		p->AddData(pHashData) ;
	}
}

void CHashTable::SetData(int nHashIndex, void *pData)
{
	int iNode = (nHashIndex % m_nHashSize) ;

	CPtrCtrl *p = (CPtrCtrl *)m_pHashData[iNode] ;
	if ( p )
	{
		int nPos = p->FindFirst((void *)nHashIndex, HashFind) ;
		if ( nPos != -1 )
		{
			PHASHDATA pHashData = (PHASHDATA)p->GetAt(nPos) ;
			pHashData->pData = pData ;
		}
	}
}

void * CHashTable::FindData(int nHashIndex)
{
	int iNode = (nHashIndex % m_nHashSize) ;

	CPtrCtrl *p = (CPtrCtrl *)m_pHashData[iNode] ;
	if ( p )
	{
		int nPos = p->FindFirst((void *)nHashIndex, HashFind) ;
		if ( nPos != -1 )
		{
			PHASHDATA pHashData = (PHASHDATA)p->GetAt(nPos) ;
			return pHashData->pData ;
		}
	}

	return NULL ;
}

void * CHashTable::DeleteHash(int nHashIndex)
{
	void *pData = NULL ;

	int iNode = (nHashIndex % m_nHashSize) ;

	CPtrCtrl *p = (CPtrCtrl *)m_pHashData[iNode] ;
	if ( p )
	{
		int nPos = p->FindFirst((void *)nHashIndex, HashFind) ;
		if ( nPos != -1 )
		{
			PHASHDATA pHashData = (PHASHDATA)p->GetAt(nPos) ;
			pData = pHashData->pData ;
			delete pHashData ;

			p->DeleteAt(nPos) ;
		}
	}

	return pData ;
}

bool CHashTable::IsDataAvailable(int nHashIndex)
{
	int iNode = (nHashIndex % m_nHashSize) ;

	CPtrCtrl *p = (CPtrCtrl *)m_pHashData[iNode] ;
	if ( p )
	{
		int nPos = p->FindFirst((void *)nHashIndex, HashFind) ;
		if ( nPos != -1 )
		{
			return true ;
		}
	}

	return false ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -