mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
7c090481da
* fix: remove memory leak in queue
* updating DIRECTORY.md
* clang-format and clang-tidy fixes for effd74c9
* style: simplify logic while using reserve
* style: use value_type as return type in front
* style: use proper error message
* style: use pre-increment and pre-decrement
* docs: use doxygen syntax
* docs: improve wording
Co-authored-by: github-actions[bot] <github-actions@users.noreply.github.com>
Co-authored-by: David Leal <halfpacho@gmail.com>
47 lines
1.3 KiB
C++
47 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;
|
|
res.reserve(expected_size);
|
|
traverse(inNode,
|
|
[&res](const Node& curNode) { res.push_back(curNode.data); });
|
|
return res;
|
|
}
|
|
|
|
#endif // DATA_STRUCTURES_NODE_HPP_
|