diff options
| author | Santo Cariotti <dcariotti24@gmail.com> | 2020-05-13 20:21:54 +0200 | 
|---|---|---|
| committer | Santo Cariotti <dcariotti24@gmail.com> | 2020-05-13 20:21:54 +0200 | 
| commit | e2e7a2e4fa6e50397da79da9cb8c2aec76779575 (patch) | |
| tree | fa2e8654b759c3eb2b274c2751f02299d2f48c95 /I_anno/Programmazione_2/data_structures/circle_list.cc | |
| parent | 0d2341999a9c844954aca9ed4cc739b8fde34584 (diff) | |
fix: improve code quality for data structures
Diffstat (limited to 'I_anno/Programmazione_2/data_structures/circle_list.cc')
| -rw-r--r-- | I_anno/Programmazione_2/data_structures/circle_list.cc | 118 | 
1 files changed, 62 insertions, 56 deletions
diff --git a/I_anno/Programmazione_2/data_structures/circle_list.cc b/I_anno/Programmazione_2/data_structures/circle_list.cc index b6be463..2143ac1 100644 --- a/I_anno/Programmazione_2/data_structures/circle_list.cc +++ b/I_anno/Programmazione_2/data_structures/circle_list.cc @@ -15,42 +15,20 @@ public:      list() : _head{nullptr} {}      ~list() { -        while(_head != nullptr) { -            node<T>* tmp = _head->next; -            delete tmp; -            _head = tmp; -        } -    } - -    node<T>* last_element() {          node<T>* iter = _head; -        while(iter && iter->next != _head) { -            iter = iter->next; -        } - -        return iter; -    } - -    node<T>* search(T val) { -        if(_head == nullptr) return nullptr; - -        node<T>* iter = _head; -        if(iter->value == val)  -            return iter; - -        while(iter && iter->value != val) { +        while(iter->next != _head) { +            node<T>* tmp = iter; +            delete tmp;              iter = iter->next;          } - -        if(iter == _head) return nullptr; - -        return iter; +        node<T>* tmp = iter; +        delete tmp;      }      list* push_front(T val) { -        auto elem = last_element(); +        auto elem = _last();          _head = new node<T>{val, _head}; -        if(elem == nullptr) +        if(!elem)              elem = _head;          elem->next = _head; @@ -59,57 +37,61 @@ public:      }      list* push_back(T val) { -        node<T>* iter = _head; -        if(_head == nullptr) { -            _head = new node<T>{val, _head}; -        } else { -            while(iter->next != nullptr && iter->next != _head) { -                iter = iter->next; -            } -            iter->next = new node<T>{val, _head}; -        } +        if(!_head) return this->push_front(val); + +        auto last_e = _last(); +        last_e->next = new node<T>{val, _head}; +          return this;      }      list* push_after_value(T val, T newval) { -        if(!search(val)) return this; +        node<T>* iter = _search(val); +        if(iter) +            iter->next = new node<T>{newval, iter->next}; + +        return this; +    } + +    list* push_before_value(T val, T newval) { +        node<T>* elem = _search(val); +        if(!elem) return this;          node<T>* iter = _head; -        while(iter && iter->value != val) -            iter = iter->next; -        if(iter == nullptr) +        if(iter->value == val)              return this->push_front(newval); +        while(iter->next != elem) +            iter = iter->next; +          iter->next = new node<T>{newval, iter->next};          return this;      } -    list* push_before_value(T val, T newval) { -        if(!search(val)) return this; +    list* pop(int val) { +        node<T>* elem = _search(val); +        if(!elem) return this;          node<T>* iter = _head; +        if(iter == elem) return this->pop_front(); -        if(iter->value == val) -            return this->push_front(newval); - -        while(iter && iter->next && iter->next->value != val) +        while(iter->next != elem)              iter = iter->next; -        if(iter == nullptr) -            return this->push_front(newval); - -        iter->next = new node<T>{newval, iter->next}; +        node<T>* temp = iter->next; +        iter->next = iter->next->next; +        delete temp;          return this;      }      list* pop_front() { -        if(_head == nullptr) +        if(!_head)              return this; -        auto last_e = last_element(); +        auto last_e = _last();          if(last_e == _head) {              delete _head; @@ -125,11 +107,11 @@ public:      }      list* pop_back() { -        if(_head == nullptr) +        if(!_head)              return this;          node<T>* iter = _head; -        auto last_e = last_element(); +        auto last_e = _last();          if(last_e == _head) {              delete iter; @@ -155,6 +137,27 @@ public:          }      }  private: +    node<T>* _last() { +        node<T>* iter = _head; +        while(iter && iter->next != _head) { +            iter = iter->next; +        } + +        return iter; +    } + +    node<T>* _search(T val) { +        node<T>* iter = _head; +        if(iter->value == val) return iter; + +        while(iter && iter->value != val) { +            iter = iter->next; +            if(iter == _head) return nullptr; +        } + +        return iter; +    } +      node<T>* _head;  }; @@ -178,6 +181,9 @@ int main() {      l->print(); cout << endl;      l->push_before_value(3, 5);      l->print(); cout << endl; +    l->pop(5); +    l->print(); cout << endl; +    delete l;      return 0;  }  |