/* * list_dictionary.cpp * * Created on: 09.01.2013 * Author: trifon */ #include "dictionary.h" template struct Pair { K key; V value; }; template class ListDictionary : public Dictionary { private: LinkedList > d; public: void print() const { d.print(); } V* search(K const& key) const { LinkedListIterator > it = d.iteratorBegin(); while (it && (*it).key < key) ++it; if (!it || (*it).key > key) return NULL; return &(*it).value; } bool add(K const& key, V const& value) { LinkedListIterator > it = d.iteratorBegin(), itp = it++; Pair p = { key, value }; if (!itp) { d.toEnd(p); return true; } if ((*itp).key == key) return false; if ((*itp).key > key) { d.insertBefore(p, itp); return true; } while (it && (*it).key < key) itp = it++; // !it || (*it).key >= key if (it && (*it).key == key) return false; d.insertAfter(p, itp); return true; } bool remove(K const& key) { LinkedListIterator > it = d.iteratorBegin(), itp = it++; if (!itp || (*itp).key > key) return false; Pair temp; if ((*itp).key == key) { d.deleteAt(temp, itp); return true; } while (it && (*it).key < key) itp = it++; // !it || (*it).key >= key if (!it || (*it).key > key) return false; d.deleteAfter(temp, itp); return true; } LinkedList keys() const { LinkedList k; for(LinkedListIterator > it = d.iteratorBegin(); it; ++it) k.toEnd((*it).key); return k; } LinkedList values() const { LinkedList v; for(LinkedListIterator > it = d.iteratorBegin(); it; ++it) v.toEnd((*it).value); return v; } }; template ostream& operator<<(ostream& os, Pair const& p) { return os << "(" << p.key << ", " << p.value << ")"; }