Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. #include <iostream>
  2. #include "ilist.cpp"
  3.  
  4. using namespace std;
  5.  
  6. template<class T> class node : public inode<T> {
  7. private:
  8.     T value;
  9.     inode<T>* prev;
  10.     inode<T>* next;
  11. public:
  12.     node(inode<T>* prev=NULL, inode<T>* next=NULL)
  13.         : inode<T>(), prev(prev), next(next) {  }
  14.     node(T t, inode<T>* prev=NULL, inode<T>* next=NULL)
  15.         : inode<T>(),prev(prev), next(next), value (t) {  }
  16.     ~node() {}
  17.  
  18.     T get_val() {
  19.         return value;
  20.     }
  21.     void set_val(T t) {
  22.         value = t;
  23.     }
  24.     inode<T>* get_prev() {
  25.         return prev;
  26.     }
  27.     inode<T>* get_next() {
  28.         return next;
  29.     }
  30.     bool has_next() {
  31.         return NULL != next;
  32.     }
  33.     bool has_prev() {
  34.         return NULL != prev;
  35.     }
  36.     void set_prev(inode<T>* prev) {
  37.         this->prev = prev;
  38.     }
  39.     void set_next(inode<T>* next) {
  40.         this->next = next;
  41.     }
  42. };
  43.  
  44. template <class T> class list2 : public ilist<T> {
  45. protected:
  46.     inode<T>* HEAD;
  47.     inode<T>* TAIL;
  48.     inode<T>* it_el;
  49. public:
  50.     list2() : HEAD(NULL), TAIL(NULL), it_el(NULL) {}
  51.     ~list2() {}
  52.     void push_front(T t) {
  53.         append(t, 0);
  54.     }
  55.     void push_back(T t) {
  56.         append(t, -1);
  57.     }
  58.     void insert(T t, int i) {
  59.         append(t, i);
  60.     }
  61.     void append(T t, int i) {
  62.         reset();
  63.         if (-1 == i) { //na koniec
  64.             next();
  65.             if (NULL == it_el) {
  66.                 TAIL = HEAD = new node<T>(t);
  67.                 return;
  68.             }
  69.             TAIL->set_next(new node<T>(t));
  70.             TAIL->get_next()->set_prev(TAIL);
  71.             TAIL = TAIL->get_next();
  72.             return;
  73.         }
  74.         if (0 == i) { //na poczatek
  75.             if (NULL == HEAD) {
  76.                 it_el = TAIL = HEAD = new node<T>(t);
  77.             } else {
  78.                 inode<T>* HEAD = this->HEAD;
  79.                 (this->HEAD = new node<T>(t))->set_next(HEAD);
  80.                 HEAD->set_prev(this->HEAD);
  81.             }
  82.             return;
  83.         }
  84.         if (NULL == HEAD) {
  85.             it_el = TAIL = HEAD = new node<T>(t);
  86.             return;
  87.         }
  88.  
  89.         for (int _i=0; _i < i; _i++)
  90.             next();
  91.         inode<T>* buff = it_el->get_next();
  92.         it_el->set_next(new node<T>(t));
  93.         it_el->get_next()->set_next(buff);
  94.         if (buff)
  95.             buff->set_prev(it_el->get_next());
  96.         it_el->get_next()->set_prev(it_el);
  97.         return;
  98.     }
  99.  
  100.     /** resetuje iteracje */
  101.     void reset() {
  102.         it_el = NULL;
  103.     }
  104.  
  105.     T get_val(int idx) { //indeksowane od zera
  106.         if (NULL == HEAD) {
  107.             cout << "BLAD!";
  108.             return (T)NULL;
  109.         }
  110.         if (0 == idx)
  111.             return it_el->get_val();
  112.         it_el=HEAD;
  113.         for (int i = 0; i<idx; i++)
  114.             next();
  115.         return it_el->get_val();
  116.     }
  117.  
  118.     bool next() {
  119.         if (NULL == it_el && NULL == HEAD) //brak elementow
  120.             return false;
  121.         if (NULL == it_el) { // iteracja po resecie
  122.             it_el = HEAD;
  123.             return true;
  124.         }
  125.         if (!it_el->has_next()) // istnieje nastepnik
  126.             return false;
  127.         return it_el=it_el->get_next(); // ustawienie nastepnika
  128.     }
  129.     void print() {
  130.         reset();
  131.         cout << '[';
  132.         if (next())
  133.             cout << it_el->get_val();
  134.         while(next())
  135.             cout << ", " << it_el->get_val();
  136.         cout << ']' << endl;
  137.     }
  138.     void remove_front() {
  139.         reset();
  140.         inode<T>* HEAD = this->HEAD;
  141.         this->HEAD = HEAD->get_next();
  142.         this->HEAD->set_prev(NULL);
  143.         HEAD->set_next(NULL);
  144.         remove(HEAD);
  145.     }
  146.     void remove_back() {
  147.         if (NULL == HEAD)
  148.             return;
  149.         if (!HEAD->has_next()) {
  150.             remove(HEAD);
  151.             HEAD = TAIL = NULL;
  152.             return;
  153.         }
  154.         inode<T>* TAIL = this->TAIL;
  155.         (this->TAIL = this->TAIL->get_prev())->set_next(NULL);
  156.         TAIL->set_prev(NULL);
  157.         remove(TAIL);
  158.  
  159.     }
  160.     void remove(inode<T>* t) {
  161.         if (t->has_next())
  162.             remove(t->get_next());
  163.         delete t;
  164.     }
  165. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement