D-oj|散列查找实验(开散列) 题目编号:583

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

输入描述

各个命令以及相关数据的输入格式如下:
第一行输入闭散列表的长度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]);
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay叶湘伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值