数据结构C++版 王红梅 OJ习题

本文介绍了一种基于链地址法解决散列冲突的方法,并提供了一个具体的C++实现案例。该案例展示了如何构造一个散列表,包括散列函数的设计、散列表的初始化、元素的动态查找及插入操作。

1034: 散列表(2)

Description

已知Hash表的表长MaxSize为11,Hash函数为HashFunc(k)=k%11,冲突处理方法为链地址法,部分代码如下,勿改动。请补充完成成员函数HashSearch,该函数的功能是动态查找k,若查找失败,则插入k,并返回查找失败所需的比较次数,若查找成功,返回查找k所需的比较次数。

#include<iostream>

using namespace std;

const int MaxSize=11;    //maxsize

struct Node

{

int data;

    Node *next;

};

class LinkHash

{

public:

LinkHash();  //initialize an empty list

int HashFunc(int k);  //hash function

int HashSearch(int k); //dynamic search k

void Display();

private:

Node *ht[MaxSize];  //ht数组用来保留各个链表的头指针

};

//hash function

int LinkHash::HashFunc(int k)

{

return k%11;   //hash函数,假设为除余法,余数为11

}

//constructor:initialize an empty hashlist

LinkHash::LinkHash()

{

int i;

for(i=0;i<MaxSize;i++)

ht[i]=nullptr;  //empty pointer

}

void LinkHash::Display()

{

int i;

for(i=0;i<MaxSize;i++)

{

cout<<"Hash address:"<<i<<",value:";

Node *p;

for(p=ht[i];p!=nullptr;p=p->next)

cout<<p->data<<" ";

cout<<endl;

}

}

//在下面补充实现动态查找算法

int main()

{

LinkHash LS;

int k;

while(1)

{

cin>>k;

if(!k) break;

try{

LS.HashSearch(k);

// LS.Display();

}

catch(const char *ms)

{

cout<<ms<<endl;

}

}

LS.Display();

return 0;

}

Input

Output

Sample Input

47 7 29 11 16 92 22 8 3 29 0

Sample Output

Hash address:0,value:22 11 
Hash address:1,value:
Hash address:2,value:
Hash address:3,value:3 47 
Hash address:4,value:92 
Hash address:5,value:16 
Hash address:6,value:
Hash address:7,value:29 7 
Hash address:8,value:8 
Hash address:9,value:
Hash address:10,value:
//
// Created by Legends丶Hu on 2020/2/6.
//

#include<iostream>

using namespace std;
const int MaxSize = 11;    //maxsize
struct Node {
    int data;
    Node *next;
};

class LinkHash {
public:
    LinkHash();  //initialize an empty list
    int HashFunc(int k);  //hash function
    int HashSearch(int k); //dynamic search k
    void Display();

private:
    Node *ht[MaxSize];  //ht数组用来保留各个链表的头指针
};

//hash function
int LinkHash::HashFunc(int k) {
    return k % 11;   //hash函数,假设为除余法,余数为11
}

//constructor:initialize an empty hashlist
LinkHash::LinkHash() {
    int i;
    for (i = 0; i < MaxSize; i++)
        ht[i] = NULL;  //NULL is empty
}

void LinkHash::Display() {
    int i;
    for (i = 0; i < MaxSize; i++) {
        cout << "Hash address:" << i << ",value:";
        Node *p;
        for (p = ht[i]; p; p = p->next)
            cout << p->data << " ";
        cout << endl;
    }
}

int LinkHash::HashSearch(int k) {
    int j = HashFunc(k);
    Node *p = ht[j];
    while(p && p->data != k) {
        p = p->next;
    }
    if(p && p->data == k) return 1;
    else {
        Node *s = new Node;
        s->data = k;
        s->next = ht[j];
        ht[j] = s;
    }
    return 0;
}

int main() {
    LinkHash LS;
    int k;
    while (1) {
        cin >> k;
        if (!k) break;
        try {
            LS.HashSearch(k);
// LS.Display();
        }
        catch (const char *ms) {
            cout << ms << endl;
        }
    }
    LS.Display();
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值