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 diff --git a/src/Test2Rewrite/list.c b/src/Test2Rewrite/list.c new file mode 100644 index 0000000..629e622 --- /dev/null +++ b/src/Test2Rewrite/list.c @@ -0,0 +1,270 @@ +#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); + 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); + + 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; +} + +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..ea6c935 --- /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); + +/* + * функция удаления всего списка + * принимает указатель на список + * внутри себя вызывает функцию 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; +}