哈希表(链地址法处理冲突)c语言方法

哈希表(链地址法处理冲突)c语言方法

采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法。建立链表的时候采用尾插法。
输入
第一行为哈西表的长度m;
第二行为关键字的个数n;
第三行为关键字集合;
第四行为要查找的数据。
输出
如果查找成功,输出该关键字所在哈希表中的地址和比较次数;如果查找不成功,输出-1。
样例输入
13
13
16 74 60 43 54 90 46 31 29 88 77 78 79
16
样例输出
3,1

代码实现:

#include
using namespace std;
int main()
{
int n,m,a[20][20],b[20],i,j,t,s,temp=0;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
a[i][j]=-1;
cin>>n>>m;
for(i=0;i<m;i++)
cin>>b[i];
cin>>s;
for(i=0;i<m;i++)
{
j=0;
t=b[i]%n;
while(a[t][j]!=-1)
j++;
a[t][j]=b[i];
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(a[i][j]s)
cout<<i<<’,’<<j+1;
else temp++;
}
if(temp
n*n)
cout<<"-1";
return 0;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
平方取中是哈希函数的一种常用方法,它可以将关键字映射到哈希表地址空间中。具体思路是,首先对关键字进行平方运算,然后取中间若干位作为哈希值。实现过程如下: 1. 将关键字进行平方运算,得到平方结果; 2. 取平方结果的中间若干位作为哈希值; 3. 将哈希值对哈希表长度取模,得到最终的哈希地址C语言代码实现如下: ```c int hash(int key, int table_size) { int square = key * key; int middle = (square / 100) % 10000; // 取中间4位 return middle % table_size; // 取模,得到哈希地址 } ``` 对于哈希冲突解决方法地址是一种常用的方法。它将哈希表中每个位置的元素都组成一个,发生哈希冲突时,将新元素插入到对应位置的末尾即可。具体实现过程如下: 1. 对于哈希表中的每个位置,都设置一个指针,指向该位置的头节点; 2. 当需要插入一个元素时,首先根据哈希函数计算出该元素的哈希地址; 3. 检查该位置的是否为空,若为空,则直接插入元素,否则遍历,查找是否已经存在相同的元素; 4. 若找到相同的元素,则不插入,否则将元素插入到末尾。 C语言代码实现如下: ```c typedef struct Node { int key; struct Node *next; } Node; Node *hash_table[MAX_SIZE]; void insert(int key) { int index = hash(key, MAX_SIZE); Node *p = hash_table[index]; while (p != NULL) { if (p->key == key) { return; // 已经存在相同元素,不插入 } p = p->next; } // 新建节点,插入到末尾 Node *new_node = (Node *)malloc(sizeof(Node)); new_node->key = key; new_node->next = hash_table[index]; hash_table[index] = new_node; } ``` 这样,我们就可以利用平方取中地址实现哈希表了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值