数据结构哈希表的基本操作(C语言)
设有一组关键字(19,14,23,1,68,20,84,27,56,11,10,79),建立一个哈希查找表。
(1)哈希函数采用: H(key)= key % P(其中P=13),若发生冲突后,用链地址法解决冲突。
(2)哈希函数采用: H(key)= key % P(其中P=13),若发生冲突后, 用线性探测再散列方法解决冲突。
编写程序建立哈希查找表,运行程序在表中查找68,99。
目录
1、哈希表结点结构与哈希函数
2、链地址法
2.1、初始化
2.2、插入
2.3、查找
3、线性探测法
3.1、初始化
3.2、创建
3.3、查找
4、完整测试源码
1、哈希表结点结构与哈希函数
#define M 13 //除留余数法的除数
#define N 12 //元素个数
//哈希表结点结构
typedef struct HTNode {int data; //值域struct HTNode* next; //指针域,用于链地址法解决冲突
}*HTNode;
//哈希函数
int H(int n) {return n % M;
}
2、链地址法
用一个HT数组存放关键字,如果有冲突,就把后面的关键字接在冲突位置的关键字的后面。
2.1、初始化
先把所有位置初始化为空,表示位置还没有被占用。
//链地址法
//初始化
void initHashTable(HTNode* HT) {for (int i = 0; i < N; i++)HT[i] = NULL;
}
2.2、插入
需要判断一下表里是否被占用了,如果被占用了就插入到链表上去。
//插入、创建
void createHashTable(HTNode* HT, int k) {HTNode p = (HTNode)malloc(sizeof(struct HTNode));p->data = k; //赋值 p->next = NULL; //初始化 int index = H(k);//下标 if (HT[index] == NULL)//表里没被占用 HT[index] = p;else {//被占用了,就接在当前位置的next上 HTNode q = HT[index];p->next = q->next;//头插法q->next = p;}
}
2.3、查找
先在线性表里挨个查找,当线性表里不为空时,就往当前元素的链表上查找,如果当前位置为空或者当前链表上找不到目标值,就继续往后面的位置查找。
//查找
bool FindHashTable(HTNode* HT, int k) {for (int i = 0; i < N; i++) {if (HT[i] == NULL)//该数组位置没值 continue;if (HT[i]->data == k)//找到了 return true;else { //当前位置不是要找的值但有值,就往他的链表上找 HTNode ht = HT[i];//这里要用个变量来代替查找,不然会改变原来的存储位置while (ht->next) {//链表上的查找ht = ht->next;if (ht->data == k)return true;}}}return false;
}
3、线性探测法
3.1、初始化
//线性探测法
//初始化
void initHashTable2(int* ht) {for (int i = 0; i < N; i++) {ht[i] = NULL;}
}
3.2、创建
//创建表
void createHashTable2(int** ht, int k) {int j = H(k);//数组下标 if (ht[j] == NULL) {//当前空间没被占用 ht[j] = k;}else {//当前空间被占了 while (ht[j] != NULL)//往后面空的地方找 j = (j + 1) % M;ht[j] = k;}
}
3.3、查找
//查找
int findHashTable2(int* ht, int k) {for (int i = 0; i < N; i++) {if (ht[i] == k)//返回下标 return i;}return 0;
}
4、完整测试源码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdbool.h>
#define M 13 //除留余数法的除数
#define N 12 //元素个数/*
4.设有一组关键字(19,14,23,1,68,20,84,27,56,11,10,79),建立一个哈希查找表。
(1)哈希函数采用: H(key)= key % P(其中P=13),若发生冲突后,用链地址法解决冲突。
(2)哈希函数采用: H(key)= key % P(其中P=13),若发生冲突后, 用线性探测再散列方法解决冲突。
编写程序建立哈希查找表,运行程序在表中查找68,99。
*/
//哈希表结点结构
typedef struct HTNode {int data;struct HTNode* next;
}*HTNode;
//哈希函数
int H(int n) {return n % M;
}
//链地址法
//初始化
void initHashTable(HTNode* HT) {for (int i = 0; i < N; i++)HT[i] = NULL;
}
//插入、创建
void createHashTable(HTNode* HT, int k) {HTNode p = (HTNode)malloc(sizeof(struct HTNode));p->data = k; //赋值 p->next = NULL; //初始化 int index = H(k);//下标 if (HT[index] == NULL)//表里没被占用 HT[index] = p;else {//被占用了,就接在当前位置的next上 HTNode q = HT[index];p->next = q->next;//头插法q->next = p;}
}
//输出
void printHashTable(HTNode* HT) {int i = 0;printf("序号:表头-----表体\n");for (i = 0; i < N; i++) {if (HT[i] == NULL)//有的数组空间没有值 continue;printf("%2d: %2d", i, HT[i]->data);if (HT[i]->next) {printf("-------");HTNode ht = HT[i];while (ht->next) {ht = ht->next;printf("%2d ", ht->data);}}printf("\n");}
}
//查找
bool FindHashTable(HTNode* HT, int k) {for (int i = 0; i < N; i++) {if (HT[i] == NULL)//该数组位置没值 continue;if (HT[i]->data == k)//找到了 return true;else { //当前位置不是要找的值但有值,就往他的链表上找 HTNode ht = HT[i];while (ht->next) {//链表上的查找ht = ht->next;if (ht->data == k)return true;}}}return false;
}
//线性探测法
//初始化
void initHashTable2(int* ht) {for (int i = 0; i < N; i++) {ht[i] = NULL;}
}
//创建表
void createHashTable2(int** ht, int k) {int j = H(k);//数组下标 if (ht[j] == NULL) {//当前空间没被占用 ht[j] = k;}else {//当前空间被占了 while (ht[j] != NULL)//往后面空的地方找 j = (j + 1) % M;ht[j] = k;}
}
//输出
void printHashTable2(int* ht) {for (int i = 0; i < N; i++) {printf("%d ", ht[i]);}printf("\n");
}
//查找
int findHashTable2(int* ht, int k) {for (int i = 0; i < N; i++) {if (ht[i] == k)//返回下标 return i;}return 0;
}
void menu() {printf("----------------\n1、链地址法查找\n");printf("2、线性探测查找\n----------------\n");
}
void main() {int K;int chose;int i;//拉链法关键字数组int k[N] = { 19,14,23,1,68,20,84,27,56,11,10,79 };//19,14,23,1,68,20,84,27,56,11,10,79//线性探测法关键字数组int ht[N];//哈希表数组HTNode HT[N];printf("当前关键字序列为:\n");for (int n = 0; n < N; n++) {printf("%2d ", k[n]);}printf("\n");while (1) {menu();scanf("%d", &chose);switch (chose) {case 1://先初始化哈希表initHashTable(HT);//创建哈希表for (int i = 0; i < N; i++) {createHashTable(&HT, k[i]);}//输出哈希表printHashTable(HT);printf("输入要查找的值:");scanf("%d", &K);if (FindHashTable(HT, K))printf("查找成功!\n");elseprintf("查找失败!\n");break;case 2://先初始化 initHashTable2(ht);//创建 for (int i = 0; i < N; i++) {createHashTable2(&ht, k[i]);}printf("当前哈希表:");printHashTable2(ht);printf("输入要查找的值:");scanf("%d", &K);i = findHashTable2(ht, K);//保存下标 if (i)printf("查找成功!%d的下标位置是:%d\n", K, i);elseprintf("查找失败!\n");break;default:return 0;}}
}
数据结构哈希表的基本操作(C语言)相关推荐
- Python中常用的数据结构---哈希表(字典)
Python中常用的数据结构-哈希表(字典) 常用的数据结构有数组.链表(一对一).栈和队列.哈希表.树(一对多).图(多对多)等结构. 在本目录下我们将讲解,通过python语言实现常用的数据结构. ...
- 数据结构——哈希表的详解与实现
数据结构--哈希表(HashTable) 1.前言 当我们频繁的查找数据中的某个元素时,我们通常会选择数组来存放数据,因为数组的的内存是连续的,可以直接通过下标访问数据,但是它添加和删除数据比较麻 ...
- 数据结构哈希表的实现与设计
数据结构哈希表查找姓名的课程设计 有没有大神能帮忙写一下这道题,课设的题目.用C++语言 问题描述:针对某公司中花名设计哈希表,并完成相应的建表和查表程序,基本要求: (1)假设花名为汉字拼音形式.名 ...
- java hashtable 数据结构_数据结构--哈希表(Java)
数据结构--哈希表(Java) 介绍 哈希表 底层是 数组加链表 或者是 数组加二叉树 ,一个数组里面有多个链表,通过散列函数来提高效率 代码 package cn.guizimo.hashtab; ...
- Tsai笔记:C++学习随性笔记(2)—— 数据结构:顺序表的基本操作
Tsai笔记:C++学习随性笔记(2)-- 数据结构:顺序表的基本操作 Tsai三步.(第一步,功能说明.第二步,结果图显示.第三步,代码展示) 第一步,功能说明. 1.线性表的顺序存储 线性表的顺序 ...
- 哈希表:外星语言是否排序
题目 哈希表:外星语言是否排序 https://leetcode-cn.com/problems/lwyVBB/ 解题思路 1.判断单词有序的两个条件 假设有个两个单词,word1和word2. wo ...
- 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题
layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...
- 【编程学习】浅谈哈希表及用C语言构建哈希表!
哈希表:通过key-value而直接进行访问的数据结构,不用经过关键值间的比较,从而省去了大量处理时间. 哈希函数:选择的最主要考虑因素--尽可能避免冲突的出现 构造哈希函数的原则是: ①函数本身便于 ...
- 数据结构 — 哈希表
目录 文章目录 目录 哈希表 哈希表 哈希表,又称为散列表,是根据键值对(Key/Value)进行访问的数据结构,它让 Value 经过哈希函数的转换映射到哈希表对应的位置上,查找效率非常高.哈希索引 ...
- 哈希表数据结构_算法与数据结构-哈希表
前面我们已经讲到了数组和链表,数组能通过下标 O(1) 访问,但是删除一个中间元素却要移动其他元素,时间 O(n). 循环双端链表倒是可以在知道一个节点的情况下迅速删除它,但是吧查找又成了 O(n). ...
最新文章
- 用WMI获取远程机器操作系统的详细信息
- 【译】光线跟踪:理论与实现(一) 简介
- 搭建TXManager分布式事务协调者
- tomcat限制用域名访问 禁止 ip访问
- matlab 定义一个有自变量的方程_常微分方程:(第四章) 高阶微分方程
- Oracle adviser,Oracle10g SQL tune adviser
- Java 反射(初步)
- arch linux windows,windows+Archlinux双系统安装指南(一)
- 循环机换变速箱油教程_变速箱油多久换?很多老司机都可能不知道
- filter函数 与filtfilt函数的效果区别
- nginx代理邮件服务
- B - The Suspects(并查集)详解
- 酷客多小程序百城宣讲会-郑州站圆满成功
- java tpl文件_解决Layui tpl模板渲染文件上传不起作用
- 如何把程序员从久坐颈椎病中拯救出来?我为程序员做了这个救命APP
- Linux下安装android手机ADB驱动
- 【SpringBoot】SSM“加速器”SpringBoot初体验
- 串口DCB结构详细说明
- 新闻头条自媒体系统php,新闻头条-新闻自媒体-技术博客织梦模板(带手机版)...
- 成都市等2009年《四川省建设工程清单计价定额》人工费调整的批复〔2019〕5号
热门文章
- 计算机打字皮肤怎么退出,使用搜狗输入法电脑版中设置快捷键更换皮肤的方法...
- win10备份(win10备份的系统怎么还原)
- 浏览器的窗口大小被改变时触发的事件window.onresize
- H.264再学习 -- 目前主流的几种数字视频压缩编解码标准(转载)
- 【整理】TAC码是什么?TAC码和IMEI有什么关系?
- 多少人,一边疯狂跳槽,一边疯狂后悔
- 简化函数调用之五 :Parameterize Method(令函数携带参数)
- 什么是html5页面ui,H5页面UI设计和APP设计有什么区别?
- 计算机之家 Vista Ulite 完美安装版 (Vista旗舰版)
- 超级玛丽跳 时间的优化