diff --git a/src/schitalochka/compilation.md b/src/schitalochka/compilation.md new file mode 100644 index 0000000..bb228ce --- /dev/null +++ b/src/schitalochka/compilation.md @@ -0,0 +1,3 @@ +## Сборка: +gcc -Wall -Wextra -pedantic -O2 -c cyclic_list.c\ +gcc -Wall -Wextra -pedantic -O2 cyclic_list.o main.c diff --git a/src/schitalochka/cyclic_list.c b/src/schitalochka/cyclic_list.c new file mode 100644 index 0000000..74a1b08 --- /dev/null +++ b/src/schitalochka/cyclic_list.c @@ -0,0 +1,66 @@ +#include "cyclic_list.h" + +#include + +typedef struct ListElement { + int value; + struct ListElement* next; + struct ListElement* prev; +} ListElement; + +struct List { + ListElement* zeroIndexElement; + int size; +}; + +List* createList(int n) +{ + if (n <= 0) { + return NULL; + } + + ListElement* oldElement = malloc(sizeof(*oldElement)); + oldElement->value = 1; + List* list = malloc(sizeof(*list)); + list->zeroIndexElement = oldElement; + list->size = n; + for (int i = 2; i <= n; ++i) { + ListElement* newElement = malloc(sizeof(*newElement)); + newElement->value = i; + newElement->prev = oldElement; + oldElement->next = newElement; + oldElement = newElement; + } + oldElement->next = list->zeroIndexElement; + list->zeroIndexElement->prev = oldElement; + + return list; +} + +void deleteList(List* list) +{ + free(list); +} + +int deleteElement(List* list, int index) +{ + if (list->zeroIndexElement->next == list->zeroIndexElement) { + int value = list->zeroIndexElement->value; + free(list->zeroIndexElement); + return value; + } + + index = index < 0 ? (index % list->size + list->size) : (index % list->size); + + ListElement* currentElement = list->zeroIndexElement; + for (int i = 0; i < index; ++i) { + currentElement = currentElement->next; + } + currentElement->prev->next = currentElement->next; + currentElement->next->prev = currentElement->prev; + list->zeroIndexElement = currentElement->next; + list->size--; + free(currentElement); + + return 0; +} diff --git a/src/schitalochka/cyclic_list.h b/src/schitalochka/cyclic_list.h new file mode 100644 index 0000000..07d4b2b --- /dev/null +++ b/src/schitalochka/cyclic_list.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +typedef struct List List; + +// Creates cyclic list with n elements numerated from 1 to n. +// If n <= 0 returns NULL, else returns pointer on the list. +// Takes n - count of elements. +List* createList(int n); + +// Deletes the list. The list is assumed to be empty. +// Takes pointer on the list; +void deleteList(List* list); + +// Deletes element with taken index. Changes index starting pointer on the next element after deleted. +// Takes pointer on the list and index of the element. +// Returns 0. If the element is the last returns element. +int deleteElement(List* list, int index); diff --git a/src/schitalochka/main.c b/src/schitalochka/main.c new file mode 100644 index 0000000..9c9de1f --- /dev/null +++ b/src/schitalochka/main.c @@ -0,0 +1,17 @@ +#include "cyclic_list.h" +#include + +int main() +{ + int peopleCount, everyM; + printf("Enter people count and after how many people we kill human (Каждый k+1-ый будет убит) (separated by space): "); + scanf("%d %d", &peopleCount, &everyM); + + List* people = createList(peopleCount); + int humanNumber = 0; + for (; !humanNumber; humanNumber = deleteElement(people, everyM)) { } + printf("Number %d is alive! \n", humanNumber); + + deleteList(people); + return 0; +}