82 lines
1.9 KiB
C++
82 lines
1.9 KiB
C++
#include "hashmap.hpp"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
HashMap::HashMap(int sz) {
|
|
size = sz;
|
|
table = new HashNode*[sz];
|
|
for (int i = 0; i < sz; i++) table[i] = NULL;
|
|
}
|
|
|
|
int HashMap::get(ll key, int vsign) {
|
|
int pos = 1ll * key % size;
|
|
HashNode *pointer = table[pos];
|
|
while (pointer != NULL) {
|
|
if (pointer->data.key == key)
|
|
return pointer->data.val;
|
|
else
|
|
pointer = pointer->next;
|
|
}
|
|
return vsign;
|
|
}
|
|
|
|
void HashMap::erase(ll key) {
|
|
int pos = 1ll * key % size;
|
|
HashNode *pointer = table[pos];
|
|
if (pointer == NULL) return;
|
|
if (pointer->data.key == key) {
|
|
table[pos] = pointer->next;
|
|
delete pointer;
|
|
return;
|
|
}
|
|
HashNode *prev = pointer;
|
|
pointer = pointer->next;
|
|
while (pointer != NULL) {
|
|
if (pointer->data.key == key) {
|
|
prev->next = pointer->next;
|
|
delete pointer;
|
|
return;
|
|
}
|
|
prev = pointer;
|
|
pointer = pointer->next;
|
|
};
|
|
}
|
|
|
|
void HashMap::insert(ll key, int value) {
|
|
HashNode *hnode = new HashNode();
|
|
hnode->data.key = key;
|
|
hnode->data.val = value;
|
|
hnode->next = NULL;
|
|
|
|
int pos = 1ll * key % size;
|
|
if (table[pos] == NULL) {
|
|
table[pos] = hnode;
|
|
return;
|
|
}
|
|
HashNode *pointer = table[pos];
|
|
HashNode *prev = pointer;
|
|
while (pointer != NULL) {
|
|
if (pointer->data.key == key) {
|
|
pointer->data.val = value;
|
|
delete hnode;
|
|
return;
|
|
}
|
|
prev = pointer;
|
|
pointer = pointer->next;
|
|
}
|
|
prev->next = hnode;
|
|
}
|
|
|
|
HashMap::~HashMap(){
|
|
for (int i = 0; i < size; i++) {
|
|
HashNode *pointer = table[i];
|
|
HashNode *prev = pointer;
|
|
while (pointer != NULL){
|
|
prev = pointer;
|
|
pointer = pointer->next;
|
|
delete prev;
|
|
}
|
|
}
|
|
delete []table;
|
|
} |