#pragma once template class HashNode { public: V Value; K Key; HashNode(K Key, V Value) { this->Value = Value; this->Key = Key; } }; template class HashMap { int HashMapSize; int HashMapCapacity; HashNode **Nodes; HashNode *DummyNode; public: HashMap() { HashMapCapacity = 20; HashMapSize = 0; Nodes = new HashNode *[HashMapCapacity]; for (int i = 0; i < HashMapCapacity; i++) Nodes[i] = nullptr; DummyNode = new HashNode(-1, -1); } int HashCode(K Key) { return Key % HashMapCapacity; } void AddNode(K Key, V Value) { HashNode *tmp = new HashNode(Key, Value); int Index = HashCode(Key); while (Nodes[Index] != nullptr && Nodes[Index]->Key != Key && Nodes[Index]->Key != -1) { Index++; Index %= HashMapCapacity; } if (Nodes[Index] == nullptr || Nodes[Index]->Key == -1) HashMapSize++; Nodes[Index] = tmp; } V DeleteNode(int Key) { int Index = HashCode(Key); while (Nodes[Index] != nullptr) { if (Nodes[Index]->Key == Key) { HashNode *tmp = Nodes[Index]; Nodes[Index] = DummyNode; HashMapSize--; return tmp->Value; } Index++; Index %= HashMapCapacity; } return 0xdeadbeef; } V Get(int Key) { int Index = HashCode(Key); int Iterate = 0; while (Nodes[Index] != nullptr) { if (Iterate++ > HashMapCapacity) return 0xdeadbeef; if (Nodes[Index]->Key == Key) return Nodes[Index]->Value; Index++; Index %= HashMapCapacity; } return 0xdeadbeef; } int Size() { return HashMapSize; } bool IsEmpty() { return HashMapSize == 0; } };