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

📄 hashtable.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
字号:
#include "hashtable.h"

bool CHashTable::Initialize(DWORD dwMaxBucketNum)
{	
	m_dwDataNum = 0;
	m_dwMaxBucketNum = dwMaxBucketNum;
	m_ppBucketTable = NULL;
	m_pListHead = NULL;
	m_pListTail = NULL;
	m_pListCur = NULL;

	m_ppBucketTable = new BUCKET*[m_dwMaxBucketNum];
	
	if (!m_ppBucketTable)
		return false;

	memset(m_ppBucketTable,0,sizeof(BUCKET*)*m_dwMaxBucketNum);
	
	return true;

}
bool CHashTable::Add(void* pVoid,DWORD dwKey)
{
	DWORD index = dwKey % m_dwMaxBucketNum;
	
	BUCKET*	cur = NULL;
	BUCKET*	prv = NULL;
	BUCKET*	next = NULL;


	if (!m_ppBucketTable[dwKey])
	{

		m_ppBucketTable[index] = new BUCKET(pVoid,dwKey);
		m_ppBucketTable[index]->pList = AddList(m_ppBucketTable[index]);

		goto seg_ok;
	}
	else 
	{
		cur = m_ppBucketTable[index];
		while (cur)
		{
			if (cur->dwKey == dwKey)
				return false;

			prv = cur;
			cur = cur->pNext;
			
		}
		cur = prv->pNext = new BUCKET(pVoid,dwKey);
		cur->pPrv = prv;
		cur->pList = AddList(cur);
		
		goto seg_ok;
	
	}
seg_ok:
	m_dwDataNum++;
	
	return true;
}

LIST* CHashTable::AddList(BUCKET* pBucket)
{
	LIST*	cur = NULL;
	LIST*	prv = NULL;
	LIST*	next = NULL;

	if (!m_pListHead)
	{
		m_pListCur = m_pListHead = new LIST;
		m_pListTail = m_pListCur;
		m_pListCur->pBucket = pBucket;
		pBucket->pList = m_pListHead;
		return m_pListHead;
	}
	else 
	{
		cur = m_pListTail->pNext = new LIST;
		cur->pPrv = m_pListTail;
		m_pListTail = cur;
		cur->pBucket = pBucket;
		pBucket->pList = cur;
		return cur;
	}
	return NULL;
}

void CHashTable::Remove(DWORD dwKey)
{
	DWORD dwIndex = dwKey%m_dwMaxBucketNum;

	BUCKET*	cur = m_ppBucketTable[dwIndex];
	BUCKET*	prv = NULL;
	BUCKET*	next = NULL;
	
	while (cur)
	{
		if (cur->dwKey == dwKey)
		{
			prv = cur->pPrv;
			next = cur->pNext;
			if (!prv)
				m_ppBucketTable[dwIndex] = next;
			else 
				prv->pNext = next;
				
			if (next)
				next->pPrv = prv;
				
			RemoveList(cur->pList);
			delete cur;
			cur = NULL;
			m_dwDataNum--;
			return;
		}
		cur = cur->pNext;
	}
}

void CHashTable::RemoveList(LIST* pList)
{
	
	LIST*	cur = pList;
	LIST*	prv = pList->pPrv;
	LIST*	next = pList->pNext;

	

	if (prv)
		prv->pNext = next;
	else 
		m_pListHead = next;

	if (next)
		next->pPrv = prv;
	else
		m_pListTail = prv;
	
	m_pListCur = m_pListHead;
	
	delete pList;
	pList = NULL;

}
void* CHashTable::GetData(DWORD dwKey)
{
	DWORD index = dwKey%m_dwMaxBucketNum;

	BUCKET* pBucket = m_ppBucketTable[index];

	while(pBucket)
	{
		if (pBucket->dwKey == dwKey)
		{
			return pBucket->pVoid;
		}
		pBucket = pBucket->pNext;
	}
	return NULL;

}
void* CHashTable::GetData()
{
	void*	pVoid;
	if (m_pListCur)
	{
		pVoid = m_pListCur->pBucket->pVoid;
		m_pListCur = m_pListCur->pNext;
		return pVoid;
	}
	else 
		return NULL;

	return pVoid;
}
void CHashTable::RemoveAll()
{
	LIST*	cur = m_pListHead;
	LIST*	next = NULL;

	while (cur)
	{
		next = cur->pNext;
		delete cur->pBucket;
		delete cur;
		cur = next;
	}
	m_dwDataNum = 0;
}

CHashTable::~CHashTable()
{
	RemoveAll();
	if (m_ppBucketTable)
	{
		delete m_ppBucketTable;
		m_ppBucketTable = NULL;
	}
}

⌨️ 快捷键说明

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