Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.36 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 list : public ilist<T> {
  45. protected:
  46.     inode<T>* HEAD;
  47.     inode<T>* it_el;
  48. public:
  49.     list() : HEAD(NULL), it_el(NULL) {}
  50.     ~list() {}
  51.     void push_front(T t) {
  52.         append(t, 0);
  53.     }
  54.     void push_back(T t) {
  55.         append(t, -1);
  56.     }
  57.     void insert(T t, int i) {
  58.         append(t, i);
  59.     }
  60.     void append(T t, int i) {
  61.         reset();
  62.         if (-1 == i) { //na koniec
  63.             next();
  64.             if (NULL == it_el) {
  65.                 HEAD = new node<T>(t);
  66.                 return;
  67.             }
  68.             while(next())
  69.                 ;
  70.             it_el->set_next(new node<T>(t));
  71.             return;
  72.         }
  73.         if (0 == i) { //na poczatek
  74.             if (NULL == HEAD) {
  75.                 it_el = HEAD = new node<T>(t);
  76.             } else {
  77.                 inode<T>* HEAD = this->HEAD;
  78.                 (this->HEAD = new node<T>(t))->set_next(HEAD);
  79.             }
  80.             return;
  81.         }
  82.         if (NULL == HEAD) {
  83.             it_el = HEAD = new node<T>(t);
  84.             return;
  85.         }
  86.  
  87.         for (int _i=0; _i < i; _i++)
  88.             next();
  89.         inode<T>* buff = it_el->get_next();
  90.         it_el->set_next(new node<T>(t));
  91.         it_el->get_next()->set_next(buff);
  92.         return;
  93.     }
  94.  
  95.     /** resetuje iteracje */
  96.     void reset() {
  97.         it_el = NULL;
  98.     }
  99.  
  100.     T get_val(int idx) { //indeksowane od zera
  101.         if (NULL == HEAD) {
  102.             cout << "BLAD!";
  103.             return (T)NULL;
  104.         }
  105.         if (0 == idx)
  106.             return it_el->get_val();
  107.         it_el=HEAD;
  108.         for (int i = 0; i<idx; i++)
  109.             next();
  110.         return it_el->get_val();
  111.     }
  112.  
  113.     bool next() {
  114.         if (NULL == it_el && NULL == HEAD) //brak elementow
  115.             return false;
  116.         if (NULL == it_el) { // iteracja po resecie
  117.             it_el = HEAD;
  118.             return true;
  119.         }
  120.         if (!it_el->has_next()) // istnieje nastepnik
  121.             return false;
  122.         return it_el=it_el->get_next(); // ustawienie nastepnika
  123.     }
  124.     void print() {
  125.         reset();
  126.         cout << '[';
  127.         if (next())
  128.             cout << (long)(it_el->get_val());
  129.         while(next())
  130.             cout << ", " << (long)(it_el->get_val());
  131.         cout << ']' << endl;
  132.     }
  133.     void remove_front() {
  134.         reset();
  135.         inode<T>* HEAD = this->HEAD;
  136.         this->HEAD = HEAD->get_next();
  137.         HEAD->set_next(NULL);
  138.         remove(HEAD);
  139.     }
  140.     void remove_back() {
  141.         if (NULL == HEAD)
  142.             return;
  143.         if (!HEAD->has_next()) {
  144.             remove(HEAD);
  145.             return;
  146.         }
  147.         it_el = HEAD;
  148.         while (it_el->has_next()) {
  149.             if (!it_el->get_next()->has_next()) {
  150.                 inode<T>* buff = it_el->get_next();
  151.                 it_el->set_next(NULL);
  152.                 remove(buff);
  153.                 return;
  154.             }
  155.             it_el = it_el->get_next();
  156.         }
  157.         reset();
  158.     }
  159.     void remove(inode<T>* t) {
  160.         if (t->has_next())
  161.             remove(t->get_next());
  162.         delete t;
  163.     }
  164.     void remove_from_it() {
  165.         inode<T>* buff = it_el;
  166.         reset();
  167.         while(next())
  168.             if (it_el->get_next() == buff) {
  169.                 it_el->set_next(NULL);
  170.             }
  171.         remove(buff);
  172.         reset();
  173.         if (!next())
  174.             HEAD = NULL;
  175.     }
  176. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement