From 9895818b3639458f9796f674b0fb5311d33dfbee Mon Sep 17 00:00:00 2001 From: ada1ra Date: Tue, 28 Oct 2025 21:45:30 +0300 Subject: [PATCH 1/6] Add homework with sorted list --- src/hw_6-1_sortList/hw_6-1_sortList.c | 242 ++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 src/hw_6-1_sortList/hw_6-1_sortList.c diff --git a/src/hw_6-1_sortList/hw_6-1_sortList.c b/src/hw_6-1_sortList/hw_6-1_sortList.c new file mode 100644 index 0000000..d3c9704 --- /dev/null +++ b/src/hw_6-1_sortList/hw_6-1_sortList.c @@ -0,0 +1,242 @@ +#include "hw_6-1_sortList.h" +#include +#include + +// структура узла списка +typedef struct Node { + int data; // данные узла + struct Node* next; // указатель на следующий узел +} Node; + +// структура списка +typedef struct { + Node* head; // указатель на начало списка + int size; // размер списка +} List; + +// создание нового пустого списка +List* listNew() +{ + List* list = (List*)malloc(sizeof(List)); + if (list == NULL) { + printf("Ошибка выделения памяти для списка\n"); + exit(1); + } + list->head = NULL; + list->size = 0; + return list; +} + +// вставка элемента в список по заданному индексу +void listInsert(List* list, int index, int value) +{ + // проверка корректности индекса + if (index < 0 || index > list->size) { + printf("Некорректный индекс для вставки\n"); + return; + } + + // создаем новый узел + Node* newNode = (Node*)malloc(sizeof(Node)); + if (newNode == NULL) { + printf("Ошибка выделения памяти для узла\n"); + return; + } + newNode->data = value; + + // вставка в начало списка + if (index == 0) { + newNode->next = list->head; + list->head = newNode; + } else { + // поиск позиции для вставки + Node* current = list->head; + for (int i = 0; i < index - 1; i++) { + current = current->next; + } + // вставка между узлами + newNode->next = current->next; + current->next = newNode; + } + list->size++; +} + +// получение элемента по заданному индексу +int listGet(List* list, int index) +{ + // проверка корректности индекса + if (index < 0 || index >= list->size) { + printf("Некорректный индекс для получения элемента\n"); + return -1; + } + + // поиск нужного узла + Node* current = list->head; + for (int i = 0; i < index; i++) { + current = current->next; + } + return current->data; +} + +// удаление элемента по заданному индексу +void listRemove(List* list, int index) +{ + // проверка корректности индекса + if (index < 0 || index >= list->size) { + printf("Некорректный индекс для удаления\n"); + return; + } + + Node* toDelete; + // удаление из начала списка + if (index == 0) { + toDelete = list->head; + list->head = list->head->next; + } else { + // поиск узла перед удаляемым + Node* current = list->head; + for (int i = 0; i < index - 1; i++) { + current = current->next; + } + toDelete = current->next; + current->next = toDelete->next; + } + // освобождение памяти + free(toDelete); + list->size--; +} + +// распечатывание содержимое списка +void listPrint(List* list) +{ + if (list->size == 0) { + printf("Список пуст\n"); + return; + } + + Node* current = list->head; + printf("Содержимое списка: "); + while (current != NULL) { + printf("%d ", current->data); + current = current->next; + } + printf("\n"); +} + +// удаление всего списка (освобождает память) +void listDelete(List* list) +{ + Node* current = list->head; + // последовательное удаление всех узлов + while (current != NULL) { + Node* temp = current; + current = current->next; + free(temp); + } + // освобождение структуры списка + free(list); +} + +// находит позицию для вставки в сортированный список +int listPosition(List* list, int value) +{ + if (list->size == 0) + return 0; + + Node* current = list->head; + int position = 0; + + // ищем первую позицию, где следующий элемент больше вставляемого значения + while (current != NULL && current->data < value) { + current = current->next; + position++; + } + return position; +} + +// проверяет наличие значения в списке +int listContain(List* list, int value) +{ + Node* current = list->head; + int position = 0; + + while (current != NULL) { + if (current->data == value) { + return position; + } + current = current->next; + position++; + } + return -1; +} + +// основная функция программы +int main() +{ + List* list = listNew(); + int command; + int value; + + printf("Программа для работы с сортированным списком\n"); + + do { + // вывод меню + printf("\nМеню операций:\n"); + printf("0 - выйти\n"); + printf("1 - добавить значение в сортированный список\n"); + printf("2 - удалить значение из списка\n"); + printf("3 - распечатать список\n"); + printf("Выберите операцию: "); + + scanf("%d", &command); + + switch (command) { + case 0: + // выход из программы + printf("Завершение работы программы\n"); + break; + + case 1: + // добавление значения в сортированный список + printf("Введите значение для добавления: "); + scanf("%d", &value); + + // находим позицию для сохранения сортировки + int position = listPosition(list, value); + listInsert(list, position, value); + + printf("Значение %d добавлено в позицию %d\n", value, position); + break; + + case 2: + // удаление значения из списка + printf("Введите значение для удаления: "); + scanf("%d", &value); + + // проверяем наличие значения в списке + int removePosition = listContain(list, value); + if (removePosition != -1) { + listRemove(list, removePosition); + printf("Значение %d удалено из списка\n", value); + } else { + printf("Значение %d не найдено в списке\n", value); + } + break; + + case 3: + // печать списка + listPrint(list); + break; + + default: + printf("Неизвестная команда, попробуйте снова\n"); + break; + } + + } while (command != 0); + + // освобождение памяти перед выходом + listDelete(list); + + return 0; +} \ No newline at end of file From 6add30d6fab7a9f5bb5ec38c61003ce095921deb Mon Sep 17 00:00:00 2001 From: ada1ra Date: Tue, 28 Oct 2025 21:45:57 +0300 Subject: [PATCH 2/6] Add -h file for sorted list --- src/hw_6-1_sortList/hw_6-1_sortList.h | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/hw_6-1_sortList/hw_6-1_sortList.h diff --git a/src/hw_6-1_sortList/hw_6-1_sortList.h b/src/hw_6-1_sortList/hw_6-1_sortList.h new file mode 100644 index 0000000..92d9925 --- /dev/null +++ b/src/hw_6-1_sortList/hw_6-1_sortList.h @@ -0,0 +1,43 @@ +#ifndef SORTLIST.H +#define SORTLIST.H + +// структура узла списка +typedef struct Node { + int data; // данные узла + struct Node* next; // указатель на следующий узел +} Node; + +// структура списка +typedef struct { + Node* head; // указатель на начало списка + int size; // размер списка +} List; + +// создание нового пустого списка +List* listNew(); + +// вставка элемента в список по заданному индексу +void listInsert(List* list, int index, int value); + +// получение элемента по заданному индексу +int listGet(List* list, int index); + +// удаление элемента по заданному индексу +void listRemove(List* list, int index); + +// распечатывание содержимое списка +void listPrint(List* list); + +// удаление всего списка (освобождает память) +void listDelete(List* list); + +// находит позицию для вставки в сортированный список +int listPosition(List* list, int value); + +// проверяет наличие значения в списке +int listContain(List* list, int value); + +// основная функция программы для работы со списком в диалоговом режиме +int main(); + +#endif From 4497edec953e156a3f9a58d4a589bfebeb6babe3 Mon Sep 17 00:00:00 2001 From: Ada Date: Tue, 28 Oct 2025 21:53:35 +0300 Subject: [PATCH 3/6] Fix misspell in hw_6-1_sortList.h --- src/hw_6-1_sortList/hw_6-1_sortList.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hw_6-1_sortList/hw_6-1_sortList.h b/src/hw_6-1_sortList/hw_6-1_sortList.h index 92d9925..d847111 100644 --- a/src/hw_6-1_sortList/hw_6-1_sortList.h +++ b/src/hw_6-1_sortList/hw_6-1_sortList.h @@ -1,5 +1,5 @@ -#ifndef SORTLIST.H -#define SORTLIST.H +#ifndef SORTLIST_H +#define SORTLIST_H // структура узла списка typedef struct Node { @@ -41,3 +41,4 @@ int listContain(List* list, int value); int main(); #endif + From f648ff1941498a2d2137da7616ba9538a05ed177 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 17 Nov 2025 23:53:17 +0300 Subject: [PATCH 4/6] Replace main part to the separate file --- src/hw_6-1_sortList/hw_6-1_sortListMain.c | 78 +++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/hw_6-1_sortList/hw_6-1_sortListMain.c diff --git a/src/hw_6-1_sortList/hw_6-1_sortListMain.c b/src/hw_6-1_sortList/hw_6-1_sortListMain.c new file mode 100644 index 0000000..6b0fa3e --- /dev/null +++ b/src/hw_6-1_sortList/hw_6-1_sortListMain.c @@ -0,0 +1,78 @@ +#include +#include "hw_6-1_sortList.h" + +// основная функция программы +int main() +{ + List* list = listCreate(); + int command; + int value; + + printf("Программа для работы с сортированным списком\n"); + + do { + // вывод меню + printf("\nМеню операций:\n"); + printf("0 - выйти\n"); + printf("1 - добавить значение в сортированный список\n"); + printf("2 - удалить значение из списка\n"); + printf("3 - распечатать список\n"); + printf("Выберите операцию: "); + + scanf("%d", &command); + + switch (command) { + case 0: + // выход из программы + printf("Завершение работы программы\n"); + break; + + case 1: + // добавление значения в сортированный список + printf("Введите значение для добавления: "); + if (scanf("%d", &value) != 1) { + printf("Ошибка, введите целое число"); + // очистка буфера при ошибке + int temp; + while ((temp = getchar()) != '\n' && temp != EOF); + break; + } + // находим позицию для сохранения сортировки + int position = listPosition(list, value); + listInsert(list, position, value); + + printf("Значение %d добавлено в позицию %d\n", value, position); + break; + + case 2: + // удаление значения из списка + printf("Введите значение для удаления: "); + scanf("%d", &value); + + // проверяем наличие значения в списке + int removePosition = listContain(list, value); + if (removePosition != -1) { + listRemove(list, removePosition); + printf("Значение %d удалено из списка\n", value); + } else { + printf("Значение %d не найдено в списке\n", value); + } + break; + + case 3: + // печать списка + listPrint(list); + break; + + default: + printf("Неизвестная команда, попробуйте снова\n"); + break; + } + + } while (command != 0); + + // освобождение памяти перед выходом + listDelete(list); + + return 0; +} From b9d7f2706a19263a4d9648e6ad28209e92ea4380 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 17 Nov 2025 23:54:14 +0300 Subject: [PATCH 5/6] Delete main part, struct declaration and rename listNew --- src/hw_6-1_sortList/hw_6-1_sortList.c | 85 +-------------------------- 1 file changed, 1 insertion(+), 84 deletions(-) diff --git a/src/hw_6-1_sortList/hw_6-1_sortList.c b/src/hw_6-1_sortList/hw_6-1_sortList.c index d3c9704..47d9932 100644 --- a/src/hw_6-1_sortList/hw_6-1_sortList.c +++ b/src/hw_6-1_sortList/hw_6-1_sortList.c @@ -2,20 +2,8 @@ #include #include -// структура узла списка -typedef struct Node { - int data; // данные узла - struct Node* next; // указатель на следующий узел -} Node; - -// структура списка -typedef struct { - Node* head; // указатель на начало списка - int size; // размер списка -} List; - // создание нового пустого списка -List* listNew() +List* listCreate() { List* list = (List*)malloc(sizeof(List)); if (list == NULL) { @@ -169,74 +157,3 @@ int listContain(List* list, int value) } return -1; } - -// основная функция программы -int main() -{ - List* list = listNew(); - int command; - int value; - - printf("Программа для работы с сортированным списком\n"); - - do { - // вывод меню - printf("\nМеню операций:\n"); - printf("0 - выйти\n"); - printf("1 - добавить значение в сортированный список\n"); - printf("2 - удалить значение из списка\n"); - printf("3 - распечатать список\n"); - printf("Выберите операцию: "); - - scanf("%d", &command); - - switch (command) { - case 0: - // выход из программы - printf("Завершение работы программы\n"); - break; - - case 1: - // добавление значения в сортированный список - printf("Введите значение для добавления: "); - scanf("%d", &value); - - // находим позицию для сохранения сортировки - int position = listPosition(list, value); - listInsert(list, position, value); - - printf("Значение %d добавлено в позицию %d\n", value, position); - break; - - case 2: - // удаление значения из списка - printf("Введите значение для удаления: "); - scanf("%d", &value); - - // проверяем наличие значения в списке - int removePosition = listContain(list, value); - if (removePosition != -1) { - listRemove(list, removePosition); - printf("Значение %d удалено из списка\n", value); - } else { - printf("Значение %d не найдено в списке\n", value); - } - break; - - case 3: - // печать списка - listPrint(list); - break; - - default: - printf("Неизвестная команда, попробуйте снова\n"); - break; - } - - } while (command != 0); - - // освобождение памяти перед выходом - listDelete(list); - - return 0; -} \ No newline at end of file From d3a9f1bb8418f15d89a4edc8146bc9177764907e Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 17 Nov 2025 23:54:52 +0300 Subject: [PATCH 6/6] Rename listNew --- src/hw_6-1_sortList/hw_6-1_sortList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hw_6-1_sortList/hw_6-1_sortList.h b/src/hw_6-1_sortList/hw_6-1_sortList.h index d847111..14caf70 100644 --- a/src/hw_6-1_sortList/hw_6-1_sortList.h +++ b/src/hw_6-1_sortList/hw_6-1_sortList.h @@ -14,7 +14,7 @@ typedef struct { } List; // создание нового пустого списка -List* listNew(); +List* listCreate(); // вставка элемента в список по заданному индексу void listInsert(List* list, int index, int value);