#include <iostream>

template <typename T>
struct node
{
    T data ;
    node<T>* next = nullptr;

    node(const T& t) : data(t) {}
};

template <typename T>
void append(node<T>* list, node<T>* appendMe)
{
    if (!list->next)
        list->next = appendMe;
    else
        append(list->next, appendMe);
}

template <typename T>
void append(node<T>*& list, const T& item)
{
    if (list == nullptr)
    {
        list = new node<T>(item);
    }
    else
        append(list, new node<T>(item));
}

template <typename T>
void print(const node<T>* list)
{
    const node<T>* current = list;
    while (current)
    {
        std::cout << current->data << '\n';
        current = current->next;
    }
}

template <typename T>
void destroy(node<T>* list)
{
    node<T>* current = list;
    while (current)
    {
        node<T>* temp = current;
        current = current->next;
        delete temp;
    }

}

int main()
{
    node<int>* list = nullptr;
    for (int i = 1; i <= 10; ++i)
        append(list, i);

    print(list);
    destroy(list);
}
