diff --git a/src/hw6_Lists/CMakeLists.txt b/src/hw6_Lists/CMakeLists.txt new file mode 100644 index 0000000..595a414 --- /dev/null +++ b/src/hw6_Lists/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 4.0) +project(hw6_Lists C) + +set(CMAKE_C_STANDARD 17) + +add_executable(counter + main.c + counter.c +) diff --git a/src/hw6_Lists/counter.c b/src/hw6_Lists/counter.c new file mode 100644 index 0000000..6eaddbc --- /dev/null +++ b/src/hw6_Lists/counter.c @@ -0,0 +1,55 @@ +#include +#include +#include "counter.h" + +struct ListOfWarriors* createList(int n) +{ + struct ListOfWarriors* first = malloc(sizeof(struct ListOfWarriors)); // Создаем циклический список + first->position = 1; + + struct ListOfWarriors* current = first; + for (int i = 2; i <= n; i++) { + current->next = malloc(sizeof(struct ListOfWarriors)); + current = current->next; + current->position = i; + } + current->next = first; // Замыкаем круг в циклическом списке + + return first; +} + +void deleteWarrior(struct ListOfWarriors** current) +{ + struct ListOfWarriors* toDelete = (*current)->next; + (*current)->next = toDelete->next; + free(toDelete); + *current = (*current)->next; // Переходим к следующему +} + +int counter(int n, int m) +{ + if (n <= 0 || m <= 0) { + printf("Нельзя вводить отрицательные m, n\n"); + return -1; + } + + if (m == 1) { + return n; // Возвращаем нужный номер + } + + struct ListOfWarriors* current = createList(n); + + while (current->next != current) { //Пока не останется один воин (когда узел указывает сам на себя) + // Находим воина под номером m-1 + for (int i = 1; i < m - 1; i++) { + current = current->next; + } + + deleteWarrior(¤t); // Удаляем следующего воина от найденного (то есть под номером m) + } + + int neededPosition = current->position; + free(current); + return neededPosition; // Возвращаем нужный номер +} + diff --git a/src/hw6_Lists/counter.h b/src/hw6_Lists/counter.h new file mode 100644 index 0000000..eae6588 --- /dev/null +++ b/src/hw6_Lists/counter.h @@ -0,0 +1,14 @@ +#pragma once + +struct ListOfWarriors { + int position; + struct ListOfWarriors* next; +}; + +// Функция создания циклического списка из n воинов +struct ListOfWarriors* createList(int n); + +// Удаление война в списке +void deleteWarrior(struct ListOfWarriors** current); + +int counter(int n, int m); diff --git a/src/hw6_Lists/main.c b/src/hw6_Lists/main.c new file mode 100644 index 0000000..3fb96ab --- /dev/null +++ b/src/hw6_Lists/main.c @@ -0,0 +1,19 @@ +#include +#include "counter.h" + +int main() +{ + int n, m; + printf("Введите n и m: "); + scanf("%d %d", &n, &m); + + int result = counter(n, m); + + if (result != -1) { + printf("Нужная позиция: %d\n", result); + } else { + printf("Ошибка в вычислениях\n"); + } + + return 0; +}