散列表上的运算

合集下载

散列表的算法流程

散列表的算法流程

散列表的算法流程
散列表的算法流程如下:
1. 定义散列表大小n,创建一个大小为n的数组。

2. 定义散列函数,将输入的关键字映射为散列地址。

3. 插入操作:
a. 通过散列函数,将关键字映射为散列地址。

b. 如果该地址为空,则直接将关键字插入到该地址。

c. 如果该地址不为空,则采用开放地址法或链式法解决冲突,直到找到一个空地址插入关键字。

4. 查找操作:
a. 通过散列函数,将关键字映射为散列地址。

b. 如果该地址为空,则关键字不存在。

c. 如果该地址不为空且关键字匹配,则找到了该关键字。

d. 如果该地址不为空但关键字不匹配,则采用开放地址法或链式法继续查找,直到找到匹配的关键字或空地址为止。

5. 删除操作:
a. 通过查找操作找到待删除的关键字。

b. 将该位置标记为空。

以上是散列表的基本算法流程,开放地址法和链式法是解决冲突的两种常见算法。

在开放地址法中,还有线性探测、二次探测等不同的方式。

在链式法中,需要建
立链表结构。

散列链接算法

散列链接算法

散列链接算法
散列链接算法是一种常用的哈希表实现方法。

它主要涉及到两个步骤:哈希函数和链表。

哈希函数:这是一个将输入(通常是字符串或对象)转换为固定大小
哈希值的函数。

它的目标是尽可能均匀地分布哈希值,以便不同的输
入能得到不同的哈希值,从而实现高效的查找。

常用的哈希函数有直
接寻址法、除法取余法、碰撞处理法等。

链表:在散列表中,每个键值对都由一个哈希值来唯一确定一个桶(bucket),这个桶里通常会有一个链表,用于存放具有相同哈希值
的键值对。

如果某个键在哈希表中不存在,或者发生哈希冲突,则会
新建一个空链表并加入该键。

如果链表中已经有该键的节点,那么就
把新节点插入到链表的合适位置。

这种算法的主要优点是查找速度快,平均时间复杂度为O(1)。

缺点是
插入和删除的时间复杂度较高,因为可能需要移动链表中的节点。

此外,如果哈希函数设计不当,可能会发生哈希冲突(即两个不同的输
入产生相同的哈希值),这会导致性能下降。

一些常见的散列链接算法包括开放寻址法、再哈希等。

具体使用哪种
算法取决于具体的应用场景和需求。

excel 散列函数

excel 散列函数

excel 散列函数
Excel中的散列函数是用于生成散列值的函数。

散列函数将输入数据转换为固定长度的散列值,通常用于数据加密、数据完整性校验和数据索引等方面。

Excel中常用的散列函数有如下几个:
1. MD5:MD5函数将输入数据转换为128位的散列值,通常用于数据加密和数据完整性校验。

例如,`=MD5(A1)`将计算A1单元格中的数据的MD5散列值。

2. SHA1:SHA1函数将输入数据转换为160位的散列值,也常用于数据加密和数据完整性校验。

例如,`=SHA1(A1)`将计算A1单元格中的数据的SHA1散列值。

3. SHA256:SHA256函数将输入数据转换为256位的散列值,也常用于数据加密和数据完整性校验。

例如,`=SHA256(A1)`将计算A1单元格中的数据的SHA256散列值。

这些散列函数通常用于数据加密和数据完整性校验。

在使用散列函数时,应注意选择适当的散列算法和适当的散列长度,以确保数据的安全和完整性。

JS中数据结构之散列表

JS中数据结构之散列表

JS中数据结构之散列表散列是⼀种常⽤的数据存储技术,散列后的数据可以快速地插⼊或取⽤。

散列使⽤的数据结构叫做散列表。

在散列表上插⼊、删除和取⽤数据都⾮常快。

下⾯的散列表是基于数组进⾏设计的,数组的长度是预先设定的,如有需要,可以随时增加。

所有元素根据和该元素对应的键,保存在数组的特定位置。

使⽤散列表存储数据时,通过⼀个散列函数将键映射为⼀个数字,这个数字的范围是0到散列表的长度。

散列函数会将每个键值映射为⼀个唯⼀的数组索引。

然⽽,键的数量是⽆限的,数组的长度是有限的,⼀个更现实的⽬标是让散列函数尽量将键均匀地映射到数组中。

即使使⽤⼀个⾼效的散列函数,仍然存在将两个键映射成同⼀个值的可能,这种现象称为碰撞(collision),当碰撞发⽣时,我们需要利⽤⼀定的⽅法去解决碰撞。

对数组⼤⼩常见的限制是:数组长度应该是⼀个质数。

HashTable类使⽤ HashTable 类来表⽰散列表,该类包含计算散列值的⽅法、向散列中插⼊数据的⽅法、从散列表中读取数据的⽅法、显⽰散列表中数据分布等⽅法。

function HashTable() { this.table = new Array(137); this.simpleHash = simpleHash; this.showDistro = showDistro; this.put = put; this.get = get; this.buildChains = buildChains;}散列函数散列函数的选择依赖于键值的数据类型。

如果键是整型,最简单的散列函数就是以数组的长度对键取余,这种散列⽅式称为除留余数法。

选择针对字符串类型的散列函数⽐较困难简单的散列函数:字符串中每个字符的 ASCII 码值相加然后再除以数组长度,将得出的余数做为散列值。

function simpleHash(data) { var total = 0; for (var i = 0; i < data.length; ++i) { total += data.charCodeAt(i); } return total % this.table.length;}put() 和 showDistro(),⼀个⽤来将数据存⼊散列表,⼀个⽤来显⽰散列表中的数据function put(data) { var pos = this.simpleHash(data); this.table[pos] = data;}function showDistro() { var n = 0; for (var i = 0; i < this.table.length; ++i) { if (this.table[i] != undefined) { print(i + ": " + this.table[i]); } }}使⽤简答的散列函数 simpleHash() 时数据并不是均匀分布的,⽽是向数组的两端集中,并且数据很⼤概率将会产⽣碰撞⽽不会全部显⽰出来。

散列法

散列法
字符组成的字符串转换为固定长度的数值或索引值的方法
01 定义
03 哈希函数
目录
02 散列算法
基本信息
散列法(Hashing)或哈希法是一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引 值的方法,称为散列法,也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用 来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。
散列算法
散列算法
也称为哈希函数——哈希的英文意思为“无用信息”,因此哈希函数一词的由来可能是因为最终形成的哈希 表里面是各种看起来没有用的数字。除用来快速搜索数据外,散列法还用来完成签名的加密解密工作,这种签名 可以用来对收发消息时的用户签名进行鉴权。先用哈希函数对数据签名进行转换,然后将数字签名本身和转换后 的信息摘要分别独立的发送给接收人。通过利用和发送人一样的哈希函数,接收人可以从数字签名获得一个信息 摘要,然后将此摘要同传送过来的摘要进行比较,这两个值相等则表示数字签名有效。
哈希函数
哈希函数
1)余数法:先估计整个哈希表中的表项目数目大小。然后用这个估计值作为除数去除每个原始值,得到商 和余数。用余数作为哈希值。因为这种方法产生冲突的可能性相当大,因此任何搜索算法都应该能够判断冲突是 否发生并提出取代算法。
2)折叠法:这种方法是针对原始值为数字时使用,将原始值分为若干部分,然后将各部分叠加,得到的最 后四个数字(或者取其他位数的数字都可以)来作为哈希值。
哈希函数并不通用,比如在数据库中用能够获得很好效果的哈希函数,用在密码学或错误校验方面就未必可 行。在密码学领域有几个著名的哈希函数。这些函数包括 MD2、MD4以及MD5,利用散列法将数字签名转换成的哈 希值称为信息摘要(message-digest),另外还有安全散列算法(SHA),这是一种标准算法,能够生成更大的 (60bit)的信息摘要,有点儿类似于MD4算法。

双重散列探查法的计算公式

双重散列探查法的计算公式

双重散列探查法的计算公式双重散列是线性开型寻址散列(开放寻址法)中的冲突解决技术。

双重散列使用在发生冲突时将第二个散列函数应用于键的想法。

此算法使用:(hash1(key) + i * hash2(key)) % TABLE_SIZE来进行双哈希处理。

hash1()和hash2()是哈希函数,而TABLE_SIZE是哈希表的大小。

当发生碰撞时,我们通过重复增加步长i来寻找键。

第一个Hash函数:hash1(key) = key %TABLE_SIZE。

散列(Hashing)是计算机科学中一种对资料的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构(称为散列表)。

二次再散列法是指第一次散列产生哈希地址冲突,为了解决冲突,采用另外的散列函数或者对冲突结果进行处理的方法。

设所有可能出现的关键字集合记为U(简称全集)。

实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。

散列方法是使用函数h将U映射到表T[0..m-1]的下标上(m=O(|U|))。

这样以U中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。

从而达到在O(1)时间内就可完成查找。

其中:①h:U→{0,1,2,…,m-1} ,通常称h为散列函数(Hash Function)。

散列函数h的作用是压缩待处理的下标范围,使待处理的|U|个值减少到m个值,从而降低空间开销。

②T为散列表(Hash Table)。

③h(Ki)(Ki∈U)是关键字为Ki结点存储地址(亦称散列值或散列地址)。

④将结点按其关键字的散列地址存储到散列表中的过程称为散列(Hashing)。

c实现的hash表-概述说明以及解释

c实现的hash表-概述说明以及解释

c实现的hash表-概述说明以及解释1.引言1.1 概述在计算机科学中,哈希表(Hash Table),又被称为散列表,是一种常用的数据结构。

它能够以常数时间复杂度(O(1))来实现插入、删除和查找等操作,因此具有高效的特性。

哈希表通过哈希函数将键(key)映射到一个固定大小的数组(通常称为哈希表)。

通过这种映射关系,我们可以在数组中快速访问到对应的值(value)。

常见的应用场景包括缓存系统、数据库索引、编译器符号表等。

相对于其他数据结构,哈希表具有以下优点:1. 高效的插入、删除和查找操作:哈希表在插入、删除和查找数据时以常数时间复杂度进行操作,无论数据量大小,都能快速地完成操作。

2. 高效的存储和检索:通过哈希函数的映射关系,哈希表能够将键值对存储在数组中,可以通过键快速地找到对应的值。

3. 空间效率高:哈希表通过哈希函数将键映射到数组下标,能够充分利用存储空间,避免冗余的存储。

然而,哈希表也存在一些局限性:1. 冲突问题:由于哈希函数的映射关系是将多个键映射到同一个数组下标上,可能会导致冲突。

解决冲突问题的常见方法包括链地址法(Chaining)和开放定址法(Open Addressing)等。

2. 内存消耗:由于哈希表需要维护额外的空间来存储映射关系,所以相比于其他数据结构来说,可能会占用较多的内存。

本篇长文将重点介绍C语言实现哈希表的方法。

我们将首先讨论哈希表的定义和实现原理,然后详细介绍在C语言中如何实现一个高效的哈希表。

最后,我们将总结哈希表的优势,对比其他数据结构,并展望哈希表在未来的发展前景。

通过本文的学习,读者将能够深入理解哈希表的底层实现原理,并学会如何在C语言中利用哈希表解决实际问题。

1.2 文章结构本文将围绕C语言实现的hash表展开讨论,并按照以下结构进行组织。

引言部分将对hash表进行概述,介绍hash表的基本概念、作用以及其在实际应用中的重要性。

同时,引言部分还会阐述本文的目的,即通过C语言实现的hash表,来探讨其实现原理、方法以及与其他数据结构的对比。

散列函数之简单散列函数算法

散列函数之简单散列函数算法

散列函数之简单散列函数算法1. 问题设有10个⾮负整数,⽤不多于20个的储存单元来存放,如何存放这10个数,使得搜索其中的某⼀个数时,在储存单元中查找的次数最少?问题类似于,有10个带号码的球,放到编号为{0, 1, 2, …, 19}共20个盒⼦中,每个盒⼦最多放⼀个,问如何放,使能够⽤最少的次数打开盒⼦,知道任⼀个球所在的盒⼦编号?2. 分析2.1 最简单的情况设10个球的号码分别是: {1, 2, 3, …, 10}那么我们只要10个盒⼦,按顺序依次将球放⼊{1, 2, 3, …, 10}中,那么任⼀个球的所在的盒⼦就是球的号码,打开对应编号的盒⼦,⼀次即可找到这个球当然,我们还可以这样放:设球的号码 = n, 盒⼦的编号 = k (k ∈ {0, 1, 2, …., 9})球放⼊盒⼦的⽅式 f(n) = (n + x) % m = (n + x) % 10即将每个球偏移x个位置,当x = 1时,则如:1号球放到2号盒⼦,2号球放到3号盒⼦,依次类推,最后10号球将在0号盒⼦这就是最简单的散列函数了,当处理球号为{4, 5, 6, …, 13}, {22, 23, 24, …, 31}这样起点不同的球号组合时,可以通杀。

进⼀步,如果10个球中,所有的球号除以盒⼦数20,所得的余数都不相同,即没有冲突,仍可以⽤该散列函数处理,如{0, 1, 3, 5, 6, 7, 9, 13, 14, 17, 39}除20后所得余数为{0, 1, 3, 5, 6, 7, 9, 13, 14, 17, 19},都没有冲突,依然可以⽤该散列函数处理很类似于古代西⽅国家流⾏的⼀种加密⽅式,将每个字母都往后顺移x个位,如good,都顺移⼀个位,则变成hppe了,即使密报被截获,不懂的⼈根本不知道是个啥意思,接收⽅的⼈只要把每个字母往后回移⼀位即可得原⽂。

这种⽅法简单,好⽤,但对于10个数不连续或者没有规律的情况下,且不满⾜模m(盒⼦总数)⽆冲突的条件时,就⽆法处理了,如{0, 1, 2, 7, 9, 15, 19, 20, 77, 38},因为最⼤的数出现了77,除⾮有77个盒⼦,才能⽤上述⽅法,当有球号码是10000时,就得10000个盒⼦来放10个球,严重浪费空间2.2 改进的⽅案因为有20个盒⼦,我们可以⽤2.1的⽅法先放⼀部分球到编号为{0, 1, 2, …, 9}的盒⼦中,为了简单,这⾥设x = 0:f(n) = n % 10则{0, 1, 2, 7, 9, 15, 19, 20, 77, 38}分别可以放到对应编号为如下的盒⼦中:{0, 1, 2, 7, 9, 5, 9, 0, 7, 8}我们看到0号球和20号球都需要放⼊0号盒⼦,这就产⽣了⼀个冲突(因为⼀个盒⼦最多只能放⼀个球,类似⼀个内存地址只能放⼀个数),为了解决这种冲突,我们把有冲突的球放到第2组编号为{10, 11, 12, …, 19}的10个盒⼦中,则这10个存放的情况如下:0123456789盒⼦1编号球号01215389剩下的冲突的球{19, 20, 77}从⼩到⼤依次放⼊第2组盒⼦:10111213141516171819盒⼦2编号球号192077当要查找某⼀个球x时,先计算f(x) = (x % 10),如果f(x)对应的盒⼦中就是这个球,则只要1次就能找到,和2.1的⽅法⼀样但当球x不在f(x)盒⼦中时,则往第2组盒⼦中查找,因为第2组盒⼦是有序的,我们⽤⼆分查找,可在log2(n)次内找到其对应的球(n = 第⼆组盒⼦中球的数量)那么这种算法的最坏情况是什么呢?我们可以看出,只要不能在第⼀组盒⼦中找到该球,则其需要log2(n)次才能找到,当n最⼤时,即n = 10(因为最多只有10个球),表⽰10个球都在第2组盒⼦中此时,需要的次数 = log2(10) = 3,加上在第⼀组盒⼦中找的⼀次,共需要4次3. 有没有更好的⽅法?从2.2的算法中,我们可以看到,其最终还是⽤到了⼆分查找,最坏的查找次数为log2(n),当球的数量增加时,则需打开盒⼦的次数也要增加,这就不是散列函数了,如⽤来做STL中的map容器,查找某个key对应的值也将不是常量时间,那么有没有更好的算法使其时间复杂度降为常量呢?⽅法2.2的问题主要是由于有冲突,从⽽会导致需要⼆分查找,如果能有⼀种⽅法能解决掉该冲突问题,那么即可将时间复杂度降为常量范围。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5、性能分析 插入和删除的时间均取决于查找,故下面只分析查找操作的时间性能。 虽然散列表在关键字和存储位置之间建立了对应关系,理想情况是无须关键字的比较就可找到待查关 键字。但是由于冲突的存在,散列表的查找过程仍是一个和关键字比较的过程,不过散列表的平均查找长度 比顺序查找、二分查找等完全依赖于关键字比较的查找要小得多。
typedef typedef
int keytype; char datatype;
typedef struct nodetype { keytype key; datatype other; struct nodetype *pNext; }chainhash; chainhash *HTC[M]; int H(keytype k) { return k%p; } chainhash *Chnsrch(chainhash *HTC[],keytype k) { chainhash *q; q=HTC[H(k)]; while(q&&(q->key!=k)) q=q->pNext; return q; } void Cinsert(chainhash *HTC[],chainhash * s) { int d; chainhash *q; q=Chnsrch(HTC,s->key); if(q) printf("ERROR"); else { d=H(s->key); s->pNext=HTC[d]; HTC[d]=s;
(1)查找成功的ASL 散列表上的查找优于顺序查找和二分查找。 【例】在例9.1和例9.2的散列表中,在结点的查找概率相等的假设下,线性探查法和拉链法查找成功的 平均查找长度分别为: ASL=(1×6+2×2+3×l+9×1)/10=2.2 //线性探查法 ASL=(1×7+2×2+3×1)/10=1.4 //拉链法 而当n=10时,顺序查找和二分查找的平均查找长度(成功时)分别为: ASL=(10+1)/2=5.5 //顺序查找 ASL=(1×l+2×2+3×4+4×3)/10=2.9 //二分查找,可由判定树求出该值
2、基于开放地址法的查找算法 散列表的查找过程和建表过程相似。假设给定的值为K,根据建表时设定的散列函数h,计算出散列地 址h(K),若表中该地址单元为空,则查找失败;否则将该地址中的结点与给定值K比较。若相等则查找成功 否则按建表时设定的处理冲突的方法找下一个地址。如此反复下去,直到某个地址单元为空(查找失败)或者 关键字比较相等(查找成功)为止。 (1)开放地址法一般形式的函数表示 int Hash(KeyType k,int i) { //求在散列表T[0..m-1]中第i次探查的散列地址hi,0≤i≤m-1 //下面的h是散列函数。Increment是求增量序列的函数,它依赖于解决冲突的方法 return(h(K)+Increment(i))%m; //Increment(i)相当于是di } 若散列函数用除余法构造,并假设使用线性探查的开放定址法处理冲突,则上述函数中的h(K)和 Increment(i)可定义为: int h(KeyType K){ //用除余法求K的散列地址 return K%m; } int Increment(int i){//用线性探查法求第i个增量di return i; //若用二次探查法,则返回i*i }
ห้องสมุดไป่ตู้
3、基于开放地址法的插入及建表 建表时首先要将表中各结点的关键字清空,使其地址为开放的;然后调用插入算法将给定的关键字序 列依次插入表中。 插入算法首先调用查找算法,若在表中找到待插入的关键字或表已满,则插入失败;若在表中找到一 个开放地址,则将待插入的结点插入其中,即插入成功。 void Hashlnsert(HashTable T,NodeTypene w) { //将新结点new插入散列表T[0..m-1]中 int pos,sign; sign=HashSearch(T,new.key,&pos); //在表T中查找new的插入位置 if(!sign) //找到一个开放的地址pos T[pos]=new; //插入新结点new,插入成功 else //插人失败 if(sign>0) printf("duplicate key!"); //重复的关键字 else //sign<0 Error("hashtableoverflow!"); //表满错误,终止程序执行 } //Hashlnsert void CreateHashTable(HashTable T,NodeType A[],int n) { //根据A[0..n-1]中结点建立散列表T[0..m-1] int i if(n>m) //用开放定址法处理冲突时,装填因子α须不大于1
注意: ①由同一个散列函数、不同的解决冲突方法构造的散列表,其平均查找长度是不相同的。 ②散列表的平均查找长度不是结点个数n的函数,而是装填因子α的函数。因此在设计散列表时可选 α以控制散列表的平均查找长度。 ③ α的取值 α越小,产生冲突的机会就小,但α过小,空间的浪费就过多。只要α选择合适,散列表上的平均查 找长度就是一个常数,即散列表上查找的平均时间为O(1)。 ④ 散列法与其他查找方法的区别 除散列法外,其他查找方法有共同特征为:均是建立在比较关键字的基础上。其中顺序查找是对无序集合的 查找,每次关键字的比较结果为"="或"!="两种可能,其平均时间为O(n);其余的查找均是对有序集合的查 找,每次关键字的比较有"="、"<"和">"三种可能,且每次比较后均能缩小下次的查找范围,故查找速度更 快,其平均时间为O(lgn)。而散列法是根据关键字直接求出地址的查找方法,其查找的期望时间为O(1)。
} } void Init(chainhash * HTC[],int m,keytype key[],int n) //初始 化HTC的函数 { int i; for(i=0;i<m;i++) { HTC[i]=NULL; } for(i=0;i<n;i++) { chainhash *s; s=(chainhash *)malloc(sizeof(chainhash)); s->key=key[i]; Cinsert(HTC,s); } } int main() { int i; chainhash * d; keytype k; keytype key[N]; printf("请输入你的关键字序列:"); for(i=0;i<N;i++) { scanf("%d",&key[i]); } Init(HTC,M,key,N); printf("现在的散列表状态为:\n"); for(i=0;i<M;i++){ d=HTC[i]; while(d!=NULL) { printf("%d ",d->key);
散列表上的运算
散列表上的运算有查找、插入和删除。其中主要是查找,这是因为散列表的目的主要是用于快速查 找,且插入和删除均要用到查找操作。 1、散列表类型说明: #define NIL -1 //空结点标记依赖于关键字类型,本节假定关键字均为非负整数 #define M 997 //表长度依赖于应用,但一般应根据。确定m为一素数 typedef struct{ //散列表结点类型 KeyType key; InfoType otherinfo; //此类依赖于应用 }NodeType; typedef NodeType HashTable[m]; //散列表类型
(2) 查找不成功的ASL 对于不成功的查找,顺序查找和二分查找所需进行的关键字比较次数仅取决于表长,而散列查找所需 进行的关键字比较次数和待查结点有关。因此,在等概率情况下,也可将散列表在查找不成功时的平均查找
长度,定义为查找不成功时对关键字需要执行的平均比较次数。 【例】例9.1和例9.2的散列表中,在等概率情况下,查找不成功时的线性探查法和拉链法的平均查找长 度分别为: ASLunsucc=(9+8+7+6+5+4+3+2+1+1+2+1+10)/13=59/13≈4.54 ASLunsucc=(1+0+2+1+0+1+1+0+0+0+1+0+3)/13≈10/13≈0.77
(2)通用的开放定址法的散列表查找算法:
int HashSearch(HashTable T,KeyType K,int *pos) { //在散列表T[0..m-1]中查找K,成功时返回1。失败有两种情况:找到一个开放地址 //时返回0,表满未找到时返回-1。 *pos记录找到K或找到空结点时表中的位置 int i=0; //记录探查次数 do{ *pos=Hash(K,i); //求探查地址hi if(T[*pos].key==K) return l; //查找成功返回 if(T[*pos].key==NIL) return 0;//查找到空结点返回 }while(++i<m) //最多做m次探查 return -1; //表满且未找到时,查找失败 } //HashSearch 注意: 上述算法适用于任何开放定址法,只要给出函数Hash中的散列函数h(K)和增量函数Increment(i)即 可。但要提高查找效率时,可将确定的散列函数和求增量的方法直接写入算法HashSearch中,相应的算法 【参见习题】。
本文来自CSDN博客,转载请标明出 处:/spritsq/archive/2006/06/12/791973.aspx 第13题用线性探查法实现的散列表 POWERBY KTL 收藏 /*设有一组关键字(许炼2,35,124,153,84,57),需要插入到表长 为12的散列表中。 本程序把该题目编写为程序,输入72 35 124 153 84 57回车,输入查 找的关键字, 因为输出为key,而不是other,所以若输出与你输入的关键字相同则程 序运行正确。 */ #include "stdio.h" #include "stdlib.h" #define #define #define #define typedef p 11 M 12 N 6 nil 0 int keytype;
相关文档
最新文档