From 7861570979c505af9847357c5aafa249206f287d Mon Sep 17 00:00:00 2001 From: nrusov Date: Thu, 12 Dec 2024 22:51:48 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=92=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B5=20s?= =?UTF-8?q?tack.c=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B0=D0=BC?= =?UTF-8?q?=D1=8F=D1=82=D0=B8=20=D0=B8=20=D0=BF=D1=83=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=82=D1=83=20=D1=81=D1=82=D0=B5=D0=BA=D0=B0=20=D0=B2=20pop=20?= =?UTF-8?q?=D0=B8=20searchByValue.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20isEmpty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/main.c | 5 ++--- 05_hw/stack.c | 23 +++++++++++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/05_hw/main.c b/05_hw/main.c index fded814..84466c0 100644 --- a/05_hw/main.c +++ b/05_hw/main.c @@ -30,7 +30,6 @@ int main() { printf("Top element: %d\n", topElement->data); } + destroyStack(&stack); return 0; -} - - +} \ No newline at end of file diff --git a/05_hw/stack.c b/05_hw/stack.c index 0964440..37e435e 100644 --- a/05_hw/stack.c +++ b/05_hw/stack.c @@ -1,10 +1,15 @@ #include #include +#include #include "stack.h" Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); + if(newNode == NULL){ + perror("Failed to allocate memory for node"); + exit(EXIT_FAILURE); + } newNode->data = data; newNode->next = NULL; return newNode; @@ -21,6 +26,7 @@ void destroyStack(Stack* stack) { current = current->next; free(tmp); } + stack->top = NULL; } void push(Stack* stack, int data) { @@ -30,22 +36,33 @@ void push(Stack* stack, int data) { } void pop(Stack* stack) { + if(stack->top == NULL){ + return; // Если стек пустой, ничего не делаем. + } Node* temp = stack->top; stack->top = stack->top->next; + free(temp); } Node* searchByValue(Stack* stack, int value) { Node* current = stack->top; + if (current == NULL){ + return NULL; + } while (current != NULL) { if (current->data == value) { return current; } + current = current->next; } return NULL; } Node* searchByIndex(Stack* stack, int index) { Node* current = stack->top; + if (current == NULL){ + return NULL; + } int count = 0; while (current != NULL) { if (count == index) { @@ -62,7 +79,7 @@ Node* getTop(Stack* stack) { } void traverseStack(Stack* stack) { - Node* current = stack->top; + Node* current = stack->top; printf("Stack elements: "); while (current != NULL) { printf("%d ", current->data); @@ -72,7 +89,5 @@ void traverseStack(Stack* stack) { } bool isEmpty(Stack* stack) { - free(stack->top); return stack->top == NULL; -} - +} \ No newline at end of file From e20cd450bad30223fde06be988b49e3e1f2f56de Mon Sep 17 00:00:00 2001 From: nrusov Date: Thu, 12 Dec 2024 23:04:53 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20test.c=20?= =?UTF-8?q?=D1=81=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/test.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 05_hw/test.c diff --git a/05_hw/test.c b/05_hw/test.c new file mode 100644 index 0000000..e1243ab --- /dev/null +++ b/05_hw/test.c @@ -0,0 +1,161 @@ +#include +#include +#include +#include "stack.h" + + + +void print_error(const char* test_name, const char* message) { + fprintf(stderr, "Test %s failed: %s\n", test_name, message); +} + + +void test_init_stack() { + Stack stack; + initStack(&stack); + assert(stack.top == NULL); // Убедиться, что стек пуст + printf("Test init_stack passed\n"); +} + +void test_push() { + Stack stack; + initStack(&stack); + push(&stack, 10); + assert(stack.top != NULL); // Вершина не должна быть NULL после push + assert(stack.top->data == 10); // Данные на вершине соответствуют добавленному элементу + push(&stack, 20); + assert(stack.top->data == 20); // Вершина обновляется с каждым новым элементом + printf("Test push passed\n"); + destroyStack(&stack); +} + + +void test_pop() { + Stack stack; + initStack(&stack); + push(&stack, 10); + push(&stack, 20); + pop(&stack); + assert(stack.top != NULL && stack.top->data == 10); // Удален верхний элемент + pop(&stack); + assert(stack.top == NULL); // Стек пуст + pop(&stack); // Попытка удалить из пустого стека + assert(stack.top == NULL); // Никаких изменений для пустого стека + printf("Test pop passed\n"); + destroyStack(&stack); +} + + +void test_search_by_value() { + Stack stack; + initStack(&stack); + push(&stack, 10); + push(&stack, 20); + + Node* result = searchByValue(&stack, 20); + assert(result != NULL && result->data == 20); + + result = searchByValue(&stack, 15); + assert(result == NULL); + + // Проверка на пустом стеке + Stack emptyStack; + initStack(&emptyStack); + result = searchByValue(&emptyStack, 10); + assert(result == NULL); + + printf("Test search_by_value passed\n"); + destroyStack(&stack); +} + + +void test_search_by_index() { + Stack stack; + initStack(&stack); + push(&stack, 10); + push(&stack, 20); + push(&stack, 30); + + Node* result = searchByIndex(&stack, 1); + assert(result != NULL && result->data == 20); // Элемент по индексу 1 найден + + result = searchByIndex(&stack, 0); + assert(result != NULL && result->data == 30); // Элемент по индексу 0 найден + + result = searchByIndex(&stack, 5); + assert(result == NULL); // Индекс вне пределов + + // Проверка на пустом стеке + Stack emptyStack; + initStack(&emptyStack); + result = searchByIndex(&emptyStack, 0); + assert(result == NULL); + printf("Test search_by_index passed\n"); + destroyStack(&stack); +} + + +void test_get_top() { + Stack stack; + initStack(&stack); + assert(getTop(&stack) == NULL); // Пустой стек + push(&stack, 10); + assert(getTop(&stack) != NULL && getTop(&stack)->data == 10); // Вершина корректна + push(&stack, 20); + assert(getTop(&stack)->data == 20); + printf("Test get_top passed\n"); + destroyStack(&stack); +} + + +void test_is_empty() { + Stack stack; + initStack(&stack); + assert(isEmpty(&stack) == true); + push(&stack, 10); + assert(isEmpty(&stack) == false); + pop(&stack); + assert(isEmpty(&stack) == true); + printf("Test is_empty passed\n"); + destroyStack(&stack); +} + + +void test_traverse_stack() { + Stack stack; + initStack(&stack); + push(&stack, 10); + push(&stack, 20); + push(&stack, 30); + + printf("Test traverse_stack (output check manually):\n"); + traverseStack(&stack); // Вручную проверить вывод + destroyStack(&stack); +} + + +void test_destroy_stack() { + Stack stack; + initStack(&stack); + push(&stack, 10); + push(&stack, 20); + destroyStack(&stack); + assert(stack.top == NULL); // После уничтожения вершина должна быть NULL + printf("Test destroy_stack passed\n"); +} + +int main() { + // Запуск всех тестов + test_init_stack(); + test_push(); + test_pop(); + test_search_by_value(); + test_search_by_index(); + test_get_top(); + test_is_empty(); + test_traverse_stack(); + test_destroy_stack(); + + + return 0; +} \ No newline at end of file From 4c74801516510990517b9bae9a32aba35bf003ac Mon Sep 17 00:00:00 2001 From: nrusov Date: Thu, 12 Dec 2024 23:09:14 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=20=D0=B8=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/CMakeLists.txt | 27 +++++++++++++++++++++++++++ 05_hw/stack.h | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/05_hw/CMakeLists.txt b/05_hw/CMakeLists.txt index 6f5e398..c0c6cb9 100644 --- a/05_hw/CMakeLists.txt +++ b/05_hw/CMakeLists.txt @@ -1,7 +1,34 @@ cmake_minimum_required(VERSION 3.10) project(stack) +# Включаем clang-tidy, если он найден +find_program(CLANG_TIDY clang-tidy) +if(CLANG_TIDY) + set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY};-checks=-*,clang-analyzer-*") + message(STATUS "clang-tidy found: ${CLANG_TIDY}") +else() + message(STATUS "clang-tidy not found, skipping.") +endif() + +# Включаем санитайзеры для Clang +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,memory") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address,memory") + message(STATUS "Sanitizers enabled") +endif() + +# Добавляем библиотеку stack add_library(stack stack.c) +# Добавляем исполнимые файлы +add_executable(Test test.c benchmark.c) +target_link_libraries(Test stack) + add_executable(main main.c) target_link_libraries(main stack) + +# Добавляем возможность установки бинарников +install(TARGETS main Test stack + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) diff --git a/05_hw/stack.h b/05_hw/stack.h index ef0734e..c157f04 100644 --- a/05_hw/stack.h +++ b/05_hw/stack.h @@ -37,4 +37,4 @@ bool isEmpty(Stack* stack); #ifdef __cplusplus } -#endif +#endif \ No newline at end of file From 4b2a8bfc04a68f5fdaf20cef85ad8ad68902e471 Mon Sep 17 00:00:00 2001 From: nrusov Date: Thu, 12 Dec 2024 23:11:17 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B5=D0=BD=D1=87=D0=BC=D0=B0=D1=80?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/benchmark.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 05_hw/benchmark.h | 12 ++++++++++++ 05_hw/test.c | 5 ++++- 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 05_hw/benchmark.c create mode 100644 05_hw/benchmark.h diff --git a/05_hw/benchmark.c b/05_hw/benchmark.c new file mode 100644 index 0000000..ad644fe --- /dev/null +++ b/05_hw/benchmark.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include "stack.h" + +#define BENCHMARK_SIZE 1000000 + +void benchmark_push() { + Stack stack; + initStack(&stack); + clock_t start, end; + double cpu_time_used; + + start = clock(); + for (int i = 0; i < BENCHMARK_SIZE; i++) { + push(&stack, i); + } + end = clock(); + cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC; + + printf("Benchmark push: %f seconds\n", cpu_time_used); + destroyStack(&stack); +} + +void benchmark_pop() { + Stack stack; + initStack(&stack); + for(int i = 0; i < BENCHMARK_SIZE; i++) { + push(&stack, i); + } + clock_t start, end; + double cpu_time_used; + + start = clock(); + for (int i = 0; i < BENCHMARK_SIZE; i++) { + pop(&stack); + } + end = clock(); + cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC; + + printf("Benchmark pop: %f seconds\n", cpu_time_used); + destroyStack(&stack); +} \ No newline at end of file diff --git a/05_hw/benchmark.h b/05_hw/benchmark.h new file mode 100644 index 0000000..72130b3 --- /dev/null +++ b/05_hw/benchmark.h @@ -0,0 +1,12 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +void benchmark_push(); +void benchmark_pop(); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/05_hw/test.c b/05_hw/test.c index e1243ab..13cc29d 100644 --- a/05_hw/test.c +++ b/05_hw/test.c @@ -2,7 +2,7 @@ #include #include #include "stack.h" - +#include "benchmark.h" void print_error(const char* test_name, const char* message) { @@ -156,6 +156,9 @@ int main() { test_traverse_stack(); test_destroy_stack(); + // Вызов функций для проведения бенчмарков + benchmark_push(); + benchmark_pop(); return 0; } \ No newline at end of file