From 5e595c4055876c4169e6eb7a9bcbbe67787e69ce Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 5 Jan 2023 18:28:02 +0200 Subject: [SDP/E2] Added work from exam --- .../Structures and data algorithms/Exam 2/ex1.cpp | 119 +++++++++++++++++++++ .../Structures and data algorithms/Exam 2/ex2.cpp | 81 ++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 Year 2/Structures and data algorithms/Exam 2/ex1.cpp create mode 100644 Year 2/Structures and data algorithms/Exam 2/ex2.cpp diff --git a/Year 2/Structures and data algorithms/Exam 2/ex1.cpp b/Year 2/Structures and data algorithms/Exam 2/ex1.cpp new file mode 100644 index 0000000..822d316 --- /dev/null +++ b/Year 2/Structures and data algorithms/Exam 2/ex1.cpp @@ -0,0 +1,119 @@ +#include +#include +#include // Б подточка + +template +struct Node { + T data; + Node *left, *right; + Node(const T& data, Node* left = nullptr, Node* right = nullptr) : data(data), left(left), right(right) {} +}; + +void freeTree(const Node* tree) { + if (tree == nullptr) return; + freeTree(tree->left); + freeTree(tree->right); + delete tree; +} + +/* Подточка А */ + +bool checkWord(const Node* tree, const char* start, const char* end) { + if (start == end) + return true; + if (start == nullptr || tree == nullptr) + return false; + if (*start != tree->data) + return false; + + return checkWord(tree->left, start + 1, end) || checkWord(tree->right, start + 1, end); +} + +bool readWord(const Node* tree, const char* word) { + if (strlen(word) < 4) + throw std::runtime_error("Word length cannot be less than 4!"); + + const char* endWord = word; + while (*endWord != '\0') endWord++; + + const char* separator = word + 1; + while (separator != endWord) { + if (checkWord(tree->right, word, separator) && checkWord(tree->left, separator, endWord)) + return true; + separator++; + } + return false; +} + +void A() { + const Node* t = + new Node('F', + new Node('B', + new Node('A'), + new Node('D', + new Node('C'), + new Node('E'))), + new Node('G', + nullptr, + new Node('I', + new Node('H'), + nullptr))); + + std::cout << readWord(t, "GIBDC") << readWord(t, "GIBD") << readWord(t, "GIBCD") << readWord(t, "GHBD") << std::endl; + freeTree(t); +} + +/* Подточка Б */ + +bool risingOrder(std::vector& v) { + for (size_t i = 0; i < v.size() - 1; i++) { + if (v[i] > v[i+1]) return false; + } + return true; +} + +void getLevel(const Node* tree, size_t level, std::vector& out) { + if (level == 0) return; + if (tree->left != nullptr) getLevel(tree->left, level - 1, out); + if (level == 1) { + out.push_back(tree->data); + return; + } + if (tree->right != nullptr) getLevel(tree->right, level - 1, out); +} + +size_t minLevel(const Node* tree) { + std::vector temp; + size_t i = 1; + getLevel(tree, i, temp); + while (!temp.empty()) { + i++; + temp.clear(); + getLevel(tree, i, temp); + if (risingOrder(temp)) break; + } + return (temp.empty()) ? 0 : i; +} + +void B() { + const Node* t = + new Node('F', + new Node('Z', + new Node('Z'), + new Node('D', + new Node('C'), + new Node('E'))), + new Node('G', + nullptr, + new Node('I', + new Node('H'), + nullptr))); + + std::cout << minLevel(t) << std::endl; + freeTree(t); +} + +int main() { + //A(); + B(); +} diff --git a/Year 2/Structures and data algorithms/Exam 2/ex2.cpp b/Year 2/Structures and data algorithms/Exam 2/ex2.cpp new file mode 100644 index 0000000..cbe6a02 --- /dev/null +++ b/Year 2/Structures and data algorithms/Exam 2/ex2.cpp @@ -0,0 +1,81 @@ +#include + +template +struct DLListElem { + T data; + DLListElem *next, *prev; + DLListElem(const T& data, DLListElem* next = nullptr, DLListElem* prev = nullptr) : data(data), next(next), prev(prev) {} +}; + +template +void freeList(DLListElem* l) { + DLListElem* temp; + while (l != nullptr) { + temp = l; + l = l->next; + delete temp; + } +} + +// A <-> i <-> j <-> D + +template +void swap(DLListElem* i, DLListElem* j) { + if (i == j) return; + if (i->prev != nullptr) i->prev->next = j; + if (j->next != nullptr) j->next->prev = i; + DLListElem* iPrev = i->prev; + i->next = j->next; + i->prev = j; + j->next = i; + j->prev = iPrev; +} +template +void swapNext(DLListElem* i, DLListElem* j) { + if (i == j) return; + if (i->prev != nullptr) i->prev->next = j; + i->next = j->next; + j->next = i; +} + +// O(n^2) time complexity +template +void sortDescending(DLListElem* start, DLListElem* end) { + for (DLListElem* i = end; i != start && i != nullptr; i = i->prev) { + DLListElem* toSwap = i; + for (DLListElem* j = i->prev; j != start && j != nullptr; j = j->prev) { + if (j->data < toSwap->data) toSwap = j; + } + //swap(i, toSwap); + swapNext(i, toSwap); + } + // TODO: update prevs +} + +int main() { + DLListElem* l1 = new DLListElem(1); + DLListElem* l2 = new DLListElem(2); + DLListElem* l3 = new DLListElem(3); + DLListElem* l4 = new DLListElem(4); + DLListElem* l5 = new DLListElem(5); + DLListElem* l6 = new DLListElem(6); + DLListElem* l7 = new DLListElem(7); + DLListElem* l8 = new DLListElem(8); + + // 8 7 2 5 6 1 4 3 + l8->next = l7; + l7->prev = l8; l7->next = l2; + l2->prev = l7; l2->next = l5; + l5->prev = l2; l5->next = l6; + l6->prev = l5; l6->next = l1; + l1->prev = l6; l1->next = l4; + l4->prev = l1; l4->next = l3; + l3->prev = l4; + + sortDescending(l8, l3); + for (DLListElem* i = l8; i != nullptr; i = i->next) + std::cout << i->data << ", "; + std::cout << std::endl; + + freeList(l1); +} -- cgit v1.3.1-23-gd82d