From eaa6e952fcb6cd420b19ac0ce7c3d12cfbe97e0b Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Wed, 19 Nov 2025 23:38:17 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hw10_tests/sortListForTests.c | 254 ++++++++++++++++++++++++++++++ src/hw10_tests/sortListForTests.h | 52 ++++++ 2 files changed, 306 insertions(+) create mode 100644 src/hw10_tests/sortListForTests.c create mode 100644 src/hw10_tests/sortListForTests.h diff --git a/src/hw10_tests/sortListForTests.c b/src/hw10_tests/sortListForTests.c new file mode 100644 index 0000000..7d3690f --- /dev/null +++ b/src/hw10_tests/sortListForTests.c @@ -0,0 +1,254 @@ +// +// Created by sasha on 19.11.2025. +// +#include "sortListForTests.h" +#include +#include +#include + +// Создание пустого списка +struct List* createEmptyList() +{ + struct List* list = malloc(sizeof(struct List)); + if (!list) { + fprintf(stderr, "Ошибка выделения памяти\n"); + exit(1); + } + list->head = NULL; + list->size = 0; + return list; +} + +// Получение элемента по индексу +int getElement(struct List* list, int i) +{ + // Проверка корректности индекса + if (i < 0 || i >= list->size) { + printf("Некорректный индекс: он не может быть < 0 или больше размера списка\n"); + return -1; + } + + struct Node* currNode = list->head; + while (i--) { + currNode = currNode->next; + } + return currNode->data; +} + +// Реализация команды 0 - выйти: +// Удаление всего списка для освобождения и выхода +void deleteList(struct List* list) +{ + struct Node* currNode = list->head; + // Удаление узлов + while (currNode) { + struct Node* tempNode = currNode; + currNode = currNode->next; + free(tempNode); + } + // Освобождение памяти + free(list); +} + +// Реализация команды 1 - добавить значение в сортированный список: +// Поиск позиции для вставки элемента в список +int findPosition(struct List* list, int element) +{ + if (list->size == 0) + return 0; + + struct Node* currNode = list->head; + int position = 0; + + // Ищем первую позицию, где след элемент больше нового значения + // Так как список отсортирован, то прошлый будет или больше или равен вставляемому + while (currNode && currNode->data < element) { + currNode = currNode->next; + position++; + } + return position; +} + +// Вставка элемента в список по заданному индексу +void insertElement(struct List* list, int i, int element) +{ + // Проверка корректности индекса + if (i < 0 || i > list->size) { + printf("Некорректный индекс: он не может быть < 0 или больше размера списка\n"); + return; + } + + // Создание нового узла + struct Node* newNode = malloc(sizeof(struct Node)); + if (!newNode) { + printf("Ошибка выделения памяти для саздания нового узла\n"); + return; + } + newNode->data = element; + // Вставка + if (i == 0) { + newNode->next = list->head; + list->head = newNode; + } else { + // Поиск позиции для вставки + struct Node* currNode = list->head; + int pos = 1; + while (pos < i) { + currNode = currNode->next; + pos++; + } + newNode->next = currNode->next; + currNode->next = newNode; + } + list->size++; +} + +// Реализация команды 2 – удалить значение из списка: +// Проверка наличия значения в списке +int checkElement(struct List* list, int element) +{ + struct Node* currNode = list->head; + int position = 0; + + while (currNode) { + if (currNode->data == element) { + return position; + } + currNode = currNode->next; + position++; + } + return -1; +} + +// Удаление элемента по индексу +void deleteElement(struct List* list, int i) +{ + // проверка корректности индекса + if (i < 0 || i >= list->size) { + printf("Некорректный индекс: он не может быть < 0 или больше размера списка\n"); + return; + } + struct Node* nodeForDeletion; + // Удаление из начала списка + if (i == 0) { + nodeForDeletion = list->head; + list->head = list->head->next; + } else { + // Поиск узла перед удаляемым + struct Node* currNode = list->head; + int pos = 1; + while (pos < i) { + currNode = currNode->next; + pos++; + } + nodeForDeletion = currNode->next; + currNode->next = nodeForDeletion->next; + } + // Освобождение памяти + free(nodeForDeletion); + list->size--; +} + +// Реализация команды 3 – распечатать список: +// Печать содержимого списка +void printList(struct List* list) +{ + if (list->size == 0) { + printf("Список пустой\n"); + return; + } + + struct Node* currNode = list->head; + printf("Содержание списка:\n"); + printf("["); + while (currNode) { + printf("%d", currNode->data); + if (currNode->next) printf(", "); + currNode = currNode->next; + } + printf("]\n"); +} + + +// Функция main для реализации выбора команд 0-3 пользователем +int main(int argc, char* argv[]) +{ + // Дополнительный код для того, чтобы работал флаг + if (argc > 1 && strcmp(argv[1], "--test") == 0) { + runTests(); + return 0; + } + + struct List* list = createEmptyList(); + int command, inputElement; + + while (1) { + printf("Команды:\n"); + printf("0 - Выйти\n"); + printf("1 - Добавить значение в сортированный список\n"); + printf("2 - Удалить значение из списка\n"); + printf("3 - Распечатать список\n"); + printf("Выберите команду (0,1,2,3): "); + + + if (scanf("%d", &command) != 1) { + printf("Ошибка: вводите только цифры\n"); + int ch; + while ((ch = getchar()) != '\n'); + + continue; + } + + switch (command) { + case 0: + printf("Совершён выход\n"); + deleteList(list); + return 0; + + case 1: + printf("Введите значение для добавления: "); + + if (scanf("%d", &inputElement) != 1) { + printf("Ошибка: вводите только цифры\n"); + + int ch; + while ((ch = getchar()) != '\n'); + + continue; + } + + int position1 = findPosition(list, inputElement); + insertElement(list, position1, inputElement); + printf("Значение было добавлено на позицию %d\n", position1); + break; + + case 2: + printf("Введите значение для удаления:"); + + if (scanf("%d", &inputElement) != 1) { + printf("Ошибка: вводите только цифры\n"); + + int ch; + while ((ch = getchar()) != '\n'); + + continue; + } + + int position2 = checkElement(list, inputElement); + if (position2 != -1) { + deleteElement(list, position2); + printf("Значение было удалено с позиции %d\n", position2); + } else { + printf("Значение не найдено\n"); + } + break; + + case 3: + printList(list); + break; + + default: + printf("Введена неподдерживаемая команда: можно только 0,1,2,3\n"); + } + } +} \ No newline at end of file diff --git a/src/hw10_tests/sortListForTests.h b/src/hw10_tests/sortListForTests.h new file mode 100644 index 0000000..6121688 --- /dev/null +++ b/src/hw10_tests/sortListForTests.h @@ -0,0 +1,52 @@ +// +// Created by sasha on 19.11.2025. +// + +#ifndef SORTLISTFORTESTS_MAIN_H +#define SORTLISTFORTESTS_MAIN_H + +// Cтруктура для узла списка +struct Node { + int data; // данные узла + struct Node* next; // указатель на следующий узел +}; + + +// Структура для самого списка +struct List { + struct Node* head; // указатель на начало списка + int size; // размер списка +}; + +// Создание пустого списка +struct List* createEmptyList(); + +// Получение элемента по индексу +int getElement(struct List* list, int i); + +// Реализация команды 0 - выйти: +// Удаление всего списка для освобождения и выхода +void deleteList(struct List* list); + +// Реализация команды 1 - добавить значениe в сортированный список: +// Поиск позиции для вставки элемента в список +int findPosition(struct List* list, int element); + +// Вставка элемента в список по заданному индексу +void insertElement(struct List* list, int i, int element); + +// Реализация команды 2 – удалить значение из списка: +// Проверка наличия значения в списке +int checkElement(struct List* list, int element); + +// Удаление элемента по индексу +void deleteElement(struct List* list, int i); + +// Реализация команды 3 – распечатать список: +// распечатывание содержимое списка +void printList(struct List* list); + +void runTests(); + + +#endif //SORTLISTFORTESTS_MAIN_H \ No newline at end of file From 1cff61b2ab4da4076cf25866b6773ffc7c372afc Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Wed, 19 Nov 2025 23:38:59 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hw10_tests/tests.c | 195 +++++++++++++++++++++++++++++++++++++++++ src/hw10_tests/tests.h | 22 +++++ 2 files changed, 217 insertions(+) create mode 100644 src/hw10_tests/tests.c create mode 100644 src/hw10_tests/tests.h diff --git a/src/hw10_tests/tests.c b/src/hw10_tests/tests.c new file mode 100644 index 0000000..2195e36 --- /dev/null +++ b/src/hw10_tests/tests.c @@ -0,0 +1,195 @@ +// +// Created by sasha on 19.11.2025. +// + +#include "sortListForTests.h" +#include "tests.h" +#include + +// Cортировка пузырьком для проверки отсортированности +void bubbleSort(int arr[], int n) +{ + for (int i = 0; i < n - 1; i++) { + for (int j = 0; j < n - 1 - i; j++) { + if (arr[j] > arr[j + 1]) { + int temp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = temp; + } + } + } +} + +// Проверка того, что сортировка списка соответствует expected +int checkList(struct List* list, int arr[], int n) +{ + if (list->size != n) { + return 0; + } else { + for (int i = 0; i < n; i++) { + if (getElement(list, i) != arr[i]) { + return 0; + } + } + } + return 1; +} + +// Вставка в лист и изменение expected, в конце - сортировка массива +void insertElem(struct List* list, int value, int expected[], int* count) +{ + insertElement(list, findPosition(list, value), value); + expected[*count] = value; + (*count)++; + bubbleSort(expected, *count); +} + +// Удаление элемента из списка и из expected +void deleteElem(struct List* list, int value, int expected[], int* count) +{ + int pos = checkElement(list, value); + if (pos != -1) { + deleteElement(list, pos); + } + int found = -1; + for (int i = 0; i < *count; i++) { + if (expected[i] == value) { + found = i; + break; + } + } + if (found != -1) { + for (int i = found; i < *count - 1; i++) { + expected[i] = expected[i + 1]; + } + (*count)--; + } +} + +// Запуск тестов +void runTests() +{ + printf("Тесты:\n"); + struct List* list = createEmptyList(); + int expected[30]; + int count = 0; + + // Тест на добавление первого элемента + printf("Тест 1: Вставка первого элемента. "); + insertElem(list, 0, expected, &count); + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на удаление единственного элемента в списке + printf("Тест 2: Удаление единственного элемента. "); + deleteElem(list, 0, expected, &count); + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на удаление несуществующего элемента в списке + printf("Тест 3: Удаление несуществующего элемента. "); + deleteElem(list, 123, expected, &count); + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на добавление нескольких элементов (отрицательные, положительные, 0) + printf("Тест 4: Вставка нескольких элементов. "); + int values[] = {0, -1, 20, 5, 52, 100, -5, -100}; + for (int i = 0; i < 8; i++) { + insertElem(list, values[i], expected, &count); + } + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на вставку в самое начало (малое число) + printf("Тест 5: Вставка в начало. "); + insertElem(list, -1000, expected, &count); + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на вставку в самый конец (большое число) + printf("Тест 6: Вставка в конец. "); + insertElem(list, 1000, expected, &count); + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на добавление повторок + printf("Тест 7: Вставка повторяющихся элементов. "); + int duplicates[] = {-5, 100, 100}; + for (int i = 0; i < 3; i++) { + insertElem(list, duplicates[i], expected, &count); + } + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на удаление элемента в начале + printf("Тест 8: Удаление элемента в начале. "); + deleteElem(list, -1000, expected, &count); + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на удаление элемента в конце + printf("Тест 9: Удаление элемента в конце\n"); + deleteElem(list, 1000, expected, &count); + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на удаление элемента + printf("Тест 10: Удаление элемента в середине\n"); + deleteElem(list, 0, expected, &count); + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на удаление повторок + printf("Тест 11: Удаление повторяющихся элементов\n"); + deleteElem(list, 100, expected, &count); + deleteElem(list, -5, expected, &count); + if (checkList(list, expected, count)) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + // Тест на очистку списка + printf("Тест 12: Удаление всех элементов списка и очистка памяти\n"); + deleteList(list); + list = NULL; + count = 0; + if (list == NULL && count == 0) { + printf("Результат: пройден!\n"); + } else { + printf("Результат: НЕ пройден\n"); + } + + printf("Конец тестов!\n"); +} diff --git a/src/hw10_tests/tests.h b/src/hw10_tests/tests.h new file mode 100644 index 0000000..5d9c6ef --- /dev/null +++ b/src/hw10_tests/tests.h @@ -0,0 +1,22 @@ +// +// Created by sasha on 19.11.2025. +// + +#ifndef TESTS_H +#define TESTS_H + +#include "sortListForTests.h" // чтобы видеть List и базовые функции списка + +// Проверка того, что сортировка списка соответствует expected +int checkList(struct List* list, int arr[], int n); + +// Вставка в лист и изменение expected, в конце - сортировка массива +void insertElem(struct List* list, int value, int expected[], int* count); + +// Удаление элемента из списка и из expected +void deleteElem(struct List* list, int value, int expected[], int* count); + +// Запуск тестов +void runTests(); + +#endif // TESTS_H From f96c6d2517e1ba8263a7cf3b35b63f1fd68e95fc Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Wed, 19 Nov 2025 23:45:01 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hw10_tests/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/hw10_tests/README.md diff --git a/src/hw10_tests/README.md b/src/hw10_tests/README.md new file mode 100644 index 0000000..28d94f1 --- /dev/null +++ b/src/hw10_tests/README.md @@ -0,0 +1,9 @@ +Тесты к Сортированному списку + +Запуск тестов: +gcc tests.c sortListForTests.c -o program +.\program.exe --test + +Можно запустить интерактивный режим: +.\program.exe +(без флага) \ No newline at end of file