Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions Lists/cyclic_list_array.c
Original file line number Diff line number Diff line change
@@ -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;
}
34 changes: 34 additions & 0 deletions Lists/cyclic_list_array.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#pragma once

#include <stdio.h>
#include <stdlib.h>

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);
63 changes: 63 additions & 0 deletions Lists/rhyme.c
Original file line number Diff line number Diff line change
@@ -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;
}