#include #include #include "solution.cpp" static int failures = 0; #define CHECK(cond, name) do { if (cond) std::printf("ok %s\n", name); \ else { std::printf("FAIL %s (line %d)\n", name, __LINE__); ++failures; } } while (0) static Node* build(const std::vector& v) { Node* head = nullptr; Node** tail = &head; for (int x : v) { *tail = new Node{x, nullptr}; tail = &(*tail)->next; } return head; } static std::vector to_vec(Node* h, size_t limit = 1000) { std::vector r; while (h && r.size() < limit) { r.push_back(h->value); h = h->next; } return r; } static void destroy(Node* h) { while (h) { Node* n = h->next; delete h; h = n; } } int main() { // reverse { Node* h = build({1, 2, 3, 4, 5}); Node* r = reverse_list(h); CHECK(to_vec(r) == std::vector({5, 4, 3, 2, 1}), "reverse [1..5] -> [5..1]"); destroy(r); } { Node* h = build({42}); Node* r = reverse_list(h); CHECK(r && r->value == 42 && r->next == nullptr, "reverse одного узла"); destroy(r); } CHECK(reverse_list(nullptr) == nullptr, "reverse пустого списка == nullptr"); { Node* h = build({7, 8}); Node* r = reverse_list(h); CHECK(to_vec(r) == std::vector({8, 7}), "reverse двух узлов"); destroy(r); } // middle { Node* h = build({1, 2, 3, 4, 5, 6}); Node* m = find_middle(h); CHECK(m && m->value == 4, "middle чётного [1..6] == 4 (второй из двух средних)"); destroy(h); } { Node* h = build({1, 2, 3, 4, 5}); Node* m = find_middle(h); CHECK(m && m->value == 3, "middle нечётного [1..5] == 3"); destroy(h); } { Node* h = build({9}); CHECK(find_middle(h) && find_middle(h)->value == 9, "middle одного узла == 9"); destroy(h); } CHECK(find_middle(nullptr) == nullptr, "middle пустого списка == nullptr"); // cycle { Node* h = build({1, 2, 3, 4}); CHECK(!has_cycle(h), "has_cycle(без цикла) == false"); destroy(h); } { Node* h = build({1, 2, 3, 4, 5}); Node* third = h->next->next; Node* last = h; while (last->next) last = last->next; last->next = third; // цикл 3->4->5->3 CHECK(has_cycle(h), "has_cycle(цикл внутри) == true"); last->next = nullptr; destroy(h); } { Node* h = build({1, 2}); Node* last = h->next; last->next = h; // цикл на всю длину CHECK(has_cycle(h), "has_cycle(цикл на всю длину) == true"); last->next = nullptr; destroy(h); } { Node* one = new Node{5, nullptr}; one->next = one; CHECK(has_cycle(one), "has_cycle(сам на себя) == true"); one->next = nullptr; delete one; } CHECK(!has_cycle(nullptr), "has_cycle(nullptr) == false"); std::printf(failures ? "\nFAILURES: %d\n" : "\nALL PASS\n", failures); return failures ? 1 : 0; }