[DOJ练习] 散列查找实验(闭散列/开散列)

散列查找实验(闭散列)

请设计一个整型闭散列表,散列函数为除留余数法,处理冲突时的探查方法为线性探查法,其中散列表的长度、除留余数法的模和关键码的个数由键盘输入,再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找,如果找到了输出位置,如果没找到,输出“none”并把该待查值插入到散列表中,如果散列表满输出“full”。

输入描述

各个命令以及相关数据的输入格式如下:
第一行输入闭散列表的长度n
第二行输入除留余数法的模m
第三行输入关键码的个数num
第四行输入num个整型关键码
第五行输入三个待查整型值

输出描述

输出三行,每行格式为: 
如果找到待查值,输出找到待查值的位置,如果没找到,输出“none”,并将待查值插入到散列表中,如果散列表满,则输出“full”,每个待查值占一行

输入样例

11 11 9
2 6 8 9 13 17 10 12 20
3 7 11

输出样例

none
none
full

#include<iostream>
#include<cstring>
using namespace std;

const int N = 1010;
int n,m,k;
int h[N],e[N],ne[N],idx,site[N];

void add(int a, int b){
	e[idx]=b, ne[idx]=h[a], h[a]=idx++;
}
int main()
{
	cin >> n >> m >> k;
	
	memset(h, -1, sizeof h);
	int x;
	for(int i = 0; i < k; i++)
	{
		cin >> x;
		add(x%m, x);
	}

	int total=k;
	for(int i = 0; i < 3; i++)
	{
		cin >> x;
		int j = h[x%m];
		for(;j != -1; j = ne[j])
		{
			if(e[j]==x){
				cout << x%m;
				break;
			}
		}
		if(j == -1){
			if(total<n){
				cout << "none";
				add(x%m, x);
				total++;
			}else{
				cout << "full";
			}
		}
	}
	return 0;
}

散列查找实验(开散列)

请设计一个整型开散列表,散列函数为除留余数法,其中散列表的长度、除留余数法的模和关键码的个数由键盘输入,再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找,输出查找结果采用头插法。

输入描述

各个命令以及相关数据的输入格式如下:
第一行输入闭散列表的长度n
第二行输入除留余数法的模m
第三行输入关键码的个数num
第四行输入num个整型关键码
第五行输入三个待查整型值

输出描述

输出三行,每行格式为: 
如果找到待查值,输出找到待查值的位置,先输出待查值在散列表指针数组中的下标,
再输出待查值在关键码链表中的位置,从1开始,如果没找到,输出“none”,并把待查值
插入到开散列表中

输入样例

11 11 9
2 6 8 9 13 17 10 12 20
11 13 9

输出样例

none
2 1
9 2

和邻接表构造方法一样

#include<iostream>
#include<cstring>
using namespace std;

const int N = 1010;
int n,m,k;
int h[N],e[N],ne[N],idx;

void add(int a, int b){
	e[idx]=b, ne[idx]=h[a], h[a]=idx++;
}
int main()
{
	cin >> n >> m >> k;
	
	memset(h, -1, sizeof h);
	int x;
	for(int i = 0; i < k; i++)
	{
		cin >> x;
		add(x%m, x);
	}

	for(int i = 0; i < 3; i++)
	{
		cin >> x;
		int cnt = 0;
		int j = h[x%m];
		for(;j != -1; j = ne[j])
		{
			cnt ++;
			if(e[j]==x){
				cout << x%m << " " << cnt;
				break;
			}
		}
		if(j == -1){
			cout << "none";
			add(x%m, x);
		}
	}
	return 0;
}

本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/15799033.html

原文地址:https://www.cnblogs.com/Knight02/p/15799033.html