D. DS哈希查找与增补(表尾插入)

目录

题目描述

思路分析

AC代码


题目描述

给出一个数据序列,建立哈希表,采用求余法作为哈希函数,模数为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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值