From 926303a667b0876ceb5ab8bc5dcc0ab0828cb98f Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sat, 15 Nov 2025 02:59:59 +0300 Subject: [PATCH] Implemented a rhyme solution using an array of cyclic lists --- Lists/cyclic_list_array.c | 138 ++++++++++++++++++++++++++++++++++++++ Lists/cyclic_list_array.h | 34 ++++++++++ Lists/rhyme.c | 63 +++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100644 Lists/cyclic_list_array.c create mode 100644 Lists/cyclic_list_array.h create mode 100644 Lists/rhyme.c diff --git a/Lists/cyclic_list_array.c b/Lists/cyclic_list_array.c new file mode 100644 index 0000000..e860fdf --- /dev/null +++ b/Lists/cyclic_list_array.c @@ -0,0 +1,138 @@ +#include "cyclic_list_array.h" + +Status cyclicListArrayCreate(CyclicListArray **cyclicListArray) +{ + if (cyclicListArray == NULL) + { + return NULL_POINTER_ARGUMENT_ERROR; + } + *cyclicListArray = malloc(sizeof(CyclicListArray)); + if (*cyclicListArray == NULL) + { + return MEMORY_ALLOCATION_ERROR; + } + (*cyclicListArray)->size = 0; + (*cyclicListArray)->position = 0; + (*cyclicListArray)->data = NULL; + return OK; +} + +Status cyclicListArrayAdd(CyclicListArray *cyclicListArray, const int value) +{ + if (cyclicListArray == NULL) + { + return NULL_POINTER_ARGUMENT_ERROR; + } + int *data = malloc(sizeof(int) * (cyclicListArray->size + 1)); + if (data == NULL) + { + return MEMORY_ALLOCATION_ERROR; + } + for (unsigned int index = 0; index < cyclicListArray->size; ++index) + { + data[index] = cyclicListArray->data[index]; + } + data[cyclicListArray->size] = value; + + free(cyclicListArray->data); + cyclicListArray->data = data; + cyclicListArray->size++; + + return OK; +} + +Status cyclicListArrayNext(CyclicListArray *cyclicListArray) +{ + if (cyclicListArray == NULL) + { + return NULL_POINTER_ARGUMENT_ERROR; + } + if (cyclicListArray->size == 0) + { + return EMPTY_LIST; + } + cyclicListArray->position = (cyclicListArray->position + 1) % cyclicListArray->size; + return OK; +} + +Status cyclicListArrayPrevious(CyclicListArray *cyclicListArray) +{ + if (cyclicListArray == NULL) + { + return NULL_POINTER_ARGUMENT_ERROR; + } + if (cyclicListArray->size == 0) + { + return EMPTY_LIST; + } + cyclicListArray->position = (cyclicListArray->position - 1 + cyclicListArray->size) % cyclicListArray->size; + return OK; +} + +Status cyclicListArrayGetCurrent(const CyclicListArray *cyclicListArray, int *address) +{ + if (cyclicListArray == NULL) + { + return NULL_POINTER_ARGUMENT_ERROR; + } + if (cyclicListArray->size == 0) + { + return EMPTY_LIST; + } + *address = cyclicListArray->data[cyclicListArray->position]; + return OK; +} + +Status cyclicListArrayRemoveCurrent(CyclicListArray *cyclicListArray) +{ + if (cyclicListArray == NULL) + { + return NULL_POINTER_ARGUMENT_ERROR; + } + if (cyclicListArray->size == 0) + { + return EMPTY_LIST; + } + + int *data = malloc(sizeof(int) * (cyclicListArray->size - 1)); + if (data == NULL) + { + return MEMORY_ALLOCATION_ERROR; + } + int offset = 0; + for (unsigned int index = 0; index < cyclicListArray->size; ++index) + { + if (offset == 0 && index == cyclicListArray->position) + { + offset = 1; + } + else + { + data[index - offset] = cyclicListArray->data[index]; + } + } + free(cyclicListArray->data); + cyclicListArray->data = data; + cyclicListArray->size--; + if (cyclicListArray->size > 0) + { + cyclicListArray->position = cyclicListArray->position % cyclicListArray->size; + } + else + { + cyclicListArray->position = 0; + } + return OK; +} + +Status cyclicListArrayFree(CyclicListArray **cyclicListArray) +{ + if (cyclicListArray == NULL || *cyclicListArray == NULL) + { + return NULL_POINTER_ARGUMENT_ERROR; + } + free((*cyclicListArray)->data); + free(*cyclicListArray); + *cyclicListArray = NULL; + return OK; +} diff --git a/Lists/cyclic_list_array.h b/Lists/cyclic_list_array.h new file mode 100644 index 0000000..9ed5c08 --- /dev/null +++ b/Lists/cyclic_list_array.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include + +typedef enum StatusesEnum +{ + OK, + MEMORY_ALLOCATION_ERROR, + NULL_POINTER_ARGUMENT_ERROR, + EMPTY_LIST, + NOT_INCLUDE_VALUE +} Status; + +typedef struct CyclicListArrayStruct +{ + int *data; + int size; + unsigned int position; +} CyclicListArray; + +Status cyclicListArrayCreate(CyclicListArray **cyclicListArray); + +Status cyclicListArrayAdd(CyclicListArray *cyclicListArray, const int value); + +Status cyclicListArrayNext(CyclicListArray *cyclicListArray); + +Status cyclicListArrayPrevious(CyclicListArray *cyclicListArray); + +Status cyclicListArrayGetCurrent(const CyclicListArray *cyclicListArray, int *address); + +Status cyclicListArrayRemoveCurrent(CyclicListArray *cyclicListArray); + +Status cyclicListArrayFree(CyclicListArray **cyclicListArray); diff --git a/Lists/rhyme.c b/Lists/rhyme.c new file mode 100644 index 0000000..6dbf944 --- /dev/null +++ b/Lists/rhyme.c @@ -0,0 +1,63 @@ +#include "cyclic_list_array.h" + +int main(void) +{ + const int n = 4; + const int m = 7; + + CyclicListArray *cyclicListArray; + Status status = cyclicListArrayCreate(&cyclicListArray); + if (status != OK) + { + puts("Error creating list"); + return 1; + } + for (unsigned int number = 1; number <= n; ++number) + { + status = cyclicListArrayAdd(cyclicListArray, (int)number); + if (status != OK) + { + puts("Error adding element"); + cyclicListArrayFree(&cyclicListArray); + return 1; + } + } + + while (cyclicListArray->size > 1) + { + const unsigned int remove_index = + (cyclicListArray->position + (unsigned int)(m - 1)) % (unsigned int)cyclicListArray->size; + + while (cyclicListArray->position != remove_index) + { + status = cyclicListArrayNext(cyclicListArray); + if (status != OK) + { + puts("Error moving to next"); + cyclicListArrayFree(&cyclicListArray); + return 1; + } + } + + status = cyclicListArrayRemoveCurrent(cyclicListArray); + if (status != OK) + { + puts("Error removing element"); + cyclicListArrayFree(&cyclicListArray); + return 1; + } + } + + int result; + status = cyclicListArrayGetCurrent(cyclicListArray, &result); + if (status != OK) + { + puts("Error getting result"); + cyclicListArrayFree(&cyclicListArray); + return 1; + } + + cyclicListArrayFree(&cyclicListArray); + printf("%d", result); + return 0; +}