From 55b722595252e492e86e7bf3fd1223d8c62fb01d Mon Sep 17 00:00:00 2001 From: Hannes Kuchelmeister Date: Thu, 31 Dec 2020 15:33:21 +0100 Subject: [PATCH] implement lazy list --- Assignment_2/LazyList.cpp | 91 +++++++++++++++++++++++++++++++++++++++ Assignment_2/Node.cpp | 2 + 2 files changed, 93 insertions(+) create mode 100644 Assignment_2/LazyList.cpp diff --git a/Assignment_2/LazyList.cpp b/Assignment_2/LazyList.cpp new file mode 100644 index 0000000..32dc305 --- /dev/null +++ b/Assignment_2/LazyList.cpp @@ -0,0 +1,91 @@ +#include + +#include"Node.cpp" + +class LazySet { + protected: + Node* first; + std::tuple locate(int element); + + public: + LazySet(); + bool add(int element); + bool rmv(int element); + bool ctn(int element); +}; + +LazySet::LazySet(){ + first = Node::Dummy(); // dummy node; + Node* last = Node::Dummy(); + first->next = last; +} + +bool LazySet::add(int element) { + auto tuple = locate(element); + Node* p = std::get<0>(tuple); + Node* c = std::get<1>(tuple); + + if (c->is_equal(element)) { + p->unlock(); + c->unlock(); + return false; + } else { + Node* n = new Node(element); + p->next = n; + + p->unlock(); + c->unlock(); + return true; + } +} +bool LazySet::rmv(int element) { + auto tuple = locate(element); + Node* p = std::get<0>(tuple); + Node* c = std::get<1>(tuple); + + if (c->is_equal(element)) { + c->deleted = true; + p->next = c->next; + + p->unlock(); + c->unlock(); + return true; + } else { + p->unlock(); + c->unlock(); + return false; + } +} +bool LazySet::ctn(int element) { + Node* c = first; + while (c->is_smaller_than(element)) { + c = c->next; + } + if (!c->is_equal(element) || c->deleted) { + return false; + } else { + return true; + } +} + + +std::tuple LazySet::locate(int element) { + Node* p = first; + Node* c = p->next; + + while (c->is_smaller_than(element)) { + p = c; + c = c->next; + } + p->lock(); + c->lock(); + if (!p->deleted && !c->deleted && p->next == c) { + p->unlock(); + c->unlock(); + return {p, c}; + } + + p->unlock(); + c->unlock(); + return {Node::Dummy(), Node::Dummy()}; +} \ No newline at end of file diff --git a/Assignment_2/Node.cpp b/Assignment_2/Node.cpp index 75f33b4..c2b110e 100644 --- a/Assignment_2/Node.cpp +++ b/Assignment_2/Node.cpp @@ -8,6 +8,7 @@ class Node { public: Node* next; + bool deleted; Node(int element); static Node* Dummy(); @@ -24,6 +25,7 @@ class Node { Node::Node(int element){ data = element; is_dummy = false; + deleted = false; } Node* Node::Dummy(){