Newer
Older

Debora
committed
#include "linkedlist.h"
#include "node.h"
#include <string>

Debora
committed
/*
brief construtor de LinkedList usando template
@return LinkedList<T>
*/

Debora
committed
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
*/

Debora
committed
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
*/

Debora
committed
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
*/

Debora
committed
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
*/

Debora
committed
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
*/

Debora
committed
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ó
*/

Debora
committed
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
*/

Debora
committed
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
*/

Debora
committed
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
*/

Debora
committed
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
*/

Debora
committed
template <class T>
bool LinkedList<T>::insertEnd(T node_content){

Debora
committed
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
*/

Debora
committed
template <class T>
bool LinkedList<T>::insert(int i, T s) {

Debora
committed
int y = 0;
Node <T>* x = new Node<T>(s) ;
Node<T>* n = this->getHead();
while (y != i){
if(n == this->getTail()){
return false;
}
else {

Debora
committed
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
*/

Debora
committed
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
*/

Debora
committed
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
*/

Debora
committed
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 "";
}