Untitled
unknown
plain_text
2 years ago
2.4 kB
8
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;
}
}
}
};
#endifEditor is loading...