From a95695ef29dbfcdcb1ac9bac49dbd1203427b4e8 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Thu, 11 Dec 2025 18:08:07 +0300 Subject: [PATCH 1/6] Add task2 and task3 --- src/Test2Rewrite/list.c | 252 +++++++++++++++++++++++++++++++++++++++ src/Test2Rewrite/list.h | 81 +++++++++++++ src/Test2Rewrite/task2.c | 144 ++++++++++++++++++++++ src/Test2Rewrite/task3.c | 0 4 files changed, 477 insertions(+) create mode 100644 src/Test2Rewrite/list.c create mode 100644 src/Test2Rewrite/list.h create mode 100644 src/Test2Rewrite/task2.c create mode 100644 src/Test2Rewrite/task3.c diff --git a/src/Test2Rewrite/list.c b/src/Test2Rewrite/list.c new file mode 100644 index 0000000..ebdab39 --- /dev/null +++ b/src/Test2Rewrite/list.c @@ -0,0 +1,252 @@ +#include "list.h" +#include +#include +#include + +typedef struct ListNode ListNode; + +struct ListNode { + int value; + struct ListNode* next; +}; + +struct List { + ListNode* head; +}; + +List* newList() +{ + List* list = calloc(1, sizeof(*list)); + return list; +} + +bool insert(List* list, int index, int value) +{ + if (list == NULL || index < 0) { + return false; + } + if (index == 0) { + ListNode* newNode = malloc(sizeof(ListNode)); + newNode->value = value; + newNode->next = list->head; + list->head = newNode; + return true; + } + ListNode* current = list->head; + int counter = 0; + while (current != NULL) { + if (counter == index - 1) { + ListNode* newNode = malloc(sizeof(ListNode)); + newNode->value = value; + newNode->next = current->next; + current->next = newNode; + return true; + } + current = current->next; + counter++; + } + return false; +} +int get(List* list, int index) +{ + if (list == NULL || isEmpty(list) || index < 0) + return -1; + if (index == 0) { + return list->head->value; + } + ListNode* current = list->head; + int counter = 0; + while (current != NULL) { + if (counter == index) { + return current->value; + } + current = current->next; + counter++; + } + return -1; +} + +bool removeElement(List* list, int index) +{ + if (list == NULL || isEmpty(list) || index < 0) { + return false; + } + ListNode* current = list->head; + if (index == 0) { + list->head = current->next; + free(current); + return true; + } + int counter = 0; + while (current != NULL) { + if (counter == index - 1) { + if (current->next == NULL) + return false; + ListNode* nodeToDelete = current->next; + current->next = nodeToDelete->next; + free(nodeToDelete); + return true; + } + current = current->next; + counter++; + } + return false; +} + +bool deleteList(List* list) +{ + if (list == NULL || isEmpty(list)) { + return false; + } + while (!isEmpty(list)) { + removeElement(list, 0); + } + free(list); + return true; +} + +void printList(List* list) +{ + if (list == NULL || isEmpty(list)) { + printf("Список пустой\n"); + return; + } + ListNode* current = list->head; + while (current != NULL) { + printf("%d ", current->value); + current = current->next; + } + printf("\n"); +} + +bool isEmpty(List* list) { return list->head == NULL; } + +int getLength(List* list) +{ + if (list == NULL || isEmpty(list)) { + return -1; + } + int counter = 0; + ListNode* current = list->head; + do { + counter++; + current = current->next; + } while (current != NULL); + return counter; +} + +bool oneElement(List* list) { return list->head->next == NULL; } + +/* +Эта функция копирования спика +на вход принимает два списка и копирует один в другой +*/ +void copy(List* listToCopy, List* listToPut) +{ + int length = getLength(listToCopy); + int element = 0; + for (int i = 0; i < length; i++) { + element = get(listToCopy, i); + insert(listToPut, i, element); + } +} + +List* reverse(List* list) +{ + if (list == NULL || isEmpty(list)) { + return NULL; + } + + List* newOneList = newList(); + copy(list, newOneList); + + if (newOneList == NULL || isEmpty(newOneList)) { + return NULL; + } + ListNode* prev = NULL; + ListNode* current = newOneList->head; + ListNode* next = NULL; + + while (current != NULL) { + next = current->next; + current->next = prev; + prev = current; + current = next; + } + newOneList->head = prev; + return newOneList; +} + +bool testReverse() +{ + List* list1 = newList(); + insert(list1, 0, 1); + insert(list1, 1, 2); + insert(list1, 2, 3); + List* newOne1 = reverse(list1); + int arr[3] = { 3, 2, 1 }; + int* p = arr; + for (int i = 0; i < 3; i++) { + if (get(newOne1, i) != p[i]) { + deleteList(list1); + deleteList(newOne1); + return false; + } + } + deleteList(list1); + deleteList(newOne1); + + List* list2 = newList(); + insert(list2, 0, 3); + insert(list2, 1, 2); + insert(list2, 2, 1); + List* newOne2 = reverse(list2); + int arr2[3] = { 1, 2, 3 }; + int* p2 = arr2; + for (int i = 0; i < 3; i++) { + if (get(newOne2, i) != p2[i]) { + deleteList(list2); + deleteList(newOne2); + printf("Сломалось на стандартной проверке\n"); + return false; + } + } + deleteList(list2); + deleteList(newOne2); + + List* list3 = newList(); + insert(list3, 0, 1); + List* newOne3 = reverse(list3); + printList(newOne3); + if (get(newOne3, 0) != 1) { + printf("Сломалось на списке из одного элемента\n"); + deleteList(list3); + deleteList(newOne3); + return false; + } + deleteList(list3); + deleteList(newOne3); + + List* list4 = newList(); + List* newOne4 = reverse(list4); + if (newOne4 != NULL) { + deleteList(list4); + deleteList(newOne4); + printf("Сломалось на пустом изначальном списке\n"); + return false; + } + deleteList(list4); + deleteList(newOne4); + return true; +} + +int main() +{ + bool isOk = testReverse(); + if (!isOk) { + printf("Некоторые тесты не прошли\n"); + } else { + printf("Все тесты прошли успешно!\n"); + } + return 0; +} \ No newline at end of file diff --git a/src/Test2Rewrite/list.h b/src/Test2Rewrite/list.h new file mode 100644 index 0000000..9c9b884 --- /dev/null +++ b/src/Test2Rewrite/list.h @@ -0,0 +1,81 @@ +#pragma once +#include + +// структура содержащая указатель на список +typedef struct List List; + +/* + * функция создания нового списка + * ничего не принимает + * возвращает указатель на объект типа List + */ +List* newList(); + +/* + * функция вставки элемента по заданному индексу + * принимает на вход указатель на список, желаемый индекс и значение + * возвращает булевое значение, сообщающее, удачно ли прошла операция + */ +bool insert(List* list, int index, int value); + +/* + * функция просмотра элемента списка по индексу + * принимает указатель на список и индекс + * возвращает value элемента + * если что-то пошло не так, вернет -1 + */ +int get(List* list, int index); + +/* + * функция удаления элемента по индексу + * принимает указатель на список и индекс элемента + * возвращает булевое значние, сообщающее, удачно ли прошла операция + * внутри себя освобождает память удаляемого элемента + */ +bool removeElement(List* list, int index); + +/* + * функция удаления всего списка + * принимает указатель на объект типа List + * внутри себя вызывает функцию removeElement + * возвращает булевое значение, удачно ли прошла операция + */ +bool deleteList(List* list); + +/* + * функция вывода списка в консоль + * принимает только указаетль на список + * ничего не возвращает + * печатает элементы списка через пробел + * в случае переданного пустого или несуществующего списка сообщает об этом пользователю + */ +void printList(List* list); + +/* + * функция проверки, пустой ли список + * возвращает true если пустой, false, если нет + * на вход принимает указатель на список + */ +bool isEmpty(List* list); + +/* + * функция, возвращающая длину списка + * принимает на вход указатель на список + * проходится по всем элементам + * возвращает его длину + */ +int getLength(List* list); + +/* + * функция проверки, один ли элемент в списке + * возвращает true если да, false, если нет + * на вход принимает указатель на список + */ +bool oneElement(List* list); + +/* + * Функция переворачивания списка + * на вход принимает список, который надо перевернуть + * возвращает новый список, в котором элементы в перевернутом состоянии + */ +List* reverse(List* list); diff --git a/src/Test2Rewrite/task2.c b/src/Test2Rewrite/task2.c new file mode 100644 index 0000000..c917474 --- /dev/null +++ b/src/Test2Rewrite/task2.c @@ -0,0 +1,144 @@ +#include +#include +#include +#include + +int getLength(int num) +{ + int numDigits = 0; + while (num > 0) { + numDigits++; + num /= 10; + } + return numDigits; +} + +void selectionSort(int* arr, int size) +{ + int tmp = 0; + for (int i = 0; i < size - 1; i++) { + int minIndex = i; + for (int j = i + 1; j < size; j++) { + if (arr[j] < arr[minIndex]) { + minIndex = j; + } + } + if (minIndex != i) { + tmp = arr[i]; + arr[i] = arr[minIndex]; + arr[minIndex] = tmp; + } + } +} + +int* convertNumToArr(int num) +{ + int length = getLength(num); + int temp = num; + int* arr = malloc(sizeof(int) * length); + temp = num; + for (int i = length - 1; i >= 0; i--) { + arr[i] = temp % 10; + temp /= 10; + } + return arr; +} + +int arrToNumber(int* arr, int numDigits) +{ + int result = 0; + for (int i = 0; i < numDigits; i++) { + result = result * 10 + arr[i]; + } + return result; +} + +int getMinNumberFromDigits(unsigned num, int length) +{ + if (num == 0) + return 0; + + int* arr = convertNumToArr(num); + selectionSort(arr, length); + if (arr[0] == 0) { + for (int i = 1; i < length; i++) { + if (arr[i] != 0) { + int temp = arr[0]; + arr[0] = arr[i]; + arr[i] = temp; + break; + } + } + } + int result = arrToNumber(arr, length); + free(arr); + return result; +} + +bool tests() +{ + unsigned num1 = 321; + int length1 = getLength(num1); + int result1 = getMinNumberFromDigits(num1, length1); + if (result1 != 123) { + return false; + } + + unsigned num2 = 10203; + int length2 = getLength(num2); + int result2 = getMinNumberFromDigits(num2, length2); + if (result2 != 10023) { + return false; + } + + unsigned num3 = 54321; + int length3 = getLength(num3); + int result3 = getMinNumberFromDigits(num3, length3); + if (result3 != 12345) { + return false; + } + + unsigned num4 = 0; + int length4 = getLength(num4); + int result4 = getMinNumberFromDigits(num4, length4); + if (result4 != 0) { + return false; + } + + unsigned num5 = 301; + int length5 = getLength(num5); + int result5 = getMinNumberFromDigits(num5, length5); + if (result5 != 103) { + return false; + } + + unsigned num6 = 110; + int length6 = getLength(num6); + int result6 = getMinNumberFromDigits(num6, length6); + if (result6 != 101) { + return false; + } + + unsigned num7 = 5; + int length7 = getLength(num7); + int result7 = getMinNumberFromDigits(num7, length7); + if (result7 != 5) { + return false; + } + return true; +} + +int main(int argc, char* argv[]) +{ + if (argc == 2 && strcmp(argv[1], "--test") == 0) { + bool allTestsPassed = tests(); + if (allTestsPassed) { + printf("Все тесты прошли успешно"); + } else { + printf("Некоторые тесты не были пройдены"); + } + printf("\n"); + return 0; + } + return 0; +} diff --git a/src/Test2Rewrite/task3.c b/src/Test2Rewrite/task3.c new file mode 100644 index 0000000..e69de29 From d33a259876dedfe1255d6c1b0de065ee2ad7257f Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Thu, 11 Dec 2025 18:08:42 +0300 Subject: [PATCH 2/6] Add CMakeLists.txt --- src/Test2Rewrite/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/Test2Rewrite/CMakeLists.txt diff --git a/src/Test2Rewrite/CMakeLists.txt b/src/Test2Rewrite/CMakeLists.txt new file mode 100644 index 0000000..fb09f49 --- /dev/null +++ b/src/Test2Rewrite/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.25) + +project(Project C) + +add_compile_options(-Wall -Wextra -Wpedantic) + +add_executable(task2 task2.c) +add_executable(task3 list.c) \ No newline at end of file From ed97327e14d78a178c4ca5ba572c13386eb7072b Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Thu, 11 Dec 2025 18:12:44 +0300 Subject: [PATCH 3/6] final commit --- src/Test2Rewrite/list.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Test2Rewrite/list.c b/src/Test2Rewrite/list.c index ebdab39..29e8092 100644 --- a/src/Test2Rewrite/list.c +++ b/src/Test2Rewrite/list.c @@ -237,6 +237,25 @@ bool testReverse() } deleteList(list4); deleteList(newOne4); + + List* list5 = newList(); + insert(list5, 0, 1); + insert(list5, 1, 1); + insert(list5, 2, 1); + List* newOne5 = reverse(list5); + int arr5[3] = { 1, 1, 1 }; + int* p5 = arr5; + for (int i = 0; i < 3; i++) { + if (get(newOne5, i) != p5[i]) { + deleteList(list5); + deleteList(newOne5); + printf("Сломалось на проверке из одинаковых элементов\n"); + return false; + } + } + deleteList(list5); + deleteList(newOne5); + return true; } From 81a2f4cf12d91f920b172732d1aaed107ae05712 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Thu, 11 Dec 2025 18:14:04 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D0=B2=D1=8B=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Test2Rewrite/list.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Test2Rewrite/list.c b/src/Test2Rewrite/list.c index 29e8092..629e622 100644 --- a/src/Test2Rewrite/list.c +++ b/src/Test2Rewrite/list.c @@ -217,7 +217,6 @@ bool testReverse() List* list3 = newList(); insert(list3, 0, 1); List* newOne3 = reverse(list3); - printList(newOne3); if (get(newOne3, 0) != 1) { printf("Сломалось на списке из одного элемента\n"); deleteList(list3); From c56d4b4872adf139c6e65189db5af4f9fd4bf203 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Thu, 11 Dec 2025 18:24:44 +0300 Subject: [PATCH 5/6] Fix list.h --- src/Test2Rewrite/list.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Test2Rewrite/list.h b/src/Test2Rewrite/list.h index 9c9b884..ea6c935 100644 --- a/src/Test2Rewrite/list.h +++ b/src/Test2Rewrite/list.h @@ -36,7 +36,7 @@ bool removeElement(List* list, int index); /* * функция удаления всего списка - * принимает указатель на объект типа List + * принимает указатель на список * внутри себя вызывает функцию removeElement * возвращает булевое значение, удачно ли прошла операция */ @@ -75,7 +75,7 @@ bool oneElement(List* list); /* * Функция переворачивания списка - * на вход принимает список, который надо перевернуть - * возвращает новый список, в котором элементы в перевернутом состоянии + * на вход принимает указатель на список, который надо перевернуть + * возвращает указатель на новый список, в котором элементы в перевернутом состоянии */ List* reverse(List* list); From c1163b0dfbaab5b48124d78f4973cbe13de1964b Mon Sep 17 00:00:00 2001 From: Kalsina Yana Date: Thu, 11 Dec 2025 18:27:56 +0300 Subject: [PATCH 6/6] Delete src/Test2Rewrite/task3.c delete empty file --- src/Test2Rewrite/task3.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/Test2Rewrite/task3.c diff --git a/src/Test2Rewrite/task3.c b/src/Test2Rewrite/task3.c deleted file mode 100644 index e69de29..0000000