📄 hashtable.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 + -