From 409644cff50c123423d544fbf602fc4e773a522d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Wed, 10 Jul 2024 22:16:33 +0300 Subject: [PATCH] feat: :sparkles: dynamic queue fix: :bug: memory math --- Dynamic Queue in C/main.c | 114 ++++++++++++++++++++++++++++++++++++++ Dynamic Stack in C/main.c | 8 +-- Static Queue in C/main.c | 2 +- 3 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 Dynamic Queue in C/main.c diff --git a/Dynamic Queue in C/main.c b/Dynamic Queue in C/main.c new file mode 100644 index 0000000..960a08a --- /dev/null +++ b/Dynamic Queue in C/main.c @@ -0,0 +1,114 @@ +#include +#include +#include + +typedef struct Queue Queue; + +struct Queue { + int* elements; + int total_element_count; +}; + +int* enqueue(Queue* queue, int element) { + int* new_allocation = (int*)realloc(queue->elements, (queue->total_element_count + 1)*sizeof(int)); + + + queue->elements[queue->total_element_count] = element; + queue->total_element_count++; + return &queue->elements[queue->total_element_count-1]; +} + +void* dequeue(Queue* queue, int* result) { + if(queue->total_element_count == 0) { + return NULL; + } + + *result = queue->elements[0]; + memcpy(queue->elements, queue->elements+1, (queue->total_element_count-1)* sizeof(int)); + queue->total_element_count--; + int* new_allocation = (int*)realloc(queue->elements, queue->total_element_count*sizeof(int)); + return queue; +} + +int* get(Queue* queue, int index) { + if(index >= queue->total_element_count) { + return NULL; + } + + return &queue->elements[index]; +} + +int search(Queue* queue, int value) { + int current_index = 0; + + while(current_index < queue->total_element_count) { + if (queue->elements[current_index] == value) { + return current_index; + } + current_index++; + } + return -1; +} + +int main() { + printf("Hello World\n"); + + Queue queue; + + int* first_allocation = (int*)malloc(0); + if (!first_allocation) { + printf("Error: First Allocation"); + return -1; + } + + queue.elements = first_allocation; + queue.total_element_count = 0; + + int* result_enqueue = enqueue(&queue, 3); + if(!result_enqueue) { + printf("Error: Enqueue\n"); + return -1; + } + + int* result_enqueue_2 = enqueue(&queue, 5); + if(!result_enqueue_2) { + printf("Error: Enqueue 2\n"); + return -1; + } + + int* result_get = get(&queue, 0); + + if(!result_get) { + printf("Error: Get\n"); + return -1; + } + + printf("9. Index = %d\n", *result_get); + + int dequeued = 0; + int* result_dequeue = dequeue(&queue, &dequeued); + + if(!result_dequeue) { + printf("Error: Dequeue\n"); + return -1; + } + + printf("First Element = %d\n", dequeued); + + int result_search = search(&queue, 5); + + if(result_search == -1) { + printf("Error: Search\n"); + return -1; + } + + printf("Searched Index = %d\n", result_search); + + int result_search_2 = search(&queue, 10); + + if(result_search_2 == -1) { + printf("Error: Search 2\n"); + return -1; + } + +} \ No newline at end of file diff --git a/Dynamic Stack in C/main.c b/Dynamic Stack in C/main.c index 103c4f0..9264c9b 100644 --- a/Dynamic Stack in C/main.c +++ b/Dynamic Stack in C/main.c @@ -23,7 +23,7 @@ Stack new() { } int push(Stack* stack, int element) { - int* new_space_ptr = (int*)realloc(stack->elements, stack->size+sizeof(int)); + int* new_space_ptr = (int*)realloc(stack->elements, (stack->size+1)*sizeof(int)); if (!new_space_ptr) { return -1; } @@ -38,10 +38,8 @@ int* pop(Stack* stack) { return NULL; } int* element = &stack->elements[stack->top]; - int* new_space_ptr = (int*)realloc(stack->elements, stack->size-sizeof(int)); - if (new_space_ptr) { - return NULL; - } + int* new_space_ptr = (int*)realloc(stack->elements, (stack->size-1) * sizeof(int)); + stack->size--; stack->top--; return element; diff --git a/Static Queue in C/main.c b/Static Queue in C/main.c index a5098a5..63effdc 100644 --- a/Static Queue in C/main.c +++ b/Static Queue in C/main.c @@ -25,7 +25,7 @@ void* dequeue(Queue* queue, int* result) { return NULL; } *result = queue->elements[QUEUE_SIZE-1]; - memcpy(&queue->elements[queue->last+2], &queue->elements[queue->last+1], QUEUE_SIZE-queue->last-1); + memcpy(&queue->elements[queue->last+2], &queue->elements[queue->last+1], (QUEUE_SIZE-queue->last-1)*sizeof(int)); queue->last++; return queue; }