数据结构与算法_哈希

本文介绍了哈希法,一种特殊的查找方法,旨在通过哈希函数实现一次存取即找到目标元素。哈希表设计包括确定表空间、构造哈希函数和处理冲突策略。文章还提供了哈希表的实现代码,帮助理解哈希表的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈希(哈希法)表

  • 哈希法又名散列法,是一种特殊的查找方法

(哈希法希望不通过任何比较,一次存取就能得到元素)
(哈希就是可以通过分门别类的存储数据,然后快速的将某个数据从大量数据中找出来)

哈希表的设计步骤

  1. 确定表的空间范围,确定哈希值域
  2. 构造一个合适的哈希函数(该函数需要保证表中所有元素经过这个函数计算之后,函数的返回值的范围在值域之内
  3. 选择处理冲突(冲突是指,某个数据具有一样的多个存在)的办法
    编码设计:自身函数(自己即使变量又是值)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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值