c语言构建哈希表

这是一道2009年武汉科技大学的考研题,但是按照要求却做不出来,因为对7取模最多只有7个空间,不可能放进8个数,所以怀疑这道题是不是出错了,但这是考研题,应该不会出错吧。所以各位大神,你们怎么看?
以下是这道题的代码实现,可以看到27放不进哈希表中,因为哈希表已满!
#include <stdio.h>
#include <time.h>
#define Max 7
#define Length 10
#define N 8 int hashtable[Length]; int func(int value)
{
return value % Max; } void create_hash(int key)
{
int pos, t;
pos = func(key);
printf(" %d MOD %d = %d\n", key, Max, pos);
t = pos;
while(hashtable[t] != -)
{
printf("(%d+1) MOD %d = %d\n", t, Max, (t+) % Max);
t = (t+) % Max; if(pos == t)
{ printf("Hash table is full!\n");
return;
} }
hashtable[t] = key; } main()
{
int flag[N] = {, , , , , , , };
int i, j, t;
for(i = ; i < Length; i++)
hashtable[i] = -; i = ;
while(i != N)
{
t = flag[i]; create_hash(t);
printf(" ------------------------------------------------------------\n");
printf(" | 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 |\n");
printf(" ------------------------------------------------------------\n");
printf("%2d: ", t);
for(j = ; j < Length; j++)
printf("| %2d |", hashtable[j]); printf("\n");
printf(" ------------------------------------------------------------\n"); i++; } }
运行结果:

问题解决了!感谢可爱又靠谱的老师和帮我转发消息的baby!

之前的理解有误,以为不论是第一次代入函数计算还是处理冲突都是对函数给定的值取余,正确的是哈希函数对函数给定的值取余,处理冲突对表长取余。代码更正如下:
/*哈希查找
*哈希函数的构造方法常用的有5种。分别是:
*数字分析法
*平方取中法
*分段叠加
*伪随机数
*除留取余法
*这里面除留取余法比较常用
*避免哈希冲突常用的方法有4种:
*开放定址法(线性探测再散列、二次探测再散列)
*链地址法
*再哈希法
*建立公共溢出区
其中,线性探测再散列比较常用*/
#include <stdio.h>
#include <time.h>
#define Max 7
#define Length 10
#define N 8 int hashtable[Length]; int func(int value)
{
return value % Max; } void create_hash(int key)
{
int pos, t;
pos = func(key);
printf(" %d MOD %d = %d\n", key, Max, pos);
t = pos;
while(hashtable[t] != -)
{
printf("(%d+1) MOD %d = %d\n", t, Length, (t+) % Length);
t = (t+) % Length; if(pos == t)
{ printf("Hash table is full!\n");
return;
} }
hashtable[t] = key; } main()
{
int flag[N] = {, , , , , , , };
int i, j, t;
for(i = ; i < Length; i++)
hashtable[i] = -; i = ;
while(i != N)
{
t = flag[i]; create_hash(t);
printf(" ------------------------------------------------------------\n");
printf(" | 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 |\n");
printf(" ------------------------------------------------------------\n");
printf("%2d: ", t);
for(j = ; j < Length; j++)
printf("| %2d |", hashtable[j]); printf("\n");
printf(" ------------------------------------------------------------\n"); i++; } }
运行结果:


c语言构建哈希表的更多相关文章
- 【编程学习】浅谈哈希表及用C语言构建哈希表!
哈希表:通过key-value而直接进行访问的数据结构,不用经过关键值间的比较,从而省去了大量处理时间. 哈希函数:选择的最主要考虑因素--尽可能避免冲突的出现 构造哈希函数的原则是: ①函数本身便于 ...
- C语言-简单哈希表(hash table)
腾讯三面的时候,叫我写了个哈希表,当时紧张没写好···结果跪了··· 回来后粪发涂墙,赶紧写了一个! 什么都不说了···先让我到厕所里面哭一会··· %>_<% 果然现场发挥,以及基础扎实 ...
- 数据结构---哈希表的C语言实现(闭散列)
原文地址:https://blog.csdn.net/weixin_40331034/article/details/79461705 构造一种存储结构,通过某种函数(hashFunc)使元素的存储位 ...
- 理解Golang哈希表Map的元素
目录 概述 哈希函数 冲突解决 初始化 结构体 字面量 运行时 操作 访问 写入 扩容 删除 总结 在上一节中我们介绍了 数组和切片的实现原理,这一节会介绍 Golang 中的另一个集合元素 - 哈希 ...
- Leetcode No.1 Two Sum(c++哈希表实现)
1. 题目 1.1 英文题目 Given an array of integers nums and an integer target, return indices of the two numb ...
- 集合>哈希表类Hashtable和SortedList排序列表类
集合>哈希表类Hashtable Hashtable一种键值对的集合 ,哈希表内部的排列是无序的,而且哈希表没有提供排序方法. 集合>哈希表类Hashtable>构造普通哈希表 代码 ...
- 算法与数据结构(十二) 散列(哈希)表的创建与查找(Swift版)
散列表又称为哈希表(Hash Table), 是为了方便查找而生的数据结构.关于散列的表的解释,我想引用维基百科上的解释,如下所示: 散列表(Hash table,也叫哈希表),是根据键(Key)而直 ...
- Java中哈希表(Hashtable)是如何实现的
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
- 从Dictionary源码看哈希表
一.基本概念 哈希:哈希是一种查找算法,在关键字和元素的存储地址之间建立一个确定的对应关系,每个关键字对应唯一的存储地址,这些存储地址构成了有限.连续的存储地址. 哈希函数:在关键字和元素的存储地址之 ...
随机推荐
- Oracle:查询各组最新的一条记录
oracle中怎么查询各组中最新的一条记录呢?比如说现在有一个表中几条数据如下: 有两种写法:写法一:over partition by 分析函数 SELECT * FROM (select ID_, ...
- Tensorflow图像处理以及数据读取
关于tensoflow的图像的处理,看到了一篇文章,个人觉得不错.https://blog.csdn.net/weiwei9363/article/details/79917942
- tensorflow安装和初使用
本文的目的是为了复习并帮助刚开始起步使用机器学习的人员 1.安装准备 为了方便就在window上安装,我的是window10 的笔记本,首先准备python 因为tensorflow在仅仅支持wind ...
- Sprite/MovieClip的Enter_Frame事件,不受addChild/removeChild影响
简单点讲:Sprite或MovieClip对象一旦为其添加了Enter_Frame事件监听,对应的Enter_Frame处理函数将会马上被调用,并一直执行下去(不管你是否将其addChild到显示列表 ...
- day49 定位布局和过渡动画
复习 1.盒子在父级水平居中 margin: 0 auto; 2.文本样式操作 color: red; text-align: center; font: 900 30px/200px "S ...
- Python学习—基础篇之常用模块
常用模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...
- ES6学习笔记(函数)
1.函数参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') { console.log(x, y); } log(' ...
- pwnable.kr-random-witeup
看源代码. 可知,在linux下生成个随机数在于输入数异或等于固定值即可,而且吧, 随机数是固定的. 先得出随机数. random=1804289383 OK,接下来用计算器异或就行啦.0xB526F ...
- 转*SqlSever查询某个表的列名称、说明、备注、注释,类型等
@原文地址 关键部分如下: ------sqlserver 查询某个表的列名称.说明.备注.类型等 SELECT 表名 then d.name else '' end, 表说明 then isnull ...
- linux中service XX start与直接运行/usr/bin/xx start的区别
在linux想要运行启动一个服务有两种方法: 1,运行/etc/init.d/目录下的shell脚本,还可以有快捷方式,service *** start/ stop/restart /status, ...