Untitled

 avatar
unknown
plain_text
2 years ago
2.4 kB
5
Indexable
#ifndef LIST_H
#define LIST_H

#include "Node.hpp"

template <typename T>
class List {
  private:
    Node<T>* head;
    Node<T>* tail;
    int size;
  public:
    // Construtor
    List() {
      head = nullptr;
      tail = nullptr;
      size = 0;
    }

    // Retorna se a lista está vazia ou não.
    bool isEmpty() {
      return (size == 0);
    }

    // Retorna o tamanho da lista.
    int getSize() {
      return size;
    }

    // Insere um elemento no final da lista
    void push_back(T data) {
      // Cria um novo nó com o elemento
      Node<T>* new_node = new Node<T>(data);

      // Se a lista estiver vazia, o elemento adicionado sera tanto o primeiro (head)
      // quanto o ultimo (tail) elemento da lista.
      if (head == nullptr) {
        head = new_node;
        tail = new_node;
      } else {
        // Se não estiver vazia, o próximo elemento do antigo último elemento
        // sera o elemento adicionado.
        tail->setNext(new_node);

        // O elemento adicionado é o ultimo elemento da lista agora.
        tail = new_node;
      }
      // A lista tem mais um elemento.
      size++;
    }

    // Retorna o nó que estiver no índice informado
    Node<T>* at(int index) {
      // Se o índice for menor que zero, ou igual ou maior que o tamanho da lista
      if (index < 0 || index >= size) {
        // Retorna um erro (out_of_range)
        throw out_of_range("Esse indice nao existe na lista.");
      }
      // Pega a cabeça (Head) da lista
      Node<T>* current = head;

      // Vai "Passando pra frente" até chegar no nó do índice desejado
      for (int i = 0; i < index; i++) {
        current = current->getNext();
      }
      return current;
    }

    void removeAt(int index) {
      // Se o índice for menor que zero, ou igual ou maior que o tamanho da lista
      if (index < 0 || index >= size) {
        // Retorna um erro (out_of_range)
        throw out_of_range("Esse indice nao existe na lista.");
      }
      // Pega o nó do elemento que sera removido
      Node<T>* current = this->at(index);

      // Se o elemento for a cabeça (Head) da lista
      if (current == head) {
        Node<T>* temp = head;
        head = head->getNext();
        delete temp;
        size--;
        if (head == nullptr) {
          tail = nullptr;
        }
      }
    }
};
#endif
Editor is loading...