mirror of
https://github.com/TheAlgorithms/C-Plus-Plus.git
synced 2026-02-03 02:25:57 +08:00
49 lines
1.3 KiB
C++
49 lines
1.3 KiB
C++
/**
|
|
* @file
|
|
* @brief Provides Node class and related utilities
|
|
**/
|
|
#ifndef DATA_STRUCTURES_NODE_HPP_
|
|
#define DATA_STRUCTURES_NODE_HPP_
|
|
|
|
#include <iostream> /// for std::cout
|
|
#include <memory> /// for std::shared_ptr
|
|
#include <vector> /// for std::vector
|
|
|
|
/** Definition of the node as a linked-list
|
|
* \tparam ValueType type of data nodes of the linked list should contain
|
|
*/
|
|
template <class ValueType>
|
|
struct Node {
|
|
using value_type = ValueType;
|
|
ValueType data = {};
|
|
std::shared_ptr<Node<ValueType>> next = {};
|
|
};
|
|
|
|
template <typename Node, typename Action>
|
|
void traverse(const Node* const inNode, const Action& action) {
|
|
if (inNode) {
|
|
action(*inNode);
|
|
traverse(inNode->next.get(), action);
|
|
}
|
|
}
|
|
|
|
template <typename Node>
|
|
void display_all(const Node* const inNode) {
|
|
traverse(inNode,
|
|
[](const Node& curNode) { std::cout << curNode.data << " "; });
|
|
}
|
|
|
|
template <typename Node>
|
|
std::vector<typename Node::value_type> push_all_to_vector(
|
|
const Node* const inNode, const std::size_t expected_size=0) {
|
|
std::vector<typename Node::value_type> res;
|
|
if (expected_size != 0) {
|
|
res.reserve(expected_size);
|
|
}
|
|
traverse(inNode,
|
|
[&res](const Node& curNode) { res.push_back(curNode.data); });
|
|
return res;
|
|
}
|
|
|
|
#endif // DATA_STRUCTURES_NODE_HPP_
|