From bb63a9dd3c1ed1d5957238711e0df2ee004219d9 Mon Sep 17 00:00:00 2001 From: joachimschmidt557 Date: Tue, 9 Jun 2020 17:51:23 +0200 Subject: [PATCH] add my unfinished cbase --- cbase/Makefile | 5 ++ cbase/data/Makefile | 0 cbase/data/lists/Makefile | 26 +++++++ cbase/data/lists/linkedlist.c | 116 +++++++++++++++++++++++++++++ cbase/data/lists/linkedlist.h | 44 +++++++++++ cbase/data/lists/linkedlist.test | Bin 0 -> 19280 bytes cbase/data/lists/linkedlist.test.c | 35 +++++++++ cbase/data/stack.c | 0 cbase/data/stack.h | 0 cbase/data/trees/Makefile | 14 ++++ cbase/data/trees/binarytree.c | 1 + cbase/data/trees/binarytree.h | 13 ++++ cbase/data/trees/bst.c | 1 + cbase/data/trees/bst.h | 5 ++ cbase/data/trees/rbtree.c | 1 + cbase/data/trees/rbtree.h | 16 ++++ 16 files changed, 277 insertions(+) create mode 100644 cbase/Makefile create mode 100644 cbase/data/Makefile create mode 100644 cbase/data/lists/Makefile create mode 100644 cbase/data/lists/linkedlist.c create mode 100644 cbase/data/lists/linkedlist.h create mode 100755 cbase/data/lists/linkedlist.test create mode 100644 cbase/data/lists/linkedlist.test.c create mode 100644 cbase/data/stack.c create mode 100644 cbase/data/stack.h create mode 100644 cbase/data/trees/Makefile create mode 100644 cbase/data/trees/binarytree.c create mode 100644 cbase/data/trees/binarytree.h create mode 100644 cbase/data/trees/bst.c create mode 100644 cbase/data/trees/bst.h create mode 100644 cbase/data/trees/rbtree.c create mode 100644 cbase/data/trees/rbtree.h diff --git a/cbase/Makefile b/cbase/Makefile new file mode 100644 index 0000000..661c5b5 --- /dev/null +++ b/cbase/Makefile @@ -0,0 +1,5 @@ +test: + cd data/ && $(MAKE) test + cd algo/ && $(MAKE) test + +.PHONY: test diff --git a/cbase/data/Makefile b/cbase/data/Makefile new file mode 100644 index 0000000..e69de29 diff --git a/cbase/data/lists/Makefile b/cbase/data/lists/Makefile new file mode 100644 index 0000000..d3f1fe6 --- /dev/null +++ b/cbase/data/lists/Makefile @@ -0,0 +1,26 @@ +OBJ=linkedlist.o +SRC=$(OBJ:.o=.c) +HDR=$(SRC:.c=.h) +TST=$(SRC:.c=.test.c) +TSTBIN=$(TST:.test.c=.test) + +CFLAGS+=-Wall +CFLAGS+=-Wextra + +all: $(OBJ) + +.PHONY: all + +test: $(TSTBIN) + +.PHONY: test + +clean: + $(RM) $(OBJ) $(TSTBIN) + +%.o: %.c %.h + $(CC) -o $@ -c $< $(CFLAGS) + +$(TSTBIN): $(TST) $(OBJ) + $(CC) -o $@ $(@:=.c) $(@:.test=.c) $(CFLAGS) + ./$@ diff --git a/cbase/data/lists/linkedlist.c b/cbase/data/lists/linkedlist.c new file mode 100644 index 0000000..0ee1e9b --- /dev/null +++ b/cbase/data/lists/linkedlist.c @@ -0,0 +1,116 @@ +#include + +#include "linkedlist.h" + +LinkedList* +new_linkedlist() { + // TODO: handle malloc failure + LinkedListNode* nil = malloc(sizeof(LinkedListNode)); + nil->next = nil; + nil->prev = nil; + + LinkedList* l = malloc(sizeof(LinkedList)); + l->nil = nil; + + return l; +} + +LinkedListNode* +first(LinkedList* l) { + return l->nil->next; +} + +LinkedListNode* +last(LinkedList* l) { + return l->nil->prev; +} + +void +append(LinkedList* l, void* x) { + LinkedListNode* nil = l->nil; + + // TODO: handle malloc failure + LinkedListNode* y = malloc(sizeof(LinkedListNode)); + y->next = nil; + y->prev = nil->prev->prev; + y->data = x; + + nil->prev->prev->next = y; + nil->prev = y; +} + +void +insert(LinkedList* l, void* x) { + LinkedListNode* nil = l->nil; + + // TODO: handle malloc failure + LinkedListNode* y = malloc(sizeof(LinkedListNode)); + y->prev = nil; + y->next = nil->next; + y->data = x; + + nil->next->prev = x; + nil->next = x; +} + +void +insert_at(LinkedList* l, int at, void* x) { + LinkedListNode* nil = l->nil; + LinkedListNode* y = nil; + + for (int i = 0; i < at; i++) { + y = y->next; + if (y == nil) { + // Index out of range + } + } + + // TODO: handle malloc failure + LinkedListNode* new = malloc(sizeof(LinkedListNode)); + new->prev = y; + new->next = y->next; + new->data = x; + + y->next->prev = new; + y->next = new; +} + +LinkedListNode* +search(LinkedList* l, void* x) { + LinkedListNode* y = l->nil->next; + + while (y != l->nil) { + if (y->data == x) + return y; + y = y->next; + } + + return NULL; +} + +void +delete_item(LinkedListNode* x) { + x->prev->next = x->next; + x->next->prev = x->prev; + + free(x); +} + +void +delete_linkedlist(LinkedList* l) { + free(l->nil); + free(l); +} + +int +count_linkedlist(LinkedList* l) { + int n = 0; + LinkedListNode* x = l->nil; + + while (x->next != l->nil) { + x = x->next; + n++; + } + + return n; +} diff --git a/cbase/data/lists/linkedlist.h b/cbase/data/lists/linkedlist.h new file mode 100644 index 0000000..0ae3b7a --- /dev/null +++ b/cbase/data/lists/linkedlist.h @@ -0,0 +1,44 @@ +#ifndef LINKEDLIST_H +#define LINKEDLIST_H + +typedef struct LinkedListNode { + void* data; + struct LinkedListNode* prev; + struct LinkedListNode* next; +} LinkedListNode; + +typedef struct LinkedList { + LinkedListNode* nil; +} LinkedList; + +LinkedList* +new_linkedlist(); + +LinkedListNode* +first(LinkedList* l); + +LinkedListNode* +last(LinkedList* l); + +void +append(LinkedList* l, void* x); + +void +insert(LinkedList* l, void* x); + +void +insert_at(LinkedList* l, int i, void* x); + +LinkedListNode* +search(LinkedList* l, void* x); + +void +delete_item(LinkedListNode* x); + +void +delete_linkedlist(LinkedList* l); + +int +count_linkedlist(LinkedList* l); + +#endif diff --git a/cbase/data/lists/linkedlist.test b/cbase/data/lists/linkedlist.test new file mode 100755 index 0000000000000000000000000000000000000000..e91466059592579c574b5139d4515a02426e6bcf GIT binary patch literal 19280 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 +#include + +#include "linkedlist.h" + +void +test_empty() { + LinkedList* l = new_linkedlist(); + assert(count_linkedlist(l) == 0); + delete_linkedlist(l); +} + +void +test_single() { + LinkedList* l = new_linkedlist(); + + int x = 42; + int* p = &x; + + append(l, p); + assert(count_linkedlist(l) == 1); + assert(first(l)->data == p); + assert(last(l)->data == p); + + delete_item(first(l)); + assert(count_linkedlist(l) == 0); + + delete_linkedlist(l); +} + +int +main() { + test_empty(); + test_single(); +} diff --git a/cbase/data/stack.c b/cbase/data/stack.c new file mode 100644 index 0000000..e69de29 diff --git a/cbase/data/stack.h b/cbase/data/stack.h new file mode 100644 index 0000000..e69de29 diff --git a/cbase/data/trees/Makefile b/cbase/data/trees/Makefile new file mode 100644 index 0000000..5fa6ca5 --- /dev/null +++ b/cbase/data/trees/Makefile @@ -0,0 +1,14 @@ +OBJ=binarytree.o bst.o rbtree.o +SRC=$(OBJ:.o=.c) +HDR=$(SRC:.c=.h) + +CFLAGS+=-Wall +CFLAGS+=-Wextra + +all: $(OBJ) + +clean: + $(RM) $(OBJ) + +%.o: %.c %.h + $(CC) -o $@ -c $< $(CFLAGS) diff --git a/cbase/data/trees/binarytree.c b/cbase/data/trees/binarytree.c new file mode 100644 index 0000000..17db9c5 --- /dev/null +++ b/cbase/data/trees/binarytree.c @@ -0,0 +1 @@ +#include "binarytree.h" \ No newline at end of file diff --git a/cbase/data/trees/binarytree.h b/cbase/data/trees/binarytree.h new file mode 100644 index 0000000..46544b8 --- /dev/null +++ b/cbase/data/trees/binarytree.h @@ -0,0 +1,13 @@ +#ifndef BINARYTREE_H +#define BINARYTREE_H + +typedef struct BinaryTreeNode { + void* data; + struct BinaryTreeNode* left; + struct BinaryTreeNode* right; +} BinaryTreeNode; + +BinaryTreeNode* +new_binarytree(); + +#endif diff --git a/cbase/data/trees/bst.c b/cbase/data/trees/bst.c new file mode 100644 index 0000000..26be7d9 --- /dev/null +++ b/cbase/data/trees/bst.c @@ -0,0 +1 @@ +#include "bst.h" \ No newline at end of file diff --git a/cbase/data/trees/bst.h b/cbase/data/trees/bst.h new file mode 100644 index 0000000..924aeb8 --- /dev/null +++ b/cbase/data/trees/bst.h @@ -0,0 +1,5 @@ +#ifndef BST_H +#define BST_H + + +#endif diff --git a/cbase/data/trees/rbtree.c b/cbase/data/trees/rbtree.c new file mode 100644 index 0000000..16f8cac --- /dev/null +++ b/cbase/data/trees/rbtree.c @@ -0,0 +1 @@ +#include "rbtree.h" \ No newline at end of file diff --git a/cbase/data/trees/rbtree.h b/cbase/data/trees/rbtree.h new file mode 100644 index 0000000..a1b6d9e --- /dev/null +++ b/cbase/data/trees/rbtree.h @@ -0,0 +1,16 @@ +#ifndef RBTREE_H +#define RBTREE_H + +typedef enum { + Red, + Black, +} RBColor; + +typedef struct RBTreeNode { + void* data; + struct RBTreeNode* left; + struct RBTreeNode* right; + RBColor color; +} RBTreeNode; + +#endif