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 0000000..e914660 Binary files /dev/null and b/cbase/data/lists/linkedlist.test differ diff --git a/cbase/data/lists/linkedlist.test.c b/cbase/data/lists/linkedlist.test.c new file mode 100644 index 0000000..3da5d15 --- /dev/null +++ b/cbase/data/lists/linkedlist.test.c @@ -0,0 +1,35 @@ +#include +#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