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源码看哈希表
一.基本概念 哈希:哈希是一种查找算法,在关键字和元素的存储地址之间建立一个确定的对应关系,每个关键字对应唯一的存储地址,这些存储地址构成了有限.连续的存储地址. 哈希函数:在关键字和元素的存储地址之 ...
随机推荐
- python day11 函数(第三篇)
2019.4.11 S21 day11笔记总结 1. 函数小高级 ( 5* ) 1 函数名可以当作变量来使用 def func(): print(123) v1 = func # func代表函数的地 ...
- 知识点---js监听手机返回键,回到指定界面
方法一. $(function(){ pushHistory(); window.addEventListener(“popstate”, function(e) { window.location ...
- Lua + Redis 解决高并发
一.业务背景 优惠券业务主要提供用户领券和消券的功能:领取优惠券的动作由用户直接发起,由于资源有限,我们必须对用户的领取动作进行一些常规约束. 约束1(优惠券维度): 券的最大数量 max: 约束2( ...
- CentOS7 yum安装配置 drbd-84-utils (外部模式)
1 安装环境介绍 1.1 系统环境 内核:3.10.0-862.el7.x86_64 版本:CentOS Linux release 7.5.1804 (Core) 主服务器:hostname = ...
- HBase 数据迁移方案介绍
一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类: 图1.HBase数据迁移方案 从上面图中可看出,目前的方案主要有四类,Hadoop层有一类,HBase层有三类.下 ...
- 浅析MVC模式与三层架构的区别
浅析MVC模式与三层架构的区别 三层架构和MVC是有明显区别的,MVC应该是表现模式(三个加起来以后才是三层架构中的UI层).三层架构(3-tier application) 通常意义上的三层架构就是 ...
- Qt5.12.2开发Android环境搭建
Qt-Android开发环境概要qt-opensource-windows-x86-5.12.2----armv7jdk-8u201-windows-x64android-ndk-r18b-windo ...
- 4.Redis客户端
4.Redis客户端4.1 客户端通信协议4.2 Java客户端Jedis4.2.1 获取Jedis4.2.2 Jedis的基本使用方法4.2.3 Jedis连接池的使用方法4.2.4 Redis中P ...
- 原生js简单轮播图 代码
在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写的插件,今天就写个简单的适合入门者学习的小教程.当然,轮播图的实现原理与设计模式有很多种,我这里讲的是用 ...
- Skipping acquire of configured file ···doesn't support architecture 'i386' acquire of configured file
系统更新的时候报错: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'http://rep ...