commit 014b381086a2075c75cbfc42b41d3d953041df13 Author: Harun Teper Date: Wed Jun 24 16:08:11 2020 +0200 first hashtable implementation diff --git a/HashTabelle.h b/HashTabelle.h new file mode 100644 index 0000000..424b73c --- /dev/null +++ b/HashTabelle.h @@ -0,0 +1,151 @@ +#pragma once + +#include +#include +#include +#include +#include + +template +class HashTable { +public: + struct elem { + public: + T* data; + int key; + }; + struct hashList { + public: + std::vector list; + }; + + int size; + int elements; + std::vector table; + + HashTable(int size); + ~HashTable(); + + void insert(int id, T* n); + bool search(int id); + bool remove(int id); + + void restructure(); + + int getSize(); + int getElements(); + double getUtilization(); + + void print(); + + int hash(int id); + +private: +}; + +template < typename T > +HashTable::HashTable(int size) { + this->size = size; + this->table = std::vector(size); +}; + +template < typename T > +HashTable::~HashTable() { + //table.clear(); + //table.shrink_to_fit(); + std::vector().swap(table); +} + +template < typename T > +int HashTable::getSize() { + return size; +} + +template < typename T > +int HashTable::getElements() { + return elements; +} + +template < typename T > +double HashTable::getUtilization() { + return (double)elements/size; +} + +template < typename T > +int HashTable::hash(int id) { + return id % size; +} + +template < typename T > +bool HashTable::search(int id) { + int index = hash(id); + std::vector list = table.at(index).list; + for (auto it = list.begin(); it != list.end(); ++it) { + if (it->key == id) { + return true; + } + } + + return false; +} + +template < typename T > +void HashTable::insert(int id, T* data) { + int index = hash(id); + if (search(id)){ + std::vector list = table[index].list; + for (auto it = table[index].list.begin(); it != table[index].list.end(); ++it) { + if (it->key == id) { + it->data = data; + } + } + } + else{ + table[index].list.push_back(elem{ data, id }); + elements++; + } +} + +template < typename T > +bool HashTable::remove(int id) { + int index = hash(id); + std::vector list = table[index].list; + int elemindex = 0; + + for (auto it = table[index].list.begin(); it != table[index].list.end(); ++it) { + if (it->key == id){ + table[index].list.erase(table[index].list.begin() + elemindex); + elements--; + return true; + } + elemindex++; + } + return false; +} + +template < typename T > +void HashTable::print() { + + for (auto it = table.begin(); it != table.end(); ++it) { + std::cout << "Next list" << std::endl; + for (auto it2 = it->list.begin(); it2 != it->list.end(); ++it2) { + std::cout << it2->data << std::endl; + } + } + +} + +template < typename T > +void HashTable::restructure() { + + std::vectoroldTable = table; + + size = size * 2; + table = std::vector(size); + + for (auto it = oldTable.begin(); it != oldTable.end(); ++it) { + for (auto it2 = it->list.begin(); it2 != it->list.end(); ++it2) { + insert(it2->key, it2->data); + } + } +} \ No newline at end of file diff --git a/Quelle.cpp b/Quelle.cpp new file mode 100644 index 0000000..1ab493c --- /dev/null +++ b/Quelle.cpp @@ -0,0 +1,44 @@ +#pragma once + +#include "HashTabelle.h" +#include +#include +#include + +using namespace std; + +struct Customer { + int id; + string vorname; + string nachname; + + friend ostream& operator<<(ostream& os, const Customer& c) { + os << "Id: " << c.id << "\n" << "Vorname: " << c.vorname << "\n" << "Nachname: " << c.nachname << "\n"; + return os; + } +}; + +int main() { + Customer c{ 20, "Max", "Mustermann" }; + Customer d{ 30, "Tom", "Mot" }; + + + HashTable table = HashTable(10); + + table.insert(20, &c); + table.insert(30, &c); + table.insert(21, &c); + table.insert(21, &d); + + std::cout << table.search(30) << std::endl; + + table.remove(30); + + std::cout << table.search(30) << std::endl; + + table.remove(40); + + table.restructure(); + + table.print(); +}