Description
采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法。建立链表的时候采用尾插法。
Input
第一行为哈西表的长度;第二行为关键字的个数n; 第三行为关键字集合; 第四行为要查找的数据。
Output
如果查找成功,输出该关键字所在哈希表中的地址和比较次数;如果查找不成功,输出-1。
Sample Input
行数 | 数据 |
---|---|
1 | 13 |
2 | 13 |
3 | 16 74 60 43 54 90 46 31 29 88 77 78 79 |
4 | 16 |
代码
#include<iostream>
#include<cstring>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}Chain;
typedef struct
{
Chain *head[100];
int len, n;
}HashTable;
Chain * tail[100];
HashTable ha;
void InsertHT()
{
int adr, k;
Chain *p = new Chain;
cin >> k;
adr = k%ha.len;
p->data = k;
p->next = NULL;
if (!ha.head[adr])
{
ha.head[adr] = p;
tail[adr] = ha.head[adr];
}
else
{
tail[adr]->next = p;
tail[adr] = p;
}
}
void CreateHT(int len, int n)
{
ha.len = len, ha.n = n;
for (int i = 0; i < n; i++)
ha.head[i] = NULL;
for (int i = 0; i < n; i++)
InsertHT();
}
void Search(int x)
{
int adr = x%ha.len, flag = 0, cnt = 0;
Chain *p = ha.head[adr];
while (p)
{
cnt++;
if (p->data == x)
{
flag = 1;
break;
}
else
p = p->next;
}
if (flag)cout << adr << ',' << cnt;
else cout << "-1";
}
int main()
{
int len, n, x;
cin >> len >> n;
CreateHT(len, n);
cin >> x;
Search(x);
return 0;
}