[D-OJ练习] 散列查找实验(闭散列/开散列)
散列查找实验(闭散列)
请设计一个整型闭散列表,散列函数为除留余数法,处理冲突时的探查方法为线性探查法,其中散列表的长度、除留余数法的模和关键码的个数由键盘输入,再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找,如果找到了输出位置,如果没找到,输出“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