← index
cplusplus11.Examples/linkedlist/list.cpp
Source: cplusplus11.Examples/linkedlist/list.cpp
// Been using C++ STL so long its about time I wrote a Linked List again.

#include<iostream>
#include<string>

template<typename T>
class Node {
public:
    T value;
    Node<T> *next;
    Node();
    Node(const T &value);
};

template<typename T>
Node<T>::Node() {
    next = 0;
    value = "";
}
template<typename T>
Node<T>::Node(const T &v) {
    value = v;
    next = 0;
}

template<typename T>
class List {
public:
    List();
    ~List();
    Node<T> first;
    void add(const T &value);
    bool remove(int index);
    void release(Node<T> *n);
    inline bool empty() const {
        return (first.next == 0) ? true : false;
    }
};

template<typename T>
List<T>::List() {
    
}

template<typename T>
List<T>::~List() {
    if(first.next != 0)
        release(first.next);
}
template<typename T>
void List<T>::release(Node<T> *n) {
    if(n->next != 0)
        release(n->next);
    
    delete n;
}

template<typename T>
void List<T>::add(const T &value) {
    Node<T> *n;
    for(n = &first; n->next != 0; n = n->next) {
        
    }
    n->next = new Node<T>(value);
}

template<typename T>
bool List<T>::remove(int index) {
    if(index == 0) {
        Node<T> *node;
        node = first.next;
        if(first.next != 0) {
            node = first.next;
            if(node->next != 0) {
            	first.next = node->next;
            	delete node;
                return true;
            } else {
                delete node;
                first.next = 0;
                return true;
            }
        }
    }
    int count = 0;
    Node<T> *n, *prev;
    Node<T> **lst = &first.next;
    prev = first.next;
    while((n = *lst) != 0) {
        if(count == index) {
            if(prev != 0) {
                prev->next = n->next;
                delete n;
                return true;
            }
        }
        prev = n;
        lst = &n->next;
        ++count;
    }
    return false;
}

template<typename T>
void echo_list(List<T> &list) {
    Node<std::string> *n = list.first.next;
    unsigned int index = 0;
    while(n != 0) {
        std::cout << "Index: " << index << " value: " << n->value << "\n";
        n = n->next;
        ++index;
    }
}

int main() {
    List<std::string> list;
    list.add("Hello");
    list.add("World");
    list.add("!");
    echo_list(list);
    list.remove(1);
    echo_list(list);
    List<std::string> list2;
    list2.add("Hey");
    list2.remove(0);
    echo_list(list2);
    return 0;
}