数据结构 ——哈希表

news/2024/12/22 20:12:51/

数据结构 ——哈希表

1、哈希表的概念
概念参考 算法数据结构基础——哈希表(Hash Table)

在这里插入图片描述
2、代码实现
下面是用数组实现哈希结构,开放地址法解决冲突的简单哈希表操作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//数组实现哈希结构,开放地址法解决冲突
typedef struct pair
{int key;//构造一个键出来,充当哈希地址的求解 key,element(存放字符串)char element[20];//存放字符串
}data;typedef struct hashTable
{data **table;//二级指针方便初始化int divisor;//除因子 H(key)=key%divisorint curSize;//当前表大小
}hash;
//创表
hash *createHashTable(int divisor)
{hash *ht = (hash *)malloc(sizeof(hash));if(ht == NULL)return NULL;ht->curSize = 0;ht->divisor = divisor;ht->table=(data **)malloc(sizeof(data *) *(ht->divisor));//分配divisor块4字节的内存放指针if(ht->table == NULL){free(ht);//申请失败,返回前释放前面申请的内存return NULL;}//指针数组初始化1#if 0for (int i = 0; i < divisor; i++){ht->table[i] = NULL;//每块指针指向空}#endif//指针数组初始化2,直接把指针数组的内存全部置零,即初始化为NULLmemset(ht->table,0,sizeof(data *)*ht->divisor);return ht;
}
//找存储当前元素的地址
int search(hash *ht,int key) 
{int pos=key % ht->divisor;//不存在冲突,直接存放//开放地址法解决冲突int curPos=pos;do{//key相同,采用覆盖的数据方式if((ht->table[curPos]==NULL) || (ht->table[curPos]->key==key))return curPos;curPos=(curPos+1)%ht->divisor;} while (curPos!=pos);//从原位置的下一个位置开始找空位,若再次回到原位置,说明没有空间了return curPos;
}   
//插入元素 传参不一样
#if 0
void insert(hash *ht,data data)
{int pos=search(ht,data.key);//找存储当前元素的地址if(ht->table[pos]==NULL){//当前位置为空,直接插入ht->table[pos]=malloc(sizeof(data));if(ht->table[pos]==NULL)return;memcpy(ht->table[pos],&data,sizeof(data));ht->curSize++;}else{//key相同,采用覆盖的数据方式if(ht->table[pos]->key==data.key){strcpy(ht->table[pos]->element,data.element);}else {//如果表满了,会返回原来的位置,但原来的位置与传进来的key会不匹配printf("hashTable is full\n");return;}}
}
#endifvoid insert(hash *ht,data *d)
{int pos=search(ht,d->key);//找存储当前元素的地址if(ht->table[pos]==NULL){//当前位置为空,直接插入ht->table[pos]=malloc(sizeof(data));if(ht->table[pos]==NULL)return;//内存申请失败memcpy(ht->table[pos],d,sizeof(data));ht->curSize++;}else{//key相同,采用覆盖的数据方式if(ht->table[pos]->key==d->key){strcpy(ht->table[pos]->element,d->element);}else {//如果表满了,会返回原来的位置,但原来的位置与传进来的key会不匹配printf("hashTable is full\n");return;}}
}
//遍历哈希表
void travel(hash *ht)
{for (int i = 0; i < ht->divisor; i++){if(ht->table[i]!=NULL)printf("%d:%s\n",ht->table[i]->key,ht->table[i]->element);elseprintf("NULL\n");}
}
//销毁
void destroy(hash *ht)
{for (int i = 0; i < ht->divisor; i++){if(ht->table[i]!=NULL){free(ht->table[i]);ht->table[i]=NULL;}}free(ht->table);
}int main()
{hash *ht=createHashTable(10);data arr[6]={1,"hello",1,"hellomy",3,"women",4,"lucky",5,"money",11,"world123"};for(int i=0;i<6;i++){//arr[i]是具体元素,&arr[i]是才是地址,指针insert(ht,&arr[i]);}travel(ht);destroy(ht);return 0;
}

3、邻接表法实现哈希结构

  • 参考文章 哈希表的C语言实现
  • 哈希表的通用库参考文章 C语言实现的数据结构之------哈希表

http://www.ppmy.cn/news/1557280.html

相关文章

【图形渲染】【Unity Shader】【Nvidia CG】有用的参考资料链接

【背景】 学Shader和学其他任何IT技能一样&#xff0c;需要备有合适的查阅资料的池子&#xff0c;本文就将这些池子一站式备齐给到大家。 【Unity Shader相关学习参考文档链接】 Unity Shader官方文档&#xff1a; http://docs.unity3d.com/Manual/SL-Reference.html 官方…

C# Winform自定义的UI分页控件

效果展示&#xff1a; 自定义控件源代码&#xff1a; using System; using System.Drawing; using System.Windows.Forms; using static NPOI.HSSF.Util.HSSFColor;namespace TestSystemManager {public class PaginationControl : UserControl{// 事件&#xff1a;当页码切换…

图像的向量量化技术

创建嵌入矩阵的过程其实是将离散的索引&#xff08;如单词索引、图像特征的类别标签等&#xff09;映射到一个连续的向量空间&#xff0c;这个向量空间由一个嵌入矩阵来表示。在图像数据的背景下&#xff0c;我们可以通过神经网络将图像数据表示成离散的“类别”索引&#xff0…

如何在 Windows 11 中修改 Hosts 文件

hosts 文件是一个存储在计算机上的文本文件&#xff0c;它包含了一些 IP 地址和域名的映射。操作系统在访问网站时&#xff0c;首先会检查 hosts 文件&#xff0c;看看是否有任何需要手动指定的 IP 地址。如果文件中存在相应的映射记录&#xff0c;操作系统将直接使用 hosts 文…

Oracle virTualBox安装window10

一、下载windows10镜像 我下载的windows10镜像如下&#xff1a; 内部文件如下&#xff1a; 二、错误的安装方法 直接新建虚拟机&#xff0c;选择镜像文件&#xff1a; 启动虚拟机&#xff08;会一直提示没有启动设备&#xff0c;选择镜像后一直弹窗提示&#xff09; 三、正确…

【Http,Netty,Socket,WebSocket的应用场景和区别】

Http&#xff0c;Netty&#xff0c;Socket&#xff0c;WebSocket的应用场景和区别 Http、Netty、Socket、WebSocket都是网络通信领域中的重要技术和工具&#xff0c;它们在应用场景和特性上有所区别。以下是对这四种技术和工具的应用场景及区别的详细分析&#xff1a; Http的…

Redis性能调优:深入剖析变慢原因及应对策略

如果观察到&#xff0c;这个实例的运行延迟是正常 Redis 基准性能的 2 倍以上&#xff0c;即可认为这个 Redis 实例确实变慢了。 1.如何查看实例的运行延迟 &#xff08;1&#xff09;redis-cli -h 127.0.0.1 -p 6379 --intrinsic-latency 60 执行该命令&#xff0c;就可以测…

深度学习网络训练及部署环节相关工具

数据可视化&#xff1a; matplotlib:可视化库seaborn:统计数据可视化模块 网络构建 网络编译&#xff1a; 网络训练&#xff1a; tqdm:进度条模块 模型可解释性 CAM:类别激活映射图 Saliency Maps:显著图 SmoothGrad:效果更好的显著图 GLIME:LIME方法的改进 网络评估…