哈希(哈希法)表
- 哈希法又名散列法,是一种特殊的查找方法
(哈希法希望不通过任何比较,一次存取就能得到元素)
(哈希就是可以通过分门别类的存储数据,然后快速的将某个数据从大量数据中找出来)
哈希表的设计步骤
- 确定表的空间范围,确定哈希值域
- 构造一个合适的哈希函数(该函数需要保证表中所有元素经过这个函数计算之后,函数的返回值的范围在值域之内
- 选择处理冲突(冲突是指,某个数据具有一样的多个存在)的办法
编码设计:自身函数(自己即使变量又是值)or 数字分析法(求余法、叠加法)
(完全可以理解为,为了再图书馆查找一本图书,而给一本书编号,查号的过程)
2.哈希表的实现代码
#include<stdio.h>
#include<memory.h>
struct MyNode//链式结构(用来处理冲突
{
int data;
MyNode *pNext;
};
struct HashTable
{
MyNode *val[10];//定义一个指针数组,这个数组明面每一个指针理解为链表的头指针
};
HashTable* createHashTable()//创建一个哈希表
{
HashTable *pHash = new HashTable;
memset(pHash, 0, sizeof(HashTable));//将堆区40个字节,按每个字节0值赋值
return pHash;
}
//哈希表插入函数
bool insertHashTable(HashTable *pHash,int data)
{
if (pHash == nullptr)return false;
MyNode* pNode;
pNode = pHash->val[data % 10];
if (pNode == nullptr)
{
pHash->val[data % 10] = new MyNode;
pHash->val[data % 10]->data = data;
pHash->val[data % 10]->pNext = nullptr;
return true;
}
else
{
while (pNode->pNext)pNode = pNode->pNext;
pNode->pNext = new MyNode;
pNode->pNext->data = data;
pNode->pNext->pNext = nullptr;
return true;
}
return true;
}
//查找元素
MyNode * findDataInHash(HashTable* pHash, int findData)
{
if (pHash == nullptr)return nullptr;
MyNode* pNode = pHash->val[findData % 10];
if (pNode == nullptr)return nullptr;
while (pNode)
{
if (pNode->data == findData)return pNode;
pNode = pNode->pNext;
}
return nullptr;
}
//删除元素
bool deleteDataFromHash(HashTable* pHash, int data)
{
MyNode* pNode = findDataInHash(pHash, data);
if (pNode == nullptr)return false;
MyNode* pHead = pHash->val[data % 10];
if (pHead == pNode)
{
pHash->val[data % 10] = pNode->pNext;
}
else
{
while (pHead->pNext!=pNode)
{
pHead = pHead->pNext;
}
pHead->pNext = pNode->pNext;
}
delete pNode;
return true;
}
//清空元素
void clearHashTable(HashTable*& pHash)
{
if (pHash == nullptr)return;
MyNode* pHead;
MyNode* pNode;
for (int i = 0; i < 10; ++i)
{
if ((pHead = pHash->val[i]) != nullptr)
{
while (pHead)
{
pNode = pHead;
pHead = pHead->pNext;
delete pNode;
}
}
}
delete[] pHash;
pHash = nullptr;
}
int main()
{
HashTable *pHash = nullptr;
pHash = createHashTable();
insertHashTable(pHash, 1);
insertHashTable(pHash, 10);
insertHashTable(pHash, 11);
insertHashTable(pHash, 32);
insertHashTable(pHash, 21);
deleteDataFromHash(pHash, 11);
deleteDataFromHash(pHash, 1);
getchar();
return 0;
}