From 3ef0967e31ea8d4ad885535839a925f282c7f2ff Mon Sep 17 00:00:00 2001
From: Florian Burgener <florian.brgnr@gmail.com>
Date: Fri, 20 May 2022 23:11:08 +0200
Subject: [PATCH] Start of the implementation in C

---
 __main__.py        |   8 +++--
 src/Makefile       |  24 +++++++++++++
 src/bptree.h       |   0
 src/main.c         |  29 ++++++++++++++++
 src/main.o         | Bin 0 -> 9296 bytes
 src/program        | Bin 0 -> 29360 bytes
 src/sorted_array.c |  83 +++++++++++++++++++++++++++++++++++++++++++++
 src/sorted_array.h |  15 ++++++++
 src/sorted_array.o | Bin 0 -> 17424 bytes
 9 files changed, 156 insertions(+), 3 deletions(-)
 create mode 100644 src/Makefile
 create mode 100644 src/bptree.h
 create mode 100644 src/main.c
 create mode 100644 src/main.o
 create mode 100644 src/program
 create mode 100644 src/sorted_array.c
 create mode 100644 src/sorted_array.h
 create mode 100644 src/sorted_array.o

diff --git a/__main__.py b/__main__.py
index ca8e13a..b369571 100644
--- a/__main__.py
+++ b/__main__.py
@@ -83,8 +83,11 @@ def node_is_full(node):
 
 
 def redistribute_keys(left_node, right_node, left_index, right_index):
-    right_node.keys = left_node.keys[right_index:]
-    left_node.keys = left_node.keys[:left_index]
+    for i in range(right_index, len(left_node.keys)):
+        right_node.keys.append(left_node.keys[i])
+
+    for i in range(left_index, len(left_node.keys)):
+        left_node.keys.pop()
 
 
 def split_leaf(node, key):
@@ -477,7 +480,6 @@ def main():
     bptree_delete(root, 47)
     # bptree_delete(root, 65)
 
-
     bptree_print(root)
 
 
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..2ab95ed
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,24 @@
+TARGET = program
+LIBS = -lm
+CC = gcc
+CFLAGS = -g -Wall -Wextra -pedantic -Ofast
+# CFLAGS += -fsanitize=address -fsanitize=leak
+
+.PHONY: default all clean
+
+default: $(TARGET)
+all: default
+
+OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
+HEADERS = $(wildcard *.h)
+
+%.o: %.c $(HEADERS)
+	$(CC) $(CFLAGS) -c $< -o $@
+
+.PRECIOUS: $(TARGET) $(OBJECTS)
+
+$(TARGET): $(OBJECTS)
+	$(CC) $(OBJECTS) ${CFLAGS} $(LIBS) -o $@
+
+clean:
+	rm -f *.o ${TARGET}*
diff --git a/src/bptree.h b/src/bptree.h
new file mode 100644
index 0000000..e69de29
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..3da830e
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "sorted_array.h"
+
+int main() {
+    int *array = (int *)malloc(sizeof(int) * 10);
+    int array_length = 0;
+
+    sorted_array_insert(array, &array_length, 3);
+    sorted_array_insert(array, &array_length, 11);
+    sorted_array_insert(array, &array_length, 5);
+    sorted_array_insert(array, &array_length, 1);
+    sorted_array_insert(array, &array_length, 15);
+    sorted_array_insert(array, &array_length, 12);
+    sorted_array_insert(array, &array_length, 8);
+    sorted_array_print(array, array_length);
+
+    sorted_array_delete(array, &array_length, 12);
+    sorted_array_delete(array, &array_length, 1);
+    sorted_array_delete(array, &array_length, 15);
+    sorted_array_delete(array, &array_length, 5);
+    sorted_array_delete(array, &array_length, 8);
+    sorted_array_delete(array, &array_length, 11);
+    sorted_array_delete(array, &array_length, 3);
+    sorted_array_print(array, array_length);
+
+    return EXIT_SUCCESS;
+}
diff --git a/src/main.o b/src/main.o
new file mode 100644
index 0000000000000000000000000000000000000000..430793ffa0d07259fdf13973a75857418dc744d3
GIT binary patch
literal 9296
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

literal 0
HcmV?d00001

diff --git a/src/program b/src/program
new file mode 100644
index 0000000000000000000000000000000000000000..d77345c41e98d225093d0a372100bb75b4155945
GIT binary patch
literal 29360
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

literal 0
HcmV?d00001

diff --git a/src/sorted_array.c b/src/sorted_array.c
new file mode 100644
index 0000000..0fc9d91
--- /dev/null
+++ b/src/sorted_array.c
@@ -0,0 +1,83 @@
+#include "sorted_array.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int lower_bound(int *array, int array_length, int value) {
+    int low = 0;
+    int high = array_length - 1;
+
+    while (low <= high) {
+        int m = (low + high) / 2;
+
+        if (array[m] < value) {
+            low = m + 1;
+        } else if (array[m] > value) {
+            high = m - 1;
+        } else {
+            return m;
+        }
+    }
+
+    return low;
+}
+
+int sorted_array_find_index(int *array, int array_length, int value) {
+    int low = 0;
+    int high = array_length - 1;
+
+    while (low <= high) {
+        int m = (low + high) / 2;
+
+        if (array[m] < value) {
+            low = m + 1;
+        } else if (array[m] > value) {
+            high = m - 1;
+        } else {
+            return m;
+        }
+    }
+
+    return -1;
+}
+
+bool sorted_array_search(int *array, int array_length, int value, int *index) {
+    int i = sorted_array_find_index(array, array_length, value);
+
+    if (index != NULL) {
+        *index = i;
+    }
+
+    return i != -1;
+}
+
+void sorted_array_print(int *array, int array_length) {
+    for (int i = 0; i < array_length; i++) {
+        printf("%d ", array[i]);
+    }
+
+    printf("\n");
+}
+
+int sorted_array_insert(int *array, int *array_length, int value) {
+    int index = lower_bound(array, *array_length, value);
+
+    for (int i = *array_length - 1; i >= index; i--) {
+        array[i + 1] = array[i];
+    }
+
+    array[index] = value;
+    *array_length += 1;
+    return index;
+}
+
+void sorted_array_delete(int *array, int *array_length, int value) {
+    int index = sorted_array_find_index(array, *array_length, value);
+
+    for (int i = index; i < *array_length; i++) {
+        array[i] = array[i + 1];
+    }
+
+    *array_length -= 1;
+}
diff --git a/src/sorted_array.h b/src/sorted_array.h
new file mode 100644
index 0000000..e108832
--- /dev/null
+++ b/src/sorted_array.h
@@ -0,0 +1,15 @@
+#ifndef SORTED_ARRAY_H
+#define SORTED_ARRAY_H
+
+#include <stdbool.h>
+
+int lower_bound(int *array, int array_length, int value);
+
+int sorted_array_find_index(int *array, int array_length, int value);
+bool sorted_array_search(int *array, int array_length, int value, int *index);
+void sorted_array_print(int *array, int array_length);
+
+int sorted_array_insert(int *array, int *array_length, int value);
+void sorted_array_delete(int *array, int *array_length, int value);
+
+#endif
diff --git a/src/sorted_array.o b/src/sorted_array.o
new file mode 100644
index 0000000000000000000000000000000000000000..b5cdc315a1c1cef35f42c2424ca12b6288091a13
GIT binary patch
literal 17424
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
K{pkKj*AD=P8M!3@

literal 0
HcmV?d00001

-- 
GitLab