请设计一个整型开散列表,散列函数为除留余数法,其中散列表的长度、除留余数法的模和关键码的个数由键盘输入,再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找,输出查找结果采用头插法。
输入描述
各个命令以及相关数据的输入格式如下:
第一行输入闭散列表的长度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
未解之谜
类里面定义的int maxLoc[Max];这个数组,原本写成了尾插法,明白是头插法后打算用来存储单链表的最大长度,输出位置的时候减去它在尾插法的位置也可以得到头插法一样的位置结果,但是发现头插法写的代码更少后重新写了头插法然后就打算注释掉它,但突然发现一个问题,注释掉之后timeerror,不注释掉却AC,然而这个数组在这里并没有用,d-oj????-_-无语
代码
#include<iostream>
using namespace std;
#define Max 20
struct Node{
int data;
int location;
Node *next;
};
class HashList{
public:
HashList(int a[],int mod,int num);
int Insert(int key,int locate);
void search(int k);
int H(int key);//地址转换
private:
Node *head;//头指针及工作指针
int len,mod,location;
Node data[Max];//哈希数组存储链表头结点
int maxLoc[Max];//存储最大location,注释掉之后timeerror,不注释掉AC,然而这个数组在这里并没有用,d-oj????
};
void HashList::search(int k) {
int locate=H(k);location=0;
Node *p;//工作指针
//cout<<"开始搜索";
p=&data[locate];
while((p->next!=NULL)&&p->data!=k){
p=p->next;location++;
}
if(p->data==k){cout<<locate<<" "<<location;return;}
else{
cout<<"none";
Insert(k,locate);
}
}
//插入函数,返回0代表插入元素已经找到位置不需要插入,返回1代表表中没有需要插入
int HashList::Insert(int key,int locate) {
Node *p;//工作指针
//cout<<"开始插入";
p=&data[locate];
Node *s;
s=new Node;
s->data=key;s->location=location;//s->maxLoc=location;
s->next=p->next;
p->next=s;
return 1;
}
/*
while((head->next!=NULL)&&head->data!=key){
head=head->next;location++;//链表中的位置
}
if(head->data==key){cout<<"结点已经存在";
return;}
else{
p=new Node;//新的结点
p->data=key;p->location=location;
p->next=head->next;
head->next=p;//尾插
cout<<"插入成功"<<p->data<<"位置:"<<p->location<<endl;
}*/
int HashList::H(int key) {
return key%mod;
}
HashList::HashList(int *a, int mod,int num) {
int adrs;
len = num;
this->mod = mod;
for (int i = 0; i < len; i++) {
//初始化散链表
data[i].next=NULL;
}
for (int i = 0; i < len; i++) {
adrs = H(a[i]);//地址
Insert(a[i], adrs);
}
}
int main(){
int n,m,num;
//数据输入
cin>>n>>m>>num;
//数据录入
int key,data[num];
for(int i=0;i<num;i++){
cin>>key;
data[i]=key;
}
HashList A= HashList(data,m,num);
//数据查找
int search[3];
for(int i=0;i<3;i++){
cin>>key;
search[i]=key;
}
for(int i=0;i<3;i++){
A.search(search[i]);
}
}
9090

被折叠的 条评论
为什么被折叠?



