哈希表的实现(c语言)

实现哈希表的方法有两种方法:开放寻址法 、链地址法

  • 开放寻址法:在开放寻址法中,所有的元素都存储在哈希表的数组中,冲突发生时会探测下一个可用的位置,直到找到一个空闲的位置。这种方法保持了元素的顺序,但可能导致聚集(clustering)。

  • 链地址法:链地址法使用一个数组来存储指向链表头部的指针,每个链表存储具有相同哈希值的元素。如果发生冲突,新的元素将被添加到该链表的末尾。这种方法可以避免聚集,但不保持元素的顺序。

链地址法:
#include <stdio.h>
#include  <stdlib.h>#define SIZE 20
typedef struct Node {int value;int key;struct Node* next;
}Node;typedef struct{Node *table[SIZE];
}HashTable; //初始化哈希表
void initHashTable(HashTable *ht){for (int i = 0; i < SIZE; i++) {ht->table[i] = NULL;}
} int getKey(int value){return value%SIZE;
}//向哈希表中插入数据  hash公式就是 value%20 
void addvalue(int value,HashTable *ht){Node *node=(Node*)malloc(sizeof(Node));node->value=value;int key=getKey(value);node->key=key;node->next=NULL;Node *tmp=ht->table[key];if(tmp!=NULL){while(tmp->next){tmp=tmp->next;	}tmp->next=node;}else{ht->table[key]=node; } 
}//查看哈希表中是否包含此值 
int containValue(int value,HashTable *ht){int key=getKey(value);if(key<0){printf("查询非法数据!");return -1;}Node* tmp=ht->table[key];if(tmp==NULL) return 0;while(tmp){if(tmp->value==value) return 1;tmp=tmp->next;}return 0;
}// 释放哈希表内存
void freeHashTable(HashTable *ht) {for (int i = 0; i < SIZE; i++) {Node *current = ht->table[i];while (current != NULL) {Node *temp = current;current = current->next;free(temp);}}
}int main(){HashTable table;initHashTable(&table);addvalue(1,&table);addvalue(3,&table);addvalue(6,&table);addvalue(7,&table);addvalue(11,&table);addvalue(23,&table);addvalue(21,&table);addvalue(27,&table);addvalue(87,&table);printf("%d\n",containValue(-1,&table));freeHashTable(&table);system("pause");return 0;
}
开放寻址法
#include <stdio.h>
#include  <stdlib.h>#define SIZE 100typedef struct Node {int value;int key;struct Node* next;
}Node;typedef struct {Node* node[SIZE];int magnification;
}HashTable;void initHashTable(HashTable *ht){int i;for(i=0;i<SIZE;i++){ht->node[i]=NULL;}ht->magnification=1;
}//获取索引,-2:该元素已经无法插入,-1:非法值 
int getKey(int value,HashTable *ht){int key=value%SIZE;if(key>=0&&ht->node[key]!=NULL){int i;for(i=key+1;i<SIZE;i++){if(ht->node[i]==NULL) return i;}return -2;}else if(ht->node[key]==NULL){return key;}return -1;
}void pushToHt(int value,HashTable *ht){int key=getKey(value,ht);if(key==-1){printf("非法值的查找!\n");}else if(key==-2){printf("%d插入失败!\n",value);}else{Node *node=(Node*)malloc(sizeof(Node));node->key=key;node->value=value;node->next=NULL;ht->node[key]=node;} 
}int containValue(int value,HashTable *ht){int key=value%SIZE;if(key==-1){printf("查询非法数据!\n");return -1;}else{return ht->node[key]!=NULL&&ht->node[key]->value==value?1:0;}
}int main(){HashTable ht;initHashTable(&ht);pushToHt(1,&ht);pushToHt(2,&ht);pushToHt(23,&ht);pushToHt(11,&ht);pushToHt(12,&ht);pushToHt(14,&ht);pushToHt(5,&ht);pushToHt(15,&ht);pushToHt(31,&ht);printf("%d\n",containValue(14,&ht));system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于观察者模式设计的框架-REB,使代码模块化

设计模式里面的观察者模式&#xff0c;一直是作者想去设计一套框架来阐述这一个模式&#xff0c;因此REB(Rice Event Broker)就是为了完成观察者模式的一个框架。 观察者模式 聊REB之前&#xff0c;我们聊聊观察者模式带给我们特性&#xff0c;他能对我们框架设计提供什么好处…

双十一期间如何抢占流量,打造品牌爆款产品

进入10月末&#xff0c;也就进入了电商行业的大促流量红利期。如何提前规划大促期间&#xff0c;店铺流量扩张的计划&#xff0c;提前抢占流量&#xff0c;是每一个品牌方都需要考虑的问题。今天为大家分享下双十一期间如何抢占流量&#xff0c;打造品牌爆款产品&#xff01; 一…

Nginx请求参数解析

例&#xff1a; $arg_token 取的就是 uri?args 中 tokenxxx 的部分 $arg_PARAMETER #这个变量包含GET请求中&#xff0c;如果有变量PARAMETER时的值。$args #这个变量等于请求行中(GET请求)的参数&#xff0c;例如foo123&barblahblah;$binary_remote_addr #二进制的客户地…

JNI相关问题

一&#xff1a;NDK的函数调用时出现 “UnsatisfiedLinkError : 函数名” 这样的异常 解决办法&#xff1a; 网上能找到的提醒无一不是让你去仔细检查NDK中的函数命名是否正确&#xff0c;也就是“JAVA_调用该函数的JAVA类名&#xff08;完整路径区分大小写&#xff09;_函数名…

Vue_Bug error0308010Cdigital envelope routinesunsupported

Bug描述&#xff1a; error0308010Cdigital envelope routinesunsupported 解决方法&#xff1a; Just add this to the top of vue.config.js : const crypto require(crypto);/*** md4 algorithm is not available anymore in NodeJS 17 (because of lib SSL 3).* In that…

TypeScript进阶知识之接口(接口定义、接口属性、可索引类型、接口表示函数类型、额外的属性检查、接口继承、接口与类型别名的区别)

系列文章目录 引入一&#xff1a;Typescript基础引入&#xff08;基础类型、元组、枚举&#xff09; 引入二&#xff1a;Typescript面向对象引入&#xff08;接口、类、多态、重写、抽象类、访问修饰符&#xff09; 第一章&#xff1a;Typescript基础知识&#xff08;Typescri…

浅谈安科瑞无线测温设备在俄罗斯某项目的应用

摘要&#xff1a;安科瑞ATE系列和ARTM-Pn无线测温设备适用于高低压柜的梅花触头&#xff0c;线缆&#xff0c;母排等位置对温度的实时监测。 Abstract: ATE series and ARTM-Pn are suitable for monitoring the real-time temperature of circuit breaker contact,cable,busb…

跨境电商:为民营经济注入新活力

中国的民营经济一直以来都是国家经济发展的中流砥柱&#xff0c;而近年来&#xff0c;跨境电商产业崭露头角&#xff0c;为民营经济注入了新的活力和机遇。本文将探讨跨境电商如何成为中国民营企业的助推引擎&#xff0c;以及其对民营经济的积极影响。 民营经济的支柱地位 中国…

ChatGPT AIGC 完成Excel跨多表查找操作vlookup+indirect

VLOOKUP和INDIRECT的组合在Excel中用于跨表查询,其中VLOOKUP函数用于在另一张表中查找数据,INDIRECT函数则用于根据文本字符串引用不同的工作表。具体操作如下: 1.假设在工作表1中,A列有你要查找的值,B列是你希望查询的工作表名称。 2.在工作表1的C列输入以下公式:=VLO…

iMeta框架使用方法

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

判断非线性负载是否合格的方法可以从以下几个方面进行考虑:

额定功率容量&#xff1a;需要了解负载设备的额定功率容量&#xff0c;根据负载设备的规格和说明书&#xff0c;确定其额定功率容量是否能够满足实际需求&#xff0c;如果超过了负载设备的额定功率容量&#xff0c;可能会导致设备过载&#xff0c;从而影响其正常运行。 电压波形…

JVM 垃圾回收机制(可达性分析、引用计数)

目录 1 什么是垃圾2 为什么需要回收3 哪些对象被判定为垃圾呢3.1 引用计数法3.2 可达性分析算法&#xff1a;GC Roots根 1 什么是垃圾 垃圾是指在运行程序中没有任何指针指向的对象&#xff0c;就是需要被回收的。 2 为什么需要回收 执行程序会不断地分配内存空间&#xff0c…

分布式事务协调中间件---seata快速入门

分布式事务 Seata&#xff0c;之前叫做Fescar&#xff0c;是一个开源的分布式事务解决方案&#xff0c;它主要致力于提供高效和简单的分布式事务服务。Seata主要用于解决微服务架构下的数据一致性问题。 Seata 的基本原理是基于两阶段提交 (2PC) 以及三阶段提交 (3PC)&#xff…

宏定义实现二进制数的奇偶位交换

思路分析 通过宏定义来实现二进制数的奇偶位交换&#xff0c;如果一个个遍历交换的话&#xff0c;那得算到猴年马月&#xff0c;这是我在网上看到的一个思路&#xff1a; 我们将每一位&#xff08;整数在计算机里存储是4字节&#xff0c;32位&#xff09;二进制数的奇数位保留…

nodejs+vue水浒鉴赏平台系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

EtherCat

百度安全验证 EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;是一种高性能、实时性强的工业以太网通信协议&#xff0c;它可以实现多个从站设备通过一个主站设备进行控制和通信。 主站&#xff1a; EtherCAT主站是指控制整个EtherCAT网络的设备…

C++ 反向迭代器

反向迭代器的即正向迭代器的--&#xff0c;反向迭代器的--即正向迭代器的&#xff0c;反向迭代器和正向迭代器的很多功能都是相似的&#xff0c;因此我们可以复用正向迭代器作为反向迭代器的底层容器来封装&#xff0c;从而实现出反向迭代器&#xff0c;即&#xff1a;反向迭代…

vue3后台管理框架之Mock开发

前言 在前后端对接中,有时后端的接口数据没有 那么快能给出,因此我们可以通过mock模拟自己的请求数据,在后端接口没有给出的同时,先使用mock请求的数据完成前端相关的逻辑 官方文档:vite-plugin-mock vite 的数据模拟插件,是基于 vite.js 开发的。 并同时支持本地环境…

并查集-合并集合

文章目录 QuestionIdeasCode Question 一共有 n 个数&#xff0c;编号是 1∼n &#xff0c;最开始每个数各自在一个集合中。 现在要进行 m 个操作&#xff0c;操作共有两种&#xff1a; M a b&#xff0c;将编号为 a 和 b 的两个数所在的集合合并&#xff0c;如果两个数已经…

【LeetCode 算法专题突破】双指针(⭐)

文章目录 前言1. 移动零题目描述代码 2. 复写零题目描述代码 3. 快乐数题目描述代码 4. 盛最多水的容器题目描述代码 5. 有效三角形的个数题目描述代码 6. 三数之和题目描述代码 7. 四数之和题目描述代码 总结 前言 学算法入门必学的一个章节&#xff0c;双指针算法&#xff0…