2070 / C++ / Списки / Список, що приймає різні типи даних

 

#include <iostream>
#include <string>

 

template <class K>
class Node
{
    K _data;
    Node* next;

  public:
    Node() { }
    Node(K d) {
      _data = d;
      next = nullptr;
    }

    void setNext(Node* n) {
      next = n;
    }

    void setData(K val) {
      _data = val;
    }

    K getData() {
      return _data;
    }

    Node* getNext()
    {
      return next;
    }

    ~Node() { }
};

template <class T>
class List
{
    Node<T>* head;
    Node<T>* tail;
    int size;

  public:
    List()
    {
      head = tail = nullptr;
      size = 0;
    }

    void PushBack(T val) {
      Node<T>* tmp = new Node<T>(val);
      if (size == 0)
      {
        head = tail = tmp;
        size = 1;
      }
      else {
        tail->setNext(tmp);
        tail = tmp;
        size++;
      }
    }

    T PopStart() {
      T d;
      if (size>0)
      {
        if (size == 1) {
          d = head->getData();
          delete head;
          head = nullptr;
          tail = nullptr;
          size = 0;
        }
        else
        {
          d = head->getData();
          Node<T>* tmp = head;
          head = head->getNext();
          delete tmp;
          size--;
        }
      }
      return d;
    }

    T PopBack() {
      T d;
      if (size>0)
      {
        if (size == 1) {
          d = head->getData();
          delete head;
          head = nullptr;
          tail = nullptr;
          size = 0;
        }
        else
        {
          d = tail->getData();
          Node<T>* prev = head;
          Node<T>* tmp = head;
          Node<T>* next = head;
          while (next != nullptr) {
            prev = tmp;
            tmp = next;
            next = next->getNext();
          }
          delete tmp;
          tail = prev;
          tail->setNext(nullptr);
          size--;
        }
      }
      return d;
    }

    void Show() {
      Node<T>* cur = head;
      while (cur) {
        cout << cur->getData() << " ";
        cur = cur->getNext();
      }
    }

    ~List() { }
};

int main() {
  List<int> A;
  A.PushBack(3);
  A.PushBack(4);
  A.PushBack(5);
  cout << "Queque:" << endl;
  cout << A.PopStart() << endl;
  cout << A.PopStart() << endl;
  cout << A.PopStart() << endl;
  A.PushBack(3);
  A.PushBack(4);
  A.PushBack(5);
  cout << endl << "Stack:" << endl;
  cout << A.PopBack() << endl;
  cout << A.PopBack() << endl;
  cout << A.PopBack() << endl;
  cout << endl;
  List<string> B;
  B.PushBack("AA");
  B.PushBack("BB");
  B.PushBack("CC");
  cout << "Queque:" << endl;
  cout << B.PopStart()<<endl;
  cout << B.PopStart() << endl;
  cout << B.PopStart() << endl;
  B.PushBack("AA");
  B.PushBack("BB");
  B.PushBack("CC");
  cout << endl << "Stack:" << endl;
  cout << B.PopBack() << endl;
  cout << B.PopBack() << endl;
  cout << B.PopBack() << endl;
  system("pause");
  return 0;
}

Queque:
3
4
5
Stack:
5
4
3
Queque:
AA
BB
CC
Stack:
CC
BB
AA