summaryrefslogtreecommitdiff
path: root/BTree
diff options
context:
space:
mode:
authorCarlos Maiolino <[email protected]>2025-07-10 22:55:07 +0200
committerCarlos Maiolino <[email protected]>2025-07-10 22:56:55 +0200
commitd98f46ce647846b0aa30b2e16a30fd4e152a1bf5 (patch)
tree267474fcc77cf20b428f6f4c7f768ca09f4cfe0e /BTree
parent869e68986aa8f69af6e7842260a68d1e5c6f796f (diff)
Add new code
Signed-off-by: Carlos Maiolino <[email protected]>
Diffstat (limited to 'BTree')
-rw-r--r--BTree/Makefile6
-rw-r--r--BTree/bt_data.c51
-rw-r--r--BTree/bt_data.h4
-rw-r--r--BTree/bt_main.c63
-rw-r--r--BTree/btree.c65
-rw-r--r--BTree/btree.h43
6 files changed, 232 insertions, 0 deletions
diff --git a/BTree/Makefile b/BTree/Makefile
new file mode 100644
index 0000000..def2945
--- /dev/null
+++ b/BTree/Makefile
@@ -0,0 +1,6 @@
+btree: bt_main.o bt_data.o btree.o
+ gcc -Wall -o btree bt_main.o bt_data.o btree.o -I.
+
+clean:
+ rm -f *.o
+ rm btree
diff --git a/BTree/bt_data.c b/BTree/bt_data.c
new file mode 100644
index 0000000..c10ce3d
--- /dev/null
+++ b/BTree/bt_data.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "btree.h"
+
+struct Data * init_item(int id, char *name)
+{
+ struct Data *new = malloc(sizeof(struct Data));
+
+ if (new == NULL)
+ return new;
+
+ new->id = id;
+ strncpy(new->name, name, 20);
+
+ /* Ensure string is null terminated */
+ new->name[19] = '\0';
+
+ return new;
+}
+
+void destroy_item(struct Data *item)
+{
+ if (item)
+ free(item);
+}
+
+/* Insert new item in the tree */
+void add_item(void)
+{
+ char name[20];
+ int id;
+ struct Data *item;
+
+ printf("Name: ");
+ scanf(" %s", name);
+ printf("Id: ");
+ scanf(" %d", &id);
+
+ item = init_item(id, name);
+
+ if (!item) {
+ printf("Error adding new data\n");
+ return;
+ }
+
+ if (!btree_add(item))
+ printf("Btree Error: Failed to add item\n");
+
+ return;
+}
diff --git a/BTree/bt_data.h b/BTree/bt_data.h
new file mode 100644
index 0000000..97ca893
--- /dev/null
+++ b/BTree/bt_data.h
@@ -0,0 +1,4 @@
+struct Data * init_item(int id, char *name);
+void destroy_item(struct Data *item);
+
+void add_item(void);
diff --git a/BTree/bt_main.c b/BTree/bt_main.c
new file mode 100644
index 0000000..939a0c5
--- /dev/null
+++ b/BTree/bt_main.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "btree.h"
+#include "bt_data.h"
+
+void init_interface(void)
+{
+ while (1) {
+ char op;
+
+ system("clear");
+ printf("Please, select an option:\n");
+ printf("1: add new item\n"
+ "2: delete item\n"
+ "3: search item\n"
+ "4: Dump Tree\n"
+ "5: Quit\n");
+ printf("Enter your option: ");
+ scanf(" %c", &op);
+
+ switch(atoi(&op)) {
+ case 1:
+ add_item();
+ break;
+ case 2:
+ btree_delete();
+ break;
+ case 3:
+ btree_search();
+ break;
+ case 4:
+ btree_dump();
+ break;
+ case 5:
+ goto out;
+ default:
+ usage();
+ break;
+ }
+ }
+out:
+ return;
+}
+int main(void)
+{
+ struct BTree_head *head;
+
+ /* Initialize BTree Head */
+ head = init_head();
+
+ if (!head) {
+ printf("Unable to initialize BTree head\n");
+ goto exit_error;
+ }
+
+ init_interface();
+
+ destroy_head(head);
+ return 0;
+
+exit_error:
+ exit(1);
+}
diff --git a/BTree/btree.c b/BTree/btree.c
new file mode 100644
index 0000000..3066829
--- /dev/null
+++ b/BTree/btree.c
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "btree.h"
+
+struct BTree_head * init_head(void)
+{
+ struct BTree_head *head = malloc(sizeof(struct BTree_head));
+
+ if (head == NULL)
+ return NULL;
+
+ head->root = NULL;
+ head->height = 0;
+ head->order = 0;
+ head->num_recs = 0;
+
+ return head;
+}
+
+void destroy_head(struct BTree_head *head)
+{
+ free(head);
+}
+
+struct BTree_node * new_node(void)
+{
+ struct BTree_node *new = malloc(sizeof(struct BTree_node));
+
+ if (new != NULL)
+ memset(new, 0, sizeof(struct BTree_node));
+
+ return new;
+}
+
+void destroy_node(struct BTree_node *node)
+{
+ if (node)
+ free(node);
+}
+
+int btree_add(struct Data *item)
+{
+ return 0;
+}
+
+int btree_delete(void)
+{
+ return 0;
+}
+
+int btree_search(void)
+{
+ return 0;
+}
+
+int btree_dump(void)
+{
+ return 0;
+}
+
+void usage(void)
+{
+ return;
+}
diff --git a/BTree/btree.h b/BTree/btree.h
new file mode 100644
index 0000000..0acdb15
--- /dev/null
+++ b/BTree/btree.h
@@ -0,0 +1,43 @@
+#include <sys/types.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+/* Hardcoded BTree order */
+#define BT_ORDER 3
+
+/* Btree is an index of this structure */
+struct Data {
+ int id;
+ char name[20];
+};
+
+struct BTree_node {
+ bool is_leaf; /* Is this a leaf block? */
+ int num_recs;
+ int key_idx[BT_ORDER];
+
+ /* Points to next level when node or to data when leaf */
+ void *ptrs[BT_ORDER];
+};
+
+struct BTree_head {
+ struct BTree_node *root; /* root pointer */
+ unsigned int height; /* How many levels? */
+ unsigned int order; /* BTree order */
+ unsigned int num_recs; /* num of entrys in the tree */
+};
+
+struct BTree_head * init_head(void);
+void destroy_head(struct BTree_head *head);
+
+/*
+ * BTree Operations:
+ *
+ * All operations Return 0 for success, non zero otherwise
+ *
+ */
+int btree_add(struct Data* item);
+int btree_delete(void);
+int btree_search(void);
+int btree_dump(void);
+void usage(void);