diff options
| author | robojumper <robojumper@gmail.com> | 2024-04-26 11:52:24 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2024-04-27 16:40:07 +0200 |
| commit | 705b0b598e5afa99dc93bb12b49ef2a9d7e38d0b (patch) | |
| tree | b9a8b4daf8716feb2b132677c2e0f80b8dd119a8 /src | |
| parent | 1ee2fdd8845d7ec2502b33ef2f45b4ab17e9d88e (diff) | |
c/c_tree.cpp
Diffstat (limited to 'src')
| -rw-r--r-- | src/c/c_tree.cpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/c/c_tree.cpp b/src/c/c_tree.cpp new file mode 100644 index 00000000..a413761f --- /dev/null +++ b/src/c/c_tree.cpp @@ -0,0 +1,114 @@ +#include <c/c_tree.h> + +cTreeNd_c::cTreeNd_c() { + this->forcedClear(); +} + +void cTreeNd_c::forcedClear() { + this->mpParent = nullptr; + this->mpChild = nullptr; + this->mpPrev = nullptr; + this->mpNext = nullptr; +} + +bool cTreeMg_c::addTreeNode(cTreeNd_c *node, cTreeNd_c *parent) { + if (node != nullptr) { + if (parent != nullptr) { + node->mpParent = parent; + if (parent->mpChild == nullptr) { + parent->mpChild = node; + } else { + cTreeNd_c *cursor; + for (cursor = parent->mpChild; cursor->mpNext != nullptr; cursor = cursor->mpNext) {} + cursor->mpNext = node; + node->mpPrev = cursor; + } + } else { + cTreeNd_c *cursor = this->mpRootNode; + if (cursor != nullptr) { + for (; cursor->mpNext != nullptr; cursor = cursor->mpNext) {} + cursor->mpNext = node; + node->mpPrev = cursor; + } else { + this->mpRootNode = node; + } + } + } else { + return false; + } + return true; +} + +bool cTreeMg_c::removeTreeNode(cTreeNd_c *node) { + if (node != nullptr) { + if (node->mpChild != nullptr) { + return false; + } + if (node->mpPrev != nullptr) { + node->mpPrev->mpNext = node->mpNext; + } else if (node->mpParent != nullptr) { + node->mpParent->mpChild = node->mpNext; + } else if (node == this->mpRootNode) { + this->mpRootNode = node->mpNext; + } + + if (node->mpNext != nullptr) { + node->mpNext->mpPrev = node->mpPrev; + } + + node->mpPrev = nullptr; + node->mpNext = nullptr; + node->mpParent = nullptr; + } else { + return false; + } + return true; +} + +bool cTreeMg_c::insertTreeNode(cTreeNd_c *node, cTreeNd_c *parent) { + cTreeNd_c *cursor; + + for (cursor = parent; cursor != nullptr; cursor = cursor->mpParent) { + if (cursor == node) { + return false; + } + } + + if (node != nullptr) { + cTreeNd_c *child = node->mpChild; + node->mpChild = nullptr; + if (!this->removeTreeNode(node)) { + node->mpChild = child; + return false; + } else { + node->mpChild = child; + return this->addTreeNode(node, parent); + } + } + + return false; +} + +cTreeNd_c *cTreeNd_c::getTreeNext() const { + cTreeNd_c *child = this->mpChild; + if (child != nullptr) { + return child; + } else { + return this->getTreeNextNotChild(); + } +} + +cTreeNd_c *cTreeNd_c::getTreeNextNotChild() const { + if (this->mpNext != nullptr) { + return this->mpNext; + } + + cTreeNd_c *parent; + + for (parent = this->mpParent; parent != nullptr; parent = parent->mpParent) { + if (parent->mpNext != nullptr) { + return parent->mpNext; + } + } + return nullptr; +} |
