#include<iostream>
using namespace std;
class HashEntry {
public:
int key;
int value;
HashEntry(int key, int value) {
this->key=key;
this->value=value;
}
};
class HashMap {
private:
HashEntry **table;
int capacity;
int mod;
int hashFunc(int key) {
return key%mod;
}
public:
HashMap(int capacity, int mod) {
this->capacity=capacity;
this->mod=mod;
table=new HashEntry*[capacity];
for(int i=0; i<capacity; i++)
table[i]=nullptr;
}
// Destructor to clean up allocated memory
~HashMap() {
for(int i=0; i<capacity; i++)
if (table[i]!=nullptr)
delete table[i];
delete[] table;
}
// Function to insert a key-value pair into the hash table
void insert(int key, int value) {
int hash=hashFunc(key);
int startHash=hash;
while (table[hash]!=nullptr && table[hash]->key!=key) {
hash=(hash+1)%capacity;
if(hash==startHash) {
return;
}
}
if(table[hash]!=nullptr) {
delete table[hash];
}
table[hash]=new HashEntry(key, value);
}
// Function to search for a key and return its value
int search(int key) {
int hash=hashFunc(key);
int startHash=hash;
while(table[hash]!=nullptr && table[hash]->key!=key) {
hash=(hash+1)%capacity;
if(hash==startHash) {
return -1;
}
}
if (table[hash]==nullptr) {
return -1;
}
else {
return table[hash]->value;
}
}
void printTable() {
cout<<"Hash Table:"<<endl;
for(int i=0; i<capacity; i++) {
if (table[i]!=nullptr)
cout<<i<<" => Key: "<<table[i]->key<<", Value: "<<table[i]->value<<endl;
else
cout<<i<<" => null"<<endl;
}
}
};
int main() {
HashMap hash(10,7);
hash.insert(1,10);
hash.insert(8,50);
hash.insert(15,90);
cout<<"Value at key 1: "<<hash.search(1)<<endl;
cout<<"Value at key 8: "<<hash.search(8)<<endl;
cout<<"Value at key 15: "<<hash.search(15)<<endl;
cout<<"Value at key 2: "<<hash.search(2)<<endl;
hash.printTable();
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNsYXNzIEhhc2hFbnRyeSB7CnB1YmxpYzoKICAgIGludCBrZXk7CiAgICBpbnQgdmFsdWU7CiAgICBIYXNoRW50cnkoaW50IGtleSwgaW50IHZhbHVlKSB7CiAgICAgICAgdGhpcy0+a2V5PWtleTsKICAgICAgICB0aGlzLT52YWx1ZT12YWx1ZTsKICAgIH0KfTsKY2xhc3MgSGFzaE1hcCB7CnByaXZhdGU6CiAgICBIYXNoRW50cnkgKip0YWJsZTsKICAgIGludCBjYXBhY2l0eTsKICAgIGludCBtb2Q7CiAgICBpbnQgaGFzaEZ1bmMoaW50IGtleSkgewogICAgICAgIHJldHVybiBrZXklbW9kOwogICAgfQpwdWJsaWM6CiAgICBIYXNoTWFwKGludCBjYXBhY2l0eSwgaW50IG1vZCkgewogICAgICAgIHRoaXMtPmNhcGFjaXR5PWNhcGFjaXR5OwogICAgICAgIHRoaXMtPm1vZD1tb2Q7CiAgICAgICAgdGFibGU9bmV3IEhhc2hFbnRyeSpbY2FwYWNpdHldOwogICAgICAgIGZvcihpbnQgaT0wOyBpPGNhcGFjaXR5OyBpKyspCiAgICAgICAgICAgIHRhYmxlW2ldPW51bGxwdHI7CiAgICB9CiAgICAvLyBEZXN0cnVjdG9yIHRvIGNsZWFuIHVwIGFsbG9jYXRlZCBtZW1vcnkKICAgIH5IYXNoTWFwKCkgewogICAgICAgIGZvcihpbnQgaT0wOyBpPGNhcGFjaXR5OyBpKyspCiAgICAgICAgICAgIGlmICh0YWJsZVtpXSE9bnVsbHB0cikKICAgICAgICAgICAgICAgIGRlbGV0ZSB0YWJsZVtpXTsKICAgICAgICBkZWxldGVbXSB0YWJsZTsKICAgIH0KICAgIC8vIEZ1bmN0aW9uIHRvIGluc2VydCBhIGtleS12YWx1ZSBwYWlyIGludG8gdGhlIGhhc2ggdGFibGUKICAgIHZvaWQgaW5zZXJ0KGludCBrZXksIGludCB2YWx1ZSkgewogICAgICAgIGludCBoYXNoPWhhc2hGdW5jKGtleSk7CiAgICAgICAgaW50IHN0YXJ0SGFzaD1oYXNoOyAKICAgICAgICB3aGlsZSAodGFibGVbaGFzaF0hPW51bGxwdHIgJiYgdGFibGVbaGFzaF0tPmtleSE9a2V5KSB7CiAgICAgICAgICAgIGhhc2g9KGhhc2grMSklY2FwYWNpdHk7CiAgICAgICAgICAgIGlmKGhhc2g9PXN0YXJ0SGFzaCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9IAogICAgICAgIH0KICAgICAgICBpZih0YWJsZVtoYXNoXSE9bnVsbHB0cikgewogICAgICAgICAgICBkZWxldGUgdGFibGVbaGFzaF07CiAgICAgICAgfQogICAgICAgIHRhYmxlW2hhc2hdPW5ldyBIYXNoRW50cnkoa2V5LCB2YWx1ZSk7CiAgICB9CiAgICAvLyBGdW5jdGlvbiB0byBzZWFyY2ggZm9yIGEga2V5IGFuZCByZXR1cm4gaXRzIHZhbHVlCiAgICBpbnQgc2VhcmNoKGludCBrZXkpIHsKICAgICAgICBpbnQgaGFzaD1oYXNoRnVuYyhrZXkpOwogICAgICAgIGludCBzdGFydEhhc2g9aGFzaDsKICAgICAgICB3aGlsZSh0YWJsZVtoYXNoXSE9bnVsbHB0ciAmJiB0YWJsZVtoYXNoXS0+a2V5IT1rZXkpIHsKICAgICAgICAgICAgaGFzaD0oaGFzaCsxKSVjYXBhY2l0eTsKICAgICAgICAgICAgaWYoaGFzaD09c3RhcnRIYXNoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRhYmxlW2hhc2hdPT1udWxscHRyKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0YWJsZVtoYXNoXS0+dmFsdWU7CiAgICAgICAgfQogICAgfQogICAgdm9pZCBwcmludFRhYmxlKCkgewogICAgICAgIGNvdXQ8PCJIYXNoIFRhYmxlOiI8PGVuZGw7CiAgICAgICAgZm9yKGludCBpPTA7IGk8Y2FwYWNpdHk7IGkrKykgewogICAgICAgICAgICBpZiAodGFibGVbaV0hPW51bGxwdHIpCiAgICAgICAgICAgICAgICBjb3V0PDxpPDwiID0+IEtleTogIjw8dGFibGVbaV0tPmtleTw8IiwgVmFsdWU6ICI8PHRhYmxlW2ldLT52YWx1ZTw8ZW5kbDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY291dDw8aTw8IiA9PiBudWxsIjw8ZW5kbDsKICAgICAgICB9CiAgICB9Cn07CmludCBtYWluKCkgewogICAgSGFzaE1hcCBoYXNoKDEwLDcpOwogICAgaGFzaC5pbnNlcnQoMSwxMCk7CiAgICBoYXNoLmluc2VydCg4LDUwKTsKICAgIGhhc2guaW5zZXJ0KDE1LDkwKTsKICAgIGNvdXQ8PCJWYWx1ZSBhdCBrZXkgMTogIjw8aGFzaC5zZWFyY2goMSk8PGVuZGw7CiAgICBjb3V0PDwiVmFsdWUgYXQga2V5IDg6ICI8PGhhc2guc2VhcmNoKDgpPDxlbmRsOwogICAgY291dDw8IlZhbHVlIGF0IGtleSAxNTogIjw8aGFzaC5zZWFyY2goMTUpPDxlbmRsOwogICAgY291dDw8IlZhbHVlIGF0IGtleSAyOiAiPDxoYXNoLnNlYXJjaCgyKTw8ZW5kbDsKICAgIGhhc2gucHJpbnRUYWJsZSgpOwogICAgcmV0dXJuIDA7Cn0K