c语言构建哈希表

/*哈希查找

*哈希函数的构造方法常用的有5种。分别是:

*数字分析法

*平方取中法

*分段叠加

*伪随机数

*除留取余法

*这里面除留取余法比较常用

*避免哈希冲突常用的方法有4种:

*开放定址法(线性探测再散列、二次探测再散列)

*链地址法

*再哈希法

*建立公共溢出区

其中,线性探测再散列比较常用*/

这是一道2009年武汉科技大学的考研题,但是按照要求却做不出来,因为对7取模最多只有7个空间,不可能放进8个数,所以怀疑这道题是不是出错了,但这是考研题,应该不会出错吧。所以各位大神,你们怎么看?

以下是这道题的代码实现,可以看到27放不进哈希表中,因为哈希表已满!

 1 #include <stdio.h>
 2 #include <time.h>
 3 #define Max 7
 4 #define Length 10
 5 #define N 8
 6
 7 int hashtable[Length];
 8
 9 int func(int value)
10 {
11     return value % Max;
12
13 }
14
15
16 void create_hash(int key)
17 {
18     int pos, t;
19     pos = func(key);
20     printf(" %d   MOD %d = %d\n", key, Max, pos);
21     t = pos;
22     while(hashtable[t] != -1)
23     {
24         printf("(%d+1) MOD %d = %d\n", t, Max, (t+1) % Max);
25         t = (t+1) % Max;
26
27         if(pos == t)
28         {
29
30             printf("Hash table is full!\n");
31             return;
32         }
33
34     }
35     hashtable[t] = key;
36
37 }
38
39 main()
40 {
41     int flag[N] = {75, 33, 52, 41, 12, 88, 66, 27};
42     int i, j, t;
43     for(i = 0; i < Length; i++)
44         hashtable[i] = -1;
45
46     i = 0;
47     while(i != N)
48     {
49         t = flag[i];
50
51             create_hash(t);
52             printf("    ------------------------------------------------------------\n");
53             printf("    |  0 ||  1 ||  2 ||  3 ||  4 ||  5 ||  6 ||  7 ||  8 ||  9 |\n");
54             printf("    ------------------------------------------------------------\n");
55             printf("%2d: ", t);
56             for(j = 0; j < Length; j++)
57                 printf("| %2d |", hashtable[j]);
58
59             printf("\n");
60             printf("    ------------------------------------------------------------\n");
61
62             i++;
63
64
65     }
66
67 }

运行结果:

原文地址:https://www.cnblogs.com/junsircoding/p/hashmap.html

时间: 2024-10-28 16:17:15

c语言构建哈希表的相关文章

C语言-简单哈希表(hash table)

腾讯三面的时候,叫我写了个哈希表,当时紧张没写好···结果跪了··· 回来后粪发涂墙,赶紧写了一个! 什么都不说了···先让我到厕所里面哭一会··· %>_<% 果然现场发挥,以及基础扎实才是important的! 用链地址法解决冲突的哈希表(C语言,VS2008编写.测试): 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <string.h>

上古时代 Objective-C 中哈希表的实现

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明. 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable : NXHashTable 的实现 NXHashTable 的性能分析 NXHashTable 的作用 NXHashTable 的实现有着将近 30 年的历史,不过仍然作为重要的底层数据结构存储整个应用中的类. 文中

数据结构之哈希表

最近看PHP数组底层结构,用到了哈希表,所以还是老老实实回去看结构,在这里去总结一下. 1.哈希表的定义 这里先说一下哈希表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方,说起来可能感觉有点复杂,我想我举个例子你就会明白了,最典型的的例子就是字典,大家估计小学的时候也用过不少新华字典吧,如果我想要获取“按”字详细信息,我肯定会去根据拼音an去查找 拼音索引(当然也可以是偏旁索引),我们首先去查an在字典的位置,查了一下得到“安”,结果如下.这

MIT算法导论——第七讲.哈希表

从作用上来讲,构建哈希表的目的是把搜索的时间复杂度降低到O(1),考虑到一个长度为n的序列,如果依次去比较进行搜索的话,时间复杂度是θ(n),或者对其先进行排序然后再搜索会更快一些,但这两种方法都不是最快的方法. 哈希表也叫散列表,他通过一个哈希函数H,把要存储的内容取一个键值,经过H的运算,把键值映射到一个有m个槽的表中去,最简单的例子就是手机里存储别人的电话号码,键值就是名字,内容就是电话号码等个人信息.这样的表有一个最大的好处就是一旦要查找某个值,比如说"张三"的电话号码,我们把

哈希表的基本操作

散列(hash)表/哈希表 1.关键字和和存储的地址建立一个对应的关系:Add = Hash(key): 2. 解决冲突方法: (1)开放定址法 – 探测方式:线性探测.二次探测. (2)再哈希法 (3)分离链接法 – 利用链表的方式. (4)公共溢出区法 3.存储结构:用顺序存储来构建哈希表.构建结构数组 注意:使用不同的哈希函数得到的冲突次数不同. ---------------------------------------------------------------------- 除

哈希表中的查找

基本概念 哈希表(hash table):又称散列表,其基本思路是,设要存储的元素个数是n,设置一个长度为m的连续存储单元,以每个元素的关键字作为自变量,通过哈希函数(h(k))把k映射到一个内存单元,并把该元素存在这个内存单元中,把像这样构造的线性表存储结构称为哈希表. 哈希冲突(hash collisions):在构建哈希表时,出现两个不同关键词对应相同的哈希值,这种现象称作哈希冲突. 装填因子(loading factor):设哈希表空间大小为n,填入表中元素个数为m,则$α=/frac{

R语言——哈希表

前言: 在 R 语言中有个包--hash 包提供了我们需要的哈希结构,本文主要介绍该 hash 包的使用. (使用之前先 install.packages("hash") 进行安装) 其实,数据框也可以实现哈希表的功能,但是效率不高,操作也不方便. 另外,曾经出现过 rdict 包,使用起来就像 Python 里面的字典一样好用,详情请见:rdict: A hash table for R using skip lists.但是好像后来被 CRAN 取消了,也有可能是把它合并到其它包里

简单的哈希表实现 C语言

简单的哈希表实现 简单的哈希表实现 原理 哈希表和节点数据结构的定义 初始化和释放哈希表 哈希散列算法 辅助函数strDup 哈希表的插入和修改 哈希表中查找 哈希表元素的移除 哈希表打印 测试一下 这是一个简单的哈希表的实现,用c语言做的. 原理 先说一下原理. 先是有一个bucket数组,也就是所谓的桶. 哈希表的特点就是数据与其在表中的位置存在相关性,也就是有关系的,通过数据应该可以计算出其位置. 这个哈希表是用于存储一些键值对(key -- value)关系的数据,其key也就是其在表中

C语言实现的哈希表

C语言实现的哈希表哈希表可以简单理解为多个链表的集合,将每个新的成员根据其哈希值进行分类,这样可以加快链表的查找速度参考:https://www.cnblogs.com/s-b-b/p/6208565.html #include <stdio.h> #include <stdlib.h> #include <string.h> #define HASHSIZE 10 typedef unsigned int uint; /*定义一个链表的节点*/ typedef str