题目
问题 D: DS哈希查找与增补
时间限制: 1 Sec 内存限制: 128 MB
提交: 309 解决: 266
[提交][状态][讨论版]
题目描述
给出一个数据序列,建立哈希表,采用求余法作为哈希函数,模数为11,哈希冲突用链地址法和表尾插入
如果首次查找失败,就把数据插入到相应的位置中
实现哈希查找与增补功能
输入
第一行输入n,表示有n个数据
第二行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第三行输入t,表示要查找t个数据
从第四行起,每行输入一个要查找的数据,都是正整数
输出
每行输出对应数据的查找结果,每个结果表示为数据所在位置[0,11)和查找次数,中间用空格分开
样例输入
6
11 23 39 48 75 62
6
39
52
52
63
63
52
样例输出
6 1
error
8 1
error
8 2
8 1
代码块
#include <iostream>
using namespace std;
typedef struct Node{
int data;
struct Node *next;
} Node;
int main(void)
{
int i, n;
cin>>n;
Node *s[11];
for(i=0; i<11; i++)
s[i] = NULL;
for(i=0; i<n; i++)
{
int key;
cin>>key;
Node *p = new Node;
p->data = key;
p->next = NULL;
if(!s[key%11])
s[key%11] = p;
else
{
Node *q = s[key%11];
while(q->next)
q = q->next;
q->next = p;
}
}
int t;
cin>>t;
for(i=0; i<t; i++)
{
int key;
cin>>key;
Node *p = s[key%11];
int num = 1;
while(p)
{
if(p->data==key)
break;
p = p->next;
num++;
}
if(p)
cout<<key%11<<' '<<num<<endl;
else
{
cout<<"error"<<endl;
p = new Node;
p->data = key;
p->next = NULL;
if(!s[key%11])
s[key%11] = p;
else
{
Node *q = s[key%11];
while(q->next)
q = q->next;
q->next = p;
}
}
}
}