Skip to content
Snippets Groups Projects
linkedlist.h 4.93 KiB
Newer Older
#ifndef __LINKEDLIST_H__
#define __LINKEDLIST_H__

#include "Node.h"
#include <string>

typedef enum {
    OK ,
    HeadNull,
    TailNull,
    HeadPrevious,
    HeadNextNull,
    TailNext,
    TailPreviousNull,
    HeadTail,
    IncorrectLink
} ListStatus ;

template <class T>
class LinkedList {
private:
    Node<T>* head;
    Node<T>* tail;
    int quantity;
    
public:
    LinkedList(void);
    ~LinkedList(void);

    Node<T>* getHead(void);
    Node<T>* getTail(void);
    
    T get(int);
    int search(T);
    bool insertEnd(T);
    bool insertBegin(T);
    bool insert(int, T);

    T removeEnd(void);
    T removeBegin(void);
    T remove(int);
    
    void print(void);
    
    bool isEmpty(void);
    int getQuantity(void);
};

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;
}

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;
}

template <class T>
int LinkedList<T>::getQuantity(void) {
    return this->quantity;
}

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

template <class T>
Node<T>* LinkedList<T>::getHead(void) {
    return this->head;
}

template <class T>
Node<T>* LinkedList<T>::getTail(void) {
    return this->tail;
}


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;
}

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;
}

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;
}

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;
}

template <class T>
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;
}

template <class T>
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;
            }else{
                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;
}



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;
}

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;
        
}

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 "";
}
#endif /* defined(__LinkedList__LinkedList__) */