From be15781d892efb5ed3cecac1d2e97242cc6d2f98 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Fri, 21 Feb 2020 16:20:20 -0500 Subject: Fix rename double ended queue files Also add gitignore. --- collections/double_ended_queue.c | 162 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 collections/double_ended_queue.c (limited to 'collections/double_ended_queue.c') diff --git a/collections/double_ended_queue.c b/collections/double_ended_queue.c new file mode 100644 index 0000000..76856f2 --- /dev/null +++ b/collections/double_ended_queue.c @@ -0,0 +1,162 @@ +#include "vector.h" + +#include +#include +#include + +#include + +#define START_SIZE 64; + +struct vector { + void **base, **new, **ptr; + int i, limit; +}; + +vec* vec_new() +{ + vec *root; + + root = malloc(sizeof(vec)); + assert(root); + + root->limit = START_SIZE; + root->base = root->new = root->ptr = malloc(root->limit * sizeof(void*)); + assert(root->base); + + return root; +} + +vec* vec_with_capacity(n) +int n; +{ + vec *root; + + root = malloc(sizeof(vec)); + assert(root); + + root->limit = n; + root->base = root->new = root->ptr = malloc(root->limit * sizeof(void*)); + assert(root->base); + + return root; +} + +int vec_size(root) +vec *root; +{ + if (!root) { + return -1; + } + return (root->new - root->ptr); +} + +void vec_resize(root) +vec *root; +{ + if (root->ptr != root->base) { + memmove(root->base, root->ptr, root->new - root->ptr); + root->new = root->base + vec_size(root); + root->ptr = root->base; + } else { + root->base = malloc(root->limit * 2 * sizeof(void*)); + assert(root->base); + + + root->base = memcpy(root->base, root->ptr, root->limit * sizeof(void*)); + assert(root->base); + + + root->new = root->base + vec_size(root); + root->limit = root->limit * 2; + + free(root->ptr); + root->ptr = root->base; + } +} + +void vec_push(root, item) +vec *root; +void *item; +{ + if (!root) { + return; + } + if (root->new == root->base + root->limit) { + vec_resize(root); + } + + *(root->new++) = item; +} + +void* vec_rmfirst(root) +vec *root; +{ + void* tmp; + if (!root || root->ptr == root->new) { + return NULL; + } + + return tmp = *(root->ptr++); +} + +void* vec_index(root, index) +vec *root; +int index; +{ + if (!root || root->ptr + index >= root->new) { + return NULL; + } + + return root->ptr[index]; +} + +void* vec_pop(root) +vec *root; +{ + void* tmp; + if (!root || root->new == root->ptr) { + return NULL; + } + + return tmp = *(--root->new); +} + +void vec_free(root) +vec *root; +{ + free(root->base); + root->base = NULL; + root->new = NULL; + root->ptr = NULL; + + free(root); +} + +void vec_print(root) +vec *root; +{ + void **tmp; + + fprintf(stderr, "VEC[b: %p, p: %p, n:%p]:\n\t ", + root->base, root->ptr, root->new); + for (tmp = root->ptr; tmp < root->new; tmp++){ + fprintf(stderr, "[%p]", *tmp); + } + fprintf(stderr, "\n"); +} + +vec* vec_cp(root) +vec *root; +{ + vec *copy; + + copy = vec_with_capacity(root->limit); + + copy->base = memcpy(copy->base, root->ptr, + vec_size(root) * sizeof(void*)); + assert(copy->base); + + copy->ptr = copy->base; + copy->new = copy->base + vec_size(root); +} -- cgit v1.1