哈希表——C语言

哈希表(Hash Table)是一种高效的数据结构,能够在平均情况下实现常数时间的查找、插入和删除操作。

        哈希表的核心是哈希函数,哈希函数是一个将输入数据(通常称为“键”或“key”)转换为固定长度的整数的函数。这个整数通常用作哈希表(Hash Table)中的索引,用于快速查找数据。本质上就是根据输入的值确定值的位置。

例如,输入除以10取余是位置编号:

int HashPosFind(int num) {return num % 10;
}

如果有重复的情况呢,那么要在其他位置存储,有不同的方法,这里采取的是链表法。

如图所示,如果序号为1的地址处已经有值存在,那么我们就把新的数连接到链表上。

首先我们可以写出类似于这样的函数:

#define NUM 10
#define Nan -32767
typedef struct Seqlist {struct Seqlist* next;int val;
}Seqlist;typedef struct HashList {int num;Seqlist** list;
}HashList;
HashList* HashInit() {HashList* H = (HashList*)malloc(sizeof(HashList));H->num = 0;H->list = (Seqlist**)malloc(sizeof(Seqlist*) *NUM);for (int i = 0; i < NUM; i++) {H->list[i] = (Seqlist*)malloc(sizeof(Seqlist));H->list[i]->next = NULL;}for (int i = 0; i < NUM; i++) {H->list[i]->val = Nan;}return H;
}

1.首先定义NUM表示一共有十个位置定义链表,定义Nan表示没有数的时候的数值。
2.然后定义哈希表的结构,用二级指针的方法模拟二维数组,准确的说是二维链表。
3.接着为哈希表开辟空间,先为10个链表指针开辟二级指针(指针数组),接着在为每个序列号指针开辟空间并且初始化为Nan表示此时哈希表为空。

        接着就是哈希表插入操作,这里要考虑两种情况,第一是当取得地址序列号之后,此时的链表存储的是Nan,那我们要先把链表的Nan赋值为插入的数据,然后新创建一个节点存储Nan表示链表的结尾。
        第二种情况的是第一个数值不是Nan,这时要一直找到链表的尾,然后同样执行上一步的操作:先赋值为插入的数值,然后更新链表的尾。

代码如下:

void HashPush(int val,HashList* H) {int pos = HashPosFind(val);if (H->list[pos]->val == Nan) {H->list[pos]->val = val;Seqlist* new_node = (Seqlist*)malloc(sizeof(Seqlist));new_node->val = Nan;new_node->next = NULL;H->list[pos]->next = new_node;}else {printf("重新插入中\n");int num = 1;Seqlist* cur = H->list[pos];while (cur->val != Nan) {cur = cur->next;}Seqlist* new_node = (Seqlist*)malloc(sizeof(Seqlist));new_node->val = Nan;new_node->next = NULL;cur->next = new_node;cur->val = val;}
}

        首先是第一种情况,因为是Nan所以说明此时的链表为空,所以直接存储,然后开辟一个新的节点存储Nan表示链表的结尾。

        第二种情况说明已经有值存在,这时先找到链表的尾(找到节点值为Nan的节点),然后执行和第一步一样的操作:先存储值,然后新开辟一个节点存储Nan。

        最后是打印函数:思路比较简单,一直打印到Nan为止。

void HashPrint(HashList* H) {for (int i = 0; i < NUM; i++) {printf("%d: ",i);Seqlist* cur = H->list[i];while (cur->val != Nan) {printf("%d ", cur->val);cur = cur->next;}printf("\n");}
}

这就是文章的全部的内容了,希望对你有所帮助,如有错误欢迎指出。

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

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

相关文章

Efficient Contrastive Learning for Fast and Accurate Inference on Graphs

发表于:ICML24 推荐指数: #paper/⭐⭐⭐ 创新点一颗星,证明三颗星(证明的不错,值得借鉴,但是思路只能说还行吧) 如图, 本文采取的创新点就是MLP用原始节点,GCN用邻居节点的对比学习.这样,可以加快运算速度 L E C L − 1 ∣ V ∣ ∑ v ∈ V 1 ∣ N ( v ) ∣ ∑ u ∈ N ( v )…

一篇文章Scala语言入门

Scala是一种现代编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性&#xff0c;使得编写简洁、可扩展和高效的代码成为可能。 1. 什么是Scala&#xff1f; Scala&#xff08;Scalable Language&#xff09;是一种面向对象和函数式编程语言。它运行在JVM&#xff0…

k8s 部署 springboot 项目内存持续增长问题分析解决

写在前面 工作中遇到&#xff0c;请教公司前辈解决&#xff0c;简单整理记忆博文内容涉及一次 GC 问题的分析以及解决理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完…

语音识别FBank特征提取学习笔记

语音识别就是把一段语音信号转换成对应的文本信息&#xff0c;这一过程包括四个大的模块&#xff0c;分别是&#xff1a;特征提取、声学模型、语言模型、字典与解码。 本篇就来梳理一下特征提取模块的实现思路和方法。 常用的语音特征有&#xff1a; 梅尔频率倒谱系数&#x…

学生管理系统(通过顺序表,获取连续堆区空间实现)

将学生的信息&#xff0c;以顺序表的方式存储&#xff08;堆区&#xff09;&#xff0c;并且实现封装函数 &#xff1a; 1】顺序表的创建&#xff0c; 2】判满、 3】判空、 4】往顺序表里增加学生信息、 5】遍历学生信息 6】任意位置插入学生信息 7】任意位置删除学生信…

0301STM32GPIO外设输出

STM32GPIO外设输出 STM32内部的GPIO外设GPIO简介基本结构GPIO位结构输入部分&#xff1a;输出部分&#xff1a; GPIO八种工作模式浮空/上拉/下拉输入模拟输入开漏/推挽输出复用开漏/推挽输出 手册寄存器描述GPIO功能描述外设的GPIO配置GPIO寄存器描述端口输入数据寄存器端口输出…

QT入门笔记-自定义控件封装 30

具体代码如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

并查集(还有反集也在)

一.定义 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题&#xff08;即所谓的并、查&#xff09;。比如说&#xff0c;我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成&#xff1a; 并查集…

PHP-实例-文件上传

1 需求 2 basename 在 PHP 中&#xff0c;basename() 函数用于返回路径中的文件名部分。如果路径中包含了文件扩展名&#xff0c;则该函数也会返回它。如果路径的结尾有斜杠&#xff08;/&#xff09;或反斜杠&#xff08;\&#xff09;&#xff0c;则 basename() 函数会返回空…

Android计算器界面的设计——表格布局TableLayout实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button等实现一个计算器界面&#xff0c;界面如图1所示。 图1 计算器界面效果图 任务分析 界面整体使用表格布局&#xff0c;第一行使用一个TextView控件&#xff0c;横跨4列&#xff0c;中间4行4列&#xff0c;最后一…

Laravel HTTP客户端:网络请求的瑞士军刀

标题&#xff1a;Laravel HTTP客户端&#xff1a;网络请求的瑞士军刀 Laravel的HTTP客户端是一个功能强大的工具&#xff0c;它提供了一种简洁、直观的方式来发送HTTP请求。无论是与外部API集成&#xff0c;还是进行网络数据抓取&#xff0c;Laravel的HTTP客户端都能满足你的需…

小红书选品中心商家采集 小红书商家电话采集软件

可采集名称销量评分联系方式等 需要有1000粉丝以上已实名认证过的小红书达人才可以使用 以下是一个示例程序&#xff0c;可以用于批量获取小红书选品中心商家的信息&#xff1a; import requestsdef get_merchants(page_num):url f"https://www.xiaohongshu.com/selec…

git 添加本地分支, clean

//以develop为源创建本地分支fromdevelop git checkout -b fromdevelop git add . git commit -m "local" git checkout -b local/dev //切换到远程分支. git checkout dev git clean_git clean -f -d-CSDN博客 git clean -f -d #删除当前目录下没有被track…

RAC spfile 坑 +data INSTANCE_NUMBER thread x is mounted by another instance

RAC相关三个参数 thread reset 就可以默认 instance_number 需要单独设置 sid‘SIDX’ cluster_database boolean TRUE SQL> alter system reset instance_number sid* scopespfile; alter system reset instance_number sid* scopespfile …

解析Torch中`Transformer`

解析torch官方代码脚本文件&#xff1a;transformer.py。版本&#xff1a;1.9.1cu111。 首先查看《Torch中多头注意力MultiheadAttention的中文注释》解析&#xff1b; 最后查看下方transformer解析。 话不多说&#xff0c;看代码吧&#xff01; import copy from typing imp…

Vue的学习之class与style绑定

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>Vue的学习</title><script src"vue.js" type"text/javascript" charset"utf-8"></script></head><body><…

如何在std::map中查找元素

在std::map中查找元素可以通过几种不同的方式完成&#xff0c;但最常用的方法是使用find成员函数。std::map是一个基于键值对的关联容器&#xff0c;其中每个元素都是一个键值对。键是唯一的&#xff0c;并且用于排序和快速查找。 使用find成员函数 find成员函数接受一个键作…

io流 多线程

目录 一、io流 1.什么是io流 2.流的方向 i.输入流 ii.输出流 3.操作文件的类型 i.字节流 1.拷贝 ii.字符流 ​3.字符流输出流出数据 4.字节流和字符流的使用场景 5.练习 6.缓冲流 1.字节缓冲流拷贝文件 2.字符缓冲流特有的方法 1.方法 2.总结 7.转换流基本用法…

第2集《修习止观坐禅法要》

请打开补充讲表第一面&#xff0c;附表一、念佛摄心方便法。 我们前面讲到修止&#xff0c;就是善取所缘境的相貌&#xff0c;然后心于所缘&#xff0c;专一安住&#xff1b;心于所缘&#xff0c;相续安住&#xff1b;达到心一境性的目的。 站在修学净土的角度&#xff0c;他…

FastAPI+SQLAlchemy数据库连接

FastAPISQLAlchemy数据库连接 目录 FastAPISQLAlchemy数据库连接配置数据库连接创建表模型创建alembic迁移文件安装初始化编辑env.py编辑alembic.ini迁移数据库 视图函数查询 配置数据库连接 # db.py from sqlalchemy import create_engine from sqlalchemy.orm import sessio…