2070 / C++ / Списки / Список head, tail, size

 

#include <iostream>
using namespace std;

class Node
{
    int _data;
    Node* next;

  public:
    Node(){ }

    Node(int d) {
      _data = d;
      next = nullptr;
    }

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

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

    int getData() {
      return _data;
    }

    Node* getNext()
    {
      return next;
    }

    ~Node(){ }
};

class List
{
    Node* head;
    Node* tail;
    int size;

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

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

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

    int PopBack() {
      int d = 0;
      if (size>0)
      {
        if (size == 1) {
        d = head->getData();
        delete head;
        head = nullptr;
        tail = nullptr;
        size = 0;
      }
      else
      {
        d = tail->getData();
        Node* prev = head;
        Node* tmp = head;
        Node* 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* cur = head;
        while (cur) {
        cout << cur->getData() << " ";
        cur = cur->getNext();
      }
    }

    ~List(){ }
};

int main() {
  List A;
  A.PushBack(3);
  A.PushBack(4);
  A.PushBack(5);
  cout << "Queque (real):" << 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 (simulation):" << endl;
  cout << A.PopBack() << endl;
  cout << A.PopBack() << endl;
  cout << A.PopBack() << endl;
  system("pause");
  return 0;
}

Queque (real):
3
4
5
Stack (simulation):
5
4
3