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

📄 hashtable.cpp

📁 联通的短信网关平台。 sp 使用。 如果想自己用vc 开发短信业务
💻 CPP
字号:
// HashTable.cpp: implementation of the CHashTable class.
//
//////////////////////////////////////////////////////////////////////

//#include "stdafx.h"
#include "HashTable.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHashTable::CHashTable()
{
	m_nTableSize = 1000;//default 1000;
	m_pDataList = NULL;
	m_pDataList = new CTableData[m_nTableSize];
}

CHashTable::~CHashTable()
{
	DestoryHashTable();
}

void CHashTable::DestoryHashTable(void)
{
	if (m_pDataList != NULL)
	{
		for (unsigned long i=0; i<m_nTableSize; i++)
		{
			CTableData *pData = m_pDataList + i;
			
			CTableData *pBase = NULL;
			CTableData *pNext = NULL;
			
			while (pData->m_pNext != NULL)
			{
				pBase = pData->m_pNext;
				pNext = pBase;
				pData->m_pNext = NULL;
				
				while (pBase->m_pNext != NULL)
				{
					pNext = pBase->m_pNext;
					delete pBase;
					pBase = pNext;					
				}
				delete pBase;
			}
		}
		
		delete [] m_pDataList;
		m_pDataList = NULL;
		m_nTableSize = 0;
	}
}

unsigned long CHashTable::CreateHashKey(const char *s, unsigned size)
{
	unsigned long h = 0;
	unsigned long g;
	
	if (size == 0)
		size = m_nTableSize;
	
	while (*s) 
	{
		h = (h << 4) + *s++;
		if ((g = (h & 0xf0000000)) != 0) 
		{
			h ^= (g >> 24);
			h ^= g;
		}
	}
	return (h % size);
}

unsigned long CHashTable::SetHashSize(unsigned long nTableSize)
{
	if (m_pDataList != NULL)
	{
		DestoryHashTable();
	}

	m_nTableSize = nTableSize;

	m_pDataList = new CTableData[m_nTableSize];

	return m_nTableSize;
}


/*==================================	
	Insert Data into the table
	return the index
==================================*/ 
unsigned long CHashTable::InsData(char *pData)
{
	CTableData *pTemp = NULL;
	unsigned long nIndex = 0;
	nIndex = CreateHashKey(pData);
	pTemp = m_pDataList + nIndex;

	if (strlen((char *)&pTemp->m_cData) == 0)
	{
		pTemp->m_ulHashKey = nIndex;
		strcpy(pTemp->m_cData, pData);
	}
	else
	{
		while (pTemp->m_pNext != NULL)
		{
			//if find the pData, then return;
			/*
			if (strncmp(pTemp->m_cData, pData, strlen(pTemp->m_cData)) == 0)
			{
				return nIndex;
			}
			*/
			char *p1 = NULL, *p2 = NULL;
			p1 = pTemp->m_cData;
			p2 = pData;
			while (*p1 != '\0')
			{
				if (*p1 != *p2)
					break;
				p1++;
				p2++;
			}
			if (*p1 == *p2)//find
				return nIndex;

			pTemp = pTemp->m_pNext;
		}

		CTableData *pAdd = new CTableData();
		pAdd->m_ulHashKey = nIndex;
		strcpy(pAdd->m_cData, pData);

		pTemp->m_pNext = pAdd;
	}

	return nIndex;
}

/*==================================	
	Locate the data in the Table
	return true if it is exist
==================================*/
bool CHashTable::LocateData(char *pData, int nLen)
{
	CTableData *pTemp = NULL;
	unsigned long nIndex = 0;
	
	nIndex = CreateHashKey(pData);
	pTemp = m_pDataList + nIndex;

	if (strlen((char *)&pTemp->m_cData) == 0)
		return false;

	do 
	{
		if (pTemp->DatanCmp(pData, nLen))
			return true;

		pTemp = pTemp->m_pNext;
		
	} while(pTemp != NULL);

	return false;
}

/*===================================	
	==Delete the data in the Table==
	==return true if del succeed====
====================================*/
bool CHashTable::DelData(char *pData, int nLen)
{
	CTableData *pTemp = NULL;
	CTableData *pBase = NULL;
	unsigned long nIndex = 0;
	
	nIndex = CreateHashKey(pData);
	pTemp = m_pDataList + nIndex;
	
	if (strlen((char *)&pTemp->m_cData) == 0)
		return false;

	pBase = pTemp;
	
	bool bBaseNode = true;
	do 
	{
		if (pTemp->DatanCmp(pData, nLen))
		{
			if (bBaseNode)
			{
				pTemp->m_ulHashKey = 0;
				pTemp->m_pNext = NULL;
				memset(&pTemp->m_cData, 0, sizeof(pTemp->m_cData));
			}
			else
			{
				pBase->m_pNext = pTemp->m_pNext;
				delete pTemp;
			}
			return true;
		}

		pBase = pTemp;
		
		pTemp = pTemp->m_pNext;
		bBaseNode = false;
		
	} while(pTemp != NULL);
	
	return false;
}



//CTableData 
CTableData::CTableData()
{
	memset(&m_cData, 0, sizeof(m_cData));
	m_ulHashKey = 0;
	m_pNext = NULL;
}

CTableData::~CTableData()
{

}

bool CTableData::DataCmp(char *pData)
{
	int nLen = strlen(m_cData);
	return DatanCmp(pData, nLen);
}

bool CTableData::DatanCmp(char *pData, int nLen)
{
	if (nLen == 0)
		return false;
	
	if (strncmp((const char *)&m_cData, pData, nLen) == 0)
		return true;
	else
		return false;
}

⌨️ 快捷键说明

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