设有一组关键字(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语言)相关推荐

  1. Python中常用的数据结构---哈希表(字典)

    Python中常用的数据结构-哈希表(字典) 常用的数据结构有数组.链表(一对一).栈和队列.哈希表.树(一对多).图(多对多)等结构. 在本目录下我们将讲解,通过python语言实现常用的数据结构. ...

  2. 数据结构——哈希表的详解与实现

    数据结构--哈希表(HashTable) 1.前言 ​ 当我们频繁的查找数据中的某个元素时,我们通常会选择数组来存放数据,因为数组的的内存是连续的,可以直接通过下标访问数据,但是它添加和删除数据比较麻 ...

  3. 数据结构哈希表的实现与设计

    数据结构哈希表查找姓名的课程设计 有没有大神能帮忙写一下这道题,课设的题目.用C++语言 问题描述:针对某公司中花名设计哈希表,并完成相应的建表和查表程序,基本要求: (1)假设花名为汉字拼音形式.名 ...

  4. java hashtable 数据结构_数据结构--哈希表(Java)

    数据结构--哈希表(Java) 介绍 哈希表 底层是 数组加链表 或者是 数组加二叉树 ,一个数组里面有多个链表,通过散列函数来提高效率 代码 package cn.guizimo.hashtab; ...

  5. Tsai笔记:C++学习随性笔记(2)—— 数据结构:顺序表的基本操作

    Tsai笔记:C++学习随性笔记(2)-- 数据结构:顺序表的基本操作 Tsai三步.(第一步,功能说明.第二步,结果图显示.第三步,代码展示) 第一步,功能说明. 1.线性表的顺序存储 线性表的顺序 ...

  6. 哈希表:外星语言是否排序

    题目 哈希表:外星语言是否排序 https://leetcode-cn.com/problems/lwyVBB/ 解题思路 1.判断单词有序的两个条件 假设有个两个单词,word1和word2. wo ...

  7. 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题

    layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...

  8. 【编程学习】浅谈哈希表及用C语言构建哈希表!

    哈希表:通过key-value而直接进行访问的数据结构,不用经过关键值间的比较,从而省去了大量处理时间. 哈希函数:选择的最主要考虑因素--尽可能避免冲突的出现 构造哈希函数的原则是: ①函数本身便于 ...

  9. 数据结构 — 哈希表

    目录 文章目录 目录 哈希表 哈希表 哈希表,又称为散列表,是根据键值对(Key/Value)进行访问的数据结构,它让 Value 经过哈希函数的转换映射到哈希表对应的位置上,查找效率非常高.哈希索引 ...

  10. 哈希表数据结构_算法与数据结构-哈希表

    前面我们已经讲到了数组和链表,数组能通过下标 O(1) 访问,但是删除一个中间元素却要移动其他元素,时间 O(n). 循环双端链表倒是可以在知道一个节点的情况下迅速删除它,但是吧查找又成了 O(n). ...

最新文章

  1. 用WMI获取远程机器操作系统的详细信息
  2. 【译】光线跟踪:理论与实现(一) 简介
  3. 搭建TXManager分布式事务协调者
  4. tomcat限制用域名访问 禁止 ip访问
  5. matlab 定义一个有自变量的方程_常微分方程:(第四章) 高阶微分方程
  6. Oracle adviser,Oracle10g SQL tune adviser
  7. Java 反射(初步)
  8. arch linux windows,windows+Archlinux双系统安装指南(一)
  9. 循环机换变速箱油教程_变速箱油多久换?很多老司机都可能不知道
  10. filter函数 与filtfilt函数的效果区别
  11. nginx代理邮件服务
  12. B - The Suspects(并查集)详解
  13. 酷客多小程序百城宣讲会-郑州站圆满成功
  14. java tpl文件_解决Layui tpl模板渲染文件上传不起作用
  15. 如何把程序员从久坐颈椎病中拯救出来?我为程序员做了这个救命APP
  16. Linux下安装android手机ADB驱动
  17. 【SpringBoot】SSM“加速器”SpringBoot初体验
  18. 串口DCB结构详细说明
  19. 新闻头条自媒体系统php,新闻头条-新闻自媒体-技术博客织梦模板(带手机版)...
  20. 成都市等2009年《四川省建设工程清单计价定额》人工费调整的批复〔2019〕5号

热门文章

  1. 计算机打字皮肤怎么退出,使用搜狗输入法电脑版中设置快捷键更换皮肤的方法...
  2. win10备份(win10备份的系统怎么还原)
  3. 浏览器的窗口大小被改变时触发的事件window.onresize
  4. H.264再学习 -- 目前主流的几种数字视频压缩编解码标准(转载)
  5. 【整理】TAC码是什么?TAC码和IMEI有什么关系?
  6. 多少人,一边疯狂跳槽,一边疯狂后悔
  7. 简化函数调用之五 :Parameterize Method(令函数携带参数)
  8. 什么是html5页面ui,H5页面UI设计和APP设计有什么区别?
  9. 计算机之家 Vista Ulite 完美安装版 (Vista旗舰版)
  10. 超级玛丽跳 时间的优化