/
Puzzman
/
basic_programming
Обзор
Документация
Войти
/
Puzzman
/
basic_programming
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
cppl_homework_4_02/Main.cpp
150 строк
3 KB
Puzzanis
cppl_homework 4_02 added
15 ноя 2024, 17:45
15 ноя 2024, 17:45
c506ddb
Код
Авторство
О чём код?
#include <iostream> #include "catch2/catch_test_macros.hpp" #include "catch2/catch_session.hpp" #include <exception> #include <iostream> struct ListNode { public: ListNode(int value, ListNode* prev = nullptr, ListNode* next = nullptr) : value(value), prev(prev), next(next) { if (prev != nullptr) prev->next = this; if (next != nullptr) next->prev = this; } public: int value; ListNode* prev; ListNode* next; }; class List { public: List() : m_head(new ListNode(static_cast<int>(0))), m_size(0), m_tail(new ListNode(0, m_head)) { } virtual ~List() { Clear(); delete m_head; delete m_tail; } bool Empty() { return m_size == 0; } unsigned long Size() { return m_size; } void PushFront(int value) { new ListNode(value, m_head, m_head->next); ++m_size; } void PushBack(int value) { new ListNode(value, m_tail->prev, m_tail); ++m_size; } int PopFront() { if (Empty()) throw std::runtime_error("list is empty"); auto node = extractPrev(m_head->next->next); int ret = node->value; delete node; return ret; } int PopBack() { if (Empty()) throw std::runtime_error("list is empty"); auto node = extractPrev(m_tail); int ret = node->value; delete node; return ret; } void Clear() { auto current = m_head->next; while (current != m_tail) { current = current->next; delete extractPrev(current); } } private: ListNode* extractPrev(ListNode* node) { auto target = node->prev; target->prev->next = target->next; target->next->prev = target->prev; --m_size; return target; } private: ListNode* m_head; ListNode* m_tail; unsigned long m_size; }; TEST_CASE("TEST_LIST", "[LIST]") { List L1; SECTION("Проверка добавления элемента в конец списка PushBack(int value)") { INFO("Проверка добавления элемента в конец списка PushBack(int value)"); //Пустой CHECK_FALSE(!L1.Empty()); L1.PushBack(100); CHECK(L1.Size() == 1); L1.PopBack(); //Пустой CHECK_FALSE(!L1.Empty()); CHECK(L1.Size() == 0); L1.PushBack(100); L1.PushFront(100); L1.PushFront(100); CHECK(L1.Size() == 3); L1.PopBack(); CHECK(L1.Size() == 2); L1.PopBack(); L1.PopBack(); CHECK_THROWS(L1.PopBack()); CHECK_THROWS(L1.PopFront()); CHECK(L1.Size() == 0); }; }; int main(int argc, char* argv[]) { setlocale(LC_ALL, "RU"); return Catch::Session().run(argc, argv); }