Skip to content
Snippets Groups Projects
linkedlist.cpp 6.3 KiB
Newer Older
#include "node.h"
#include <string>

/*
    brief construtor de LinkedList usando template
    @return   LinkedList<T>
*/
template <class T>
LinkedList<T>::LinkedList(){
    this->head = new Node<T>();
    this->tail = new Node<T>();

    this->head->setNext(this->tail);
    this->head->setPrevious(NULL);

    this->tail->setNext(NULL);
    this->tail->setPrevious(this->head);

    this->quantity = 0;
}


/*
    brief Destrutor do Objeto LinkedList usando template
*/

template <class T>
LinkedList<T>::~LinkedList(){
    Node<T>* no = this->head;
    while(no != this->tail){
        Node<T>* toDestroy = no;
        no = no->getNext();
        delete toDestroy;
    }

    delete this->tail;
}

/*
    @brief get da variavel quantity usando template
    @return  quantidade de elementos na lista
*/
template <class T>
int LinkedList<T>::getQuantity(void) {
    return this->quantity;
}


/*
    @brief método que verifica se a lista está vazia
    @return  true se a lista estiver vazia e false se estiver com elementos nela
*/

template <class T>
bool LinkedList<T>::isEmpty(void) {
    return this->quantity == 0;
}


/*
    @brief Get da variavel head usando template
    @return  ponteiro que aponta para o primeiro elemento da lista
*/
template <class T>
Node<T>* LinkedList<T>::getHead(void) {
    return this->head;
}


/*
    @brief Get da variavel tail usando template
    @return  ponteiro que aponta para o ultimo elemento da lista
*/
template <class T>
Node<T>* LinkedList<T>::getTail(void) {
    return this->tail;
}


/*
    @brief Função que retorna o elemento de acordo com o indice dado no parametro
    @param i - indice do valor do nó a ser buscado
    @return  valor do nó
*/
template <class T>
T LinkedList<T>::get(int i) {
    int count = 1;
    T result;
    for(Node<T>* no = this->head->getNext(); no != this->tail; no = no->getNext()){
        if( i == count ){
            result = no->getValue();
            break;
        }
        count++;
    }
    return result;
}


/*
    @brief Função que busca um elemento na lista a partir de seu conteudo
    @param node_content - elemento a ser buscado na lista
    @return  indice do elemento que está sendo pesquisado
*/
template <class T>
int LinkedList<T>::search(T node_content) {
    int count = 1;

    for(Node<T>* no = this->head->getNext(); no != this->tail; no = no->getNext()) {
        T value = no->getValue();
        if( no == value )
        {
            return count;
        }
        count++;
    }
    return -1;
}


/*
    @brief Função que imprime os elementos da lista
*/
template <class T>
void LinkedList<T>::print(void) {
    for(Node<T>* no = this->head->getNext(); no != this->tail; no = no->getNext())
    {
        std::cout << no->getValue() << " ";
    }
    std::cout << std::endl;
}


/*
    @brief Função que insere um elemento no inicio da lista
    @param node_content - elemento a ser inserido na lista
    @return  true se foi inserido com sucesso e false se a inserção não acontecer
*/
template <class T>
bool LinkedList<T>::insertBegin(T node_content) {

    Node <T>* no = this->getHead();
    Node <T>* new_no = new Node<T>(node_content);

    new_no->setNext(no->getNext());
    new_no->setPrevious(no);
    new_no->getNext()->setPrevious(new_no);
    new_no->getPrevious()->setNext(new_no);
    quantity++;

    return true;
}

/*
    @brief Função que insere um elemento no fim da lista
    @param node_content - elemento a ser inserido na lista
    @return  true se foi inserido com sucesso e false se a inserção não acontecer
*/

bool LinkedList<T>::insertEnd(T node_content){

    Node <T>* no = this->getTail();
    Node <T>* new_no = new Node<T>(node_content);

    new_no->setNext(no);
    new_no->setPrevious(no->getPrevious());
    new_no->getNext()->setPrevious(new_no);
    new_no->getPrevious()->setNext(new_no);
    quantity++;
    return true;
}


/*
    @brief Função que insere um elemento na lista de acordo com o indice colocado no parametro
    @param i - indice no qual o elemento será inserido na lista
            s - elemento a ser inserido na lista
    @return  true se foi inserido com sucesso e false se a inserção não acontecer
*/
bool LinkedList<T>::insert(int i, T s) {
    int y = 0;
    Node <T>* x = new Node<T>(s) ;
    Node<T>* n = this->getHead();
        while (y != i){
            if(n == this->getTail()){
                return false;
                n = n->getNext();
                y++;
            }
        }
        if( i == y){
        x->setNext(n);
        x->setPrevious(n->getPrevious());
        n->setPrevious(x);
        n->getPrevious()->getPrevious()->setNext(x);

        quantity++;
        return true;
       }
      return false;
}



/*
    @brief Função que remove o ultimo elemento da lista
    @return  elemento que foi removido
*/
template <class T>
T LinkedList<T>::removeEnd(void) {
    T no_toremove;
    Node<T>* no ;
    no = this->getTail()->getPrevious();
    no_toremove = no->getValue();
    this->getTail()->setPrevious(this->getTail()->getPrevious()->getPrevious() );
    this->getTail()->getPrevious()->setNext(this->getTail());

    quantity--;
    delete no;
    return no_toremove;
}


/*
    @brief Função que remove o primeiro elemento da lista
    @return  elemento que foi removido
*/
template <class T>
T LinkedList<T>::removeBegin(void) {
    T no_toremove;
    Node<T>* no ;
    no = this->getHead()->getNext();
    no_toremove = no->getValue();
    this->getHead()->setNext(this->getHead()->getNext()->getNext() );
    this->getHead()->getNext()->setPrevious(this->getHead());
    quantity--;

    delete no;
    return no_toremove;

}


/*
    @brief Função que remove um elemento na lista de acordo com o indice colocado no parametro
    @param i - indice no qual o elemento será removido na lista
    @return  elemento que foi removido
*/
template <class T>
T LinkedList<T>::remove(int indice) {
    int count = 0;

    Node<T>* n = this->getHead();
        while (count != indice){
                n = n->getNext();
                count++;
        }
        if( indice == count){
        T valor = n->getValue();
        n->getNext()->setPrevious(n->getPrevious());
        n->getPrevious()->setNext(n->getNext());
        quantity--;
        delete n;
        return valor;
       }
       return "";
}