哈希表的链地址法来解决冲突问题

将所有关键字为同义词的记录存储在同一个线性链表中,假设某哈希函数产生的哈希地址在区间[0, m - 1]上,则设立一个至振兴向量

Chain  ChainHash[m];

数据结构

//链表结点
typedef struct _tagNode
{int data;              //元素值(关键字)struct _tagNode* next; //下一个结点
}Node, *PNode;//哈希表结点
typedef struct _tagHashTable
{//这里用一个联合体来解释一下,其index也即哈希值
    union{int index;            //哈希表index(这里也是哈希值)int nHashValue;       //也即哈希值
    }INDEX;Node* firstChild;     //该哈希结点在第一个子节点,即哈希值为该结点INDEX字段的struct _tagHashTable* next; //指向下一个哈希结点
}HashTable, *PHashTable;

 构造哈希表,输入为头结点指针的引用

//pHashTable 哈希表头结点
//length 哈希表长度
//pArr 关键字元素数组
//nums 关键字元素数组长度
void CreateHashTable(PHashTable& pHashTable, int length, int* pArr, int nums)
{pHashTable = new HashTable();if(NULL == pHashTable) { cerr << "Create Hashtable error! \n"; return;}pHashTable->firstChild = NULL;pHashTable->INDEX = 0; pHashTable->next = NULL;PHashTable pTemp = pHashTable;for (int i = 1; i < length; ++ i){ PHashTable pt = new HashTable();if(NULL == pt) {cerr << "Create Hahstable error ! \n"; return;}pt->firstChild = NULL;pt->INDEX = i;pt->next = NULL;pTemp->next = pt;pTemp = pt;} //for //Hash(key) = key MOD length;for(int i = 0; i < nums; ++ i){//计算哈希值int nHashValue = pArr[i] % length;PHashTable pTemp2 = NULL;if(NULL != (pTemp2 = LocateHashNode(pHashTable, nHashValue)) ){Insert(pTemp2, pArr[i]);}else{cerr << "元素值为 "<< pArr[i]<< " 的元素,哈希值为 "<< nHashValue<< ", 查找其所在哈希结点失败"<<endl;}}}

 向某个哈希表结点(不一定是头结点)中插入元素

//将关键字插入所在的pHashtable结点的链表
//返回其在该链表上的位置(下标从1开始)
int Insert(PHashTable& pHashtable, int data)
{if(NULL == pHashtable){cerr << "当前哈希表结点为空 \r\n"; return -1;}int nIndex = 1;PNode pNewNode = new Node();if(NULL == pNewNode){cerr << "建立新链表结点失败"<<endl; return -1;}pNewNode->data = data;pNewNode->next = NULL; PNode pNode = pHashtable->firstChild;if (NULL == pNode){pHashtable->firstChild = pNewNode;}else{while(pNode->next != NULL){++ nIndex;pNode = pNode->next;}++nIndex;pNode->next = pNewNode;}  cout << "元素 "<< data << " 插入在了哈希表结点 "<< pHashtable->INDEX<< " 的第 "<< nIndex<< " 个位置"<<endl;return nIndex;
}

 根据哈希值,返回其所在结点的指针,输入为表示该哈希表的头结点指针的引用

//根据哈希值,返回该值应该所在的哈希表结点指针
//pHashtable 哈希表头结点
//nHashValue 元素的哈希值
PHashTable LocateHashNode(PHashTable& pHashtable, int nHashValue)
{if(NULL == pHashtable) {cerr << "哈希表头结点为空"<<endl; return NULL;}PHashTable pTemp = pHashtable;do {if (pTemp->INDEX == nHashValue) return pTemp;pTemp = pTemp->next;} while (pTemp != NULL);return NULL;
}

 从头结点为pHashtable的哈希表中,查找关键字为data,哈希值为nHashValue的元素

在哈希表中的位置,返回值为在该哈希结点的链表中的位置(下标从1开始)

//查找头结点为pHashtable的哈希表
//其数据为data,哈希值为nHashValue的元素
//在哈希表某个结点的链表中的位置(下标从1开始)
int Find(PHashTable& pHashtable, int data, int nHashValue)
{if(NULL == pHashtable){cerr << "哈希表头结点为空"<<endl; return -1;}PHashTable pHashNode = LocateHashNode(pHashtable, nHashValue);if(NULL == pHashNode) {cerr << "找不到元素 " << data << " ,其哈希值为 "<<nHashValue<< " 在哈希表中的位置"; return -1;}int nINDEX = 1;PNode pNode = pHashNode->firstChild;if (NULL == pNode){{cerr << "找不到元素 " << data << " ,其哈希值为 "<<nHashValue<< " 在哈希表中的位置"; return -1;}}else{ bool b = false;while(pNode != NULL){if(pNode->data == data){b = true;break;}++ nINDEX;pNode = pNode->next;} if (false == b){cerr << "找不到元素 " << data << " ,其哈希值为 "<<nHashValue<< " 在哈希表中的位置"; return -1;}else{cout << "元素 "<< data << " 插入在了哈希表结点 "<< pHashNode->INDEX<< " 的第 "<< nINDEX<< " 个位置"<<endl; }}  return nINDEX;
}

int _tmain(int argc, _TCHAR* argv[])
{PHashTable pHashtable = NULL;int length = 0;int nums = 0;cout <<endl<< "请输入元素个数:";cin >> nums;int* pArr = new int[nums]();if(NULL == pArr) {cerr<<"申请元素空间错误"; return -1;}ZeroMemory(pArr, sizeof(int) * nums);for (int i = 0; i < nums; ++ i){int data = 0;cout << "请输入第 "<< i << " 个元素的值:";cin >> data;pArr[i] = data;}cout << endl<<"输入完毕"<<endl;cout << "请输入哈希表长度:";cin >> length;cout << endl <<endl <<"开始构造哈希表"<<endl;CreateHashTable(pHashtable, length, pArr, nums);cout <<endl<<"哈希表构造完毕"<<endl<<endl;cout<<endl<<endl;int value = 0;for (int i = 0; i < nums * 10; ++ i){cout << "请输入要查查找的元素:";cin >> value;Find(pHashtable, value, value % length);cout<<endl;}return 0;
}

转载于:https://www.cnblogs.com/cuish/p/3762333.html

【算法与数据结构】哈希表-链地址法相关推荐

  1. 7-45 航空公司VIP客户查询 【哈希表 链地址法】

    不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务.现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分 ...

  2. c语言链地址法构造哈希表,链地址处理法构造简单哈希表

    链地址法:将所有关键字为同义词的记录保存在一个线性链表中(拉链法) 设某哈希函数产生的哈希地址在区间[0,12]上,则创建指针数组add[12],其中每个元素都是一个单项链表的头结点(有值). 由于仅 ...

  3. 浅谈算法和数据结构: 哈希表

    作者: yangecnu(yangecnu's Blog on 博客园) 出处:http://www.cnblogs.com/yangecnu/  http://www.cnblogs.com/yan ...

  4. 哈希表数据结构_算法与数据结构-哈希表

    前面我们已经讲到了数组和链表,数组能通过下标 O(1) 访问,但是删除一个中间元素却要移动其他元素,时间 O(n). 循环双端链表倒是可以在知道一个节点的情况下迅速删除它,但是吧查找又成了 O(n). ...

  5. 【数据结构】哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度

    一.哈希表 1.概念 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构.它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度.这个 ...

  6. 【数据结构】人名查询哈希表设计(链地址法)

    文章目录 核心代码 链表节点定义 链地址法处理冲突 查询函数 完整代码下载 核心代码 哈希表使用「链地址法」解决地址冲突的方式,其数据结构就采用 数组+链表 ,数组的每一个元素都是一个链表节点,当地址 ...

  7. (7)哈希表的链地址法实现

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.哈希表在像Java. ...

  8. 【JS数据结构与算法】认识哈希表

    目录 一.什么是哈希表? 二.哈希表的优势. 三.哈希表与数组相比较. 四.数据的存储. 方法一:ASCII编码之和 方法二:幂的连乘 五.方法二改进--哈希化 六.解决冲突 一:链地址法(拉链法). ...

  9. 数据结构与算法——深入理解哈希表

    文章目录 哈希表 优点与缺点 哈希化 冲突 基于线性探测的开放地址法 插入 查找 删除 性能问题 基于二次探测的开放地址法 基于再哈希法的开放地址法 链地址法 哈希表实现方法的选择 参考 哈希表 哈希 ...

  10. 数据结构与算法五:哈希表-哈希函数设计原则-哈希冲突解决方案

    一.哈希表的定义: 二.哈希表举例: 哈希函数就是映射关系 三.哈希表应用举例: Leetcode上第387题: 思路:通过s.charAt(i)-'a'将字符串中的字符映射成hash表,出现一次,在 ...

最新文章

  1. 光标定位在文本框的末尾
  2. LigerUi之Grid使用详解(二)——数据编辑
  3. Android开发之通过反射获取全局的application
  4. Luogu3350 ZJOI2016 旅行者 最短路、分治
  5. php怎么调试小程序,教你如何配置微信小程序
  6. 排行榜上用C++写局域网聊天程序
  7. java用正则表达式 编写简单词法分析器_500+ 精选 Java 面试题大放送
  8. Python引力波火了 你该了解的开源框架
  9. EPM240T100的Pin
  10. java导出excel 自定义表头
  11. [转]美国大杏仁并不是杏仁,而是扁桃仁
  12. 数据库使用SHADOW系统实现高可用性
  13. 复合型网络拓扑结构图_网络拓扑结构图知识
  14. C51 数码管的动态显示 dynamic display method of digital tube
  15. 工作记忆中表征状态的振荡控制
  16. 山东艾思软件科技有限公司-公司介绍
  17. java 硬币_java实现硬币方案
  18. Win10--开启FTP的方法
  19. 手把手教你如何追女生
  20. python控制树莓派马达_树莓派控制步进电机

热门文章

  1. 说三件可能你不知道的小事
  2. 薄荷Toolbar(ActionBar)的适配方案
  3. SqlZoo.net习题答案:Using the SELECT statement.【nobel】
  4. javascript入门之算术乘法表
  5. jboss7学习2-jboss7入门(端口和访问的ip问题)
  6. [hdu5247]rmq+预处理
  7. 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)...
  8. 正确理解和使用GBK及UTF-8编码
  9. 如何按照页面载入进度制作进度条??
  10. Android Studio connot resolve symbol XXX 无法解析的符号