数据结构哈希表-(开放地址法+二次探测法解决哈希冲突)(创建+删除+插入)+(C语言代码)

news/2024/11/22 21:00:52/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define M 20
#define NULLDEL -1
#define DELDEY -2typedef struct
{int key;int count;
}HashTable;//创建和插入
void Insert(HashTable ha[], int m, int p, int key)
{int i, HO, HI;HO = key % p;if (ha[HO].key == NULLDEL || ha[HO].key == DELDEY){ha[HO].key = key;ha[HO].count = 1;}else{i = 1;do{HI = (HO + i * i) % m;i++;} while (ha[HI].key != NULLDEL && ha[HI].key != DELDEY);ha[HI].key = key;ha[HI].count = i;}
}
void Create(HashTable ha[],int m,int n1,int p,int keys[])
{int i;for (i = 0; i < m; i++){ha[i].key = NULLDEL;ha[i].count = 0;}for (i = 0; i < n1; i++){Insert(ha, m, p, keys[i]);}printf("二次探测法哈希表如下:\n");for (i = 0; i < m; i++){printf("%d  查找次数 %d 次\n", ha[i].key,ha[i].count);}
}
//查找
int Search(HashTable ha[], int m, int p, int key)
{int HO, HI;HO = key % p;if (ha[HO].key == NULLDEL){ha[HO].count = 1;return -1;}else if (ha[HO].key == key){ha[HO].count = 1;return HO;}else{ha[HO].count = 1;for (int i = 0; i < m; i++){HI = (HO + i * i) % m;//HO还是那个HO,这里变的是HI和i的值if (ha[HI].key == NULLDEL){ha->count = ha[HO].count + i;//哈希冲突的次数return -1;}else if (ha[HI].key == key){ha->count = ha[HO].count + i;return HI;}}}
}
//删除哈希值
bool deleteNode(HashTable ha[], int m, int p, int key)
{int HO,i = 1;HO = key % p;while (ha[HO].key != NULLDEL && ha[HO].key != key){HO = (HO + i * i);i++;}if (ha[HO].key == key){ha[HO].key = DELDEY;return true;}else{return false;}
}
int main()
{HashTable ha[M];int keys[] = { 19,14,23,1,68,20,84,27,55,11,10,79 };int n1 = sizeof(keys) / sizeof(keys[0]);int p = 13;Create(ha, M, n1, p, keys);int key = 79;int result = Search(ha, M, p, key);if (result!=-1){printf("找到 %d 位置在 %d 哈希冲突 %d 次\n", key, result, ha->count);}else {printf("找不到 %d 哈希冲突 %d 次\n", key, ha->count);}key = 23;deleteNode(ha, M, p, key);printf("删除 %d 元素后遍历如下:\n", key);for (int i = 0; i < M; i++){if (ha[i].key != NULLDEL && ha[i].key != DELDEY){printf(" %d ", ha[i].key);}else {printf(" * ");}}return 0;
}


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

相关文章

vim 一次注释多行 的几种方法

在 Vim 中一次注释多行是一个常见操作。可以使用以下方法根据你的具体需求选择合适的方式&#xff1a; 方法 1&#xff1a;手动插入注释符 进入正常模式&#xff1a; 按 Esc 确保进入正常模式。 选择需要注释的多行&#xff1a; 移动到第一行&#xff0c;按下 Ctrlv 进入可视块…

kafka中是如何快速定位到一个offset的

定位到具体的segment日志文件&#xff0c;采用二分法先定位到index索引文件计算查找的offset在日志文件的相对偏移量 1、分区和日志段&#xff1a; 每个主题的分区&#xff08;Partition&#xff09;被划分为多个日志段&#xff08;Log Segment&#xff09;。每个日志段是一个…

GPT promote 论文学术润色提示词

学术写作的润色 01 我正在为某知名[学科]学术期刊撰写一篇关于[主题]的论文。我在以下部分试图表达的是[具体观点]。请重新措辞&#xff0c;使之清晰、连贯、简洁&#xff0c;确保每段之间衔接流畅。去除口语化的内容&#xff0c;使用专业化语气。 Im writing a paper on [t…

MySQL:表的约束

目录 一. 表的约束和约束的目标 二. 空属性 三. 默认值default 四. 列描述 五. zerofill 六. 主键 6.1 建表时定义主键 6.2 去掉主键 6.3 建表后添加主键 6.4 复合主键 七. 自增长 八. 唯一键 九. 外键 一. 表的约束和约束的目标 表…

ATmaga8单片机Pt100温度计源程序+Proteus仿真设计

目录 1、项目功能 2、仿真图 ​3、程序 资料下载地址&#xff1a;ATmaga8单片机Pt100温度计源程序Proteus仿真设计 1、项目功能 设计Pt100铂电阻测量温度的电路&#xff0c;温度测量范围是0-100摄氏度&#xff0c;要求LCD显示。画出电路图&#xff0c;标注元器件参数&am…

Spring Boot项目pom.xml文件详解

文章目录 Spring Boot项目pom.xml文件详解一、引言二、POM文件基础结构1、POM文件概述 三、项目依赖详解1、Spring Boot Web Starter2、MyBatis Spring Boot Starter3、MySQL Connector/J4、Lombok5、Spring Boot Test Starter 四、构建插件五、总结 Spring Boot项目pom.xml文件…

Python学习------第十天

数据容器-----元组 定义格式&#xff0c;特点&#xff0c;相关操作 元组一旦定义&#xff0c;就无法修改 元组内只有一个数据&#xff0c;后面必须加逗号 """ #元组 (1,"hello",True) #定义元组 t1 (1,"hello") t2 () t3 tuple() prin…

【H2O2|全栈】MySQL的云端部署

目录 前言 开篇语 准备工作 MySQL移除 为什么需要移除&#xff1f; 移除操作 Yum仓库 yum简介 rpm安装 yum库安装 MySQL安装 使用yum安装 开机自启动 检查运行状态 MySQL配置 初始密码 ​编辑登录 修改root密码 退出MySQL 字符集配置 重启数据库 结束语 …