SWUST OJ 1013: 哈希表(开放定址法处理冲突)

1013: 哈希表(开放定址法处理冲突)

题目描述
采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用开放定址法的线性探测。
输入
第一行为哈希表的长度n; 第二行为关键字的个数; 第三行为关键字集合; 第三行为要查找的数据。
输出
如果查找成功,输出关键字所哈希表中的地址和比较次数;如果查找不成功,输出-1。
样例输入
13

11
16 74 60 43 54 90 46 31 29 88 77
16

样例输出

3,1

思路:

  1. 哈希表的基本概念: 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
  2. 哈希表的构建方法
    ① 直接定址法
    ②除留取余法
    ③数字分析法
  3. 哈希表的冲突解决
    ①开放地址法
    a.线性探测法
    b.平方探测法
    ②拉链法
#include
typedef struct HashTable
{
	int data;
	int key;//标记值,空为0,满为1 
}HashTable;
void init(HashTable a[],int n)//初始化哈希表 
{
	for(int i=0;i<n;i++)
	{
		a[i].key=0;
	}
}
void creat(HashTable a[],int n,int data)//建哈希表 
{
	int t=data%n;
	if(a[t].key==0)//如果未被标记,则储存且标记 
	{
		a[t].data=data;
		a[t].key=1;
	}
	else//如果被标记,则往后找未被标记的位置  
	{
		t=(t+1)%n;
		if(a[t].key==0)
		{
			a[t].data=data;
			a[t].key=1;
		} 
	}	
}
void search(HashTable a[],int n,int data)
{
	int t=data%n;
	int p=0;
	for(int i=0;i<n;i++)
	{
		if(a[t].data==data)
		{
			printf("%d,%d",t,i+1);//cout << t << "," << i+1; 
			p=1;
			break;
		}
		else t=(t+1)%n;
	}
	if(p==0) printf("-1");//cout << "-1"; 
}
int main()
{
	int n,k,data;
	scanf("%d",&n);//cin >> n;
	scanf("%d",&k);//cin >>k;
	HashTable a[100];
	init(a,n);
	for(int i=0;i<k;i++)
	{
		scanf("%d",&data);//cin >> data;
		creat(a,n,data);
	}
	scanf("%d",&data);//cin >> data;
	search(a,n,data);

}

以上方法仅供参考,欢迎互联网广大朋友们提出指正。

你可能感兴趣的:(SWUST,OJ,数据结构,哈希表,c++,c语言)