目录
题目描述
给出一个数据序列,建立哈希表,采用求余法作为哈希函数,模数为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
思路分析
建立哈希表,哈希冲突用链地址法和表尾插入。那么要建立一个指针数组,要是该地址有数据,就指向结点,若没有数据就是NULL;也就是有很多个不带头结点的单链表。利用哈希函数计算出地址,创建新的结点,然后把结点插入就好。这里是不带头结点的尾插法,判断指针是否为NULL,是为NULL就让指针指向结点;不为NULL就一直循环指向下一个,直到找到NULL为止。
AC代码
#include<iostream>
using namespace std;
int hashh(int key){
return key%11;
}
class node{
public:
int key;
node *next;
node(){ }
node(int n,node *p):key(n),next(p){}
~node(){}
};
class hashTab{
public:
node * shuzu[100];
hashTab(int m){
for(int i=0;i<m;i++)
shuzu[i]=NULL;
}
void insert(node *a,int i) //尾插法
{ node *p;
p=shuzu[i];
if(p==NULL){
shuzu[i]=a;
return ;
}
while(1){
if(p->next==NULL){
p->next=a;
return ;
}
p=p->next;
}
}
int serach(int key){
int i=hashh(key);
int sum=0;
node *p;
p=shuzu[i];
while(1){
sum++;
if(p==NULL) return 0;
else {
if(p->key==key) return sum;
p=p->next;
}
}
}
};
int main(){
int t,m,n,k,key;
cin>>n;
// node *[11];//设表长为11
hashTab tab(11);
while(n--){
cin>>key;
int index=hashh(key);
node *a=new node(key,NULL);
tab.insert(a,index);
}
cin>>t;
while(t--){
cin>>key;
int sum=tab.serach(key);
if(sum==0){
cout<<"error"<<endl;
node *s=new node(key,NULL);
tab.insert(s,hashh(key));
}
else cout<<hashh(key)<<" "<<sum<<endl;
}
return 0;
}