#include #include template struct LinkedListNode { T data; LinkedListNode* next; LinkedListNode(const T& elem, LinkedListNode* n = nullptr) : data{elem}, next {n} {} }; template void printLinkedList(const LinkedListNode* ll) { const LinkedListNode* iterate = ll; while(iterate) { std::cout << iterate->data << " "; iterate = iterate->next; } std::cout << std::endl; } template void printLinkedList(const LinkedListNode* ll, void (*print)(T)) { const LinkedListNode* iterate = ll; while(iterate) { print(iterate->data); iterate = iterate->next; } std::cout << std::endl; } template void printLinkedList(const LinkedListNode* ll, void (*print)(const T&)) { const LinkedListNode* iterate = ll; while(iterate) { print(iterate->data); iterate = iterate->next; } std::cout << std::endl; } template LinkedListNode* fromList(const std::initializer_list& l) { LinkedListNode* toReturn = nullptr; LinkedListNode* iter = nullptr; for(const auto& elem : l) { LinkedListNode* toInsert = new LinkedListNode(elem); if(iter == nullptr) { toReturn = toInsert; iter = toInsert; } else { iter->next = toInsert; iter = iter->next; } } return toReturn; } template void freeList(LinkedListNode* ll) { while(ll) { LinkedListNode* toDelete = ll; ll = ll->next; delete toDelete; } }