Mercurial > data_structures
changeset 0:5af32066927f
Initial comit
author | Eris Caffee <discordia@eldalin.com> |
---|---|
date | Thu, 20 Sep 2012 00:08:32 -0500 |
parents | |
children | 392ce56806f9 |
files | src/queue.c src/queue.h src/queue_test.c src/ring_buffer.c src/ring_buffer.h src/ring_buffer_test.c src/stack.c src/stack.h src/stack_test.c |
diffstat | 9 files changed, 488 insertions(+), 0 deletions(-) [+] |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/queue.c Thu Sep 20 00:08:32 2012 -0500 1.3 @@ -0,0 +1,95 @@ 1.4 +#include <stdlib.h> 1.5 +#include <errno.h> 1.6 + 1.7 +#include "queue.h" 1.8 + 1.9 +//////////////////////////////////////////////////////////////////////////////// 1.10 +struct queue * queue_new(size_t const max) 1.11 + { 1.12 + if (max < 1) 1.13 + { 1.14 + errno = EINVAL; 1.15 + return NULL; 1.16 + } 1.17 + 1.18 + struct queue * rb = malloc(sizeof(struct queue)); 1.19 + if (NULL == rb) 1.20 + return NULL; 1.21 + 1.22 + rb->start = rb->count = 0; 1.23 + rb->max = max; 1.24 + 1.25 + rb->data = calloc(rb->max, sizeof(void *)); 1.26 + if (NULL == rb->data) 1.27 + { 1.28 + free(rb); 1.29 + return NULL; 1.30 + } 1.31 + 1.32 + return rb; 1.33 + } 1.34 + 1.35 +//////////////////////////////////////////////////////////////////////////////// 1.36 +// Returns: 1.37 +// NULL on error 1.38 +// elem on success and the buffer is not full 1.39 +// the overwritten element on success if the buffer was full 1.40 +void * queue_push(struct queue * rb, void * elem) 1.41 + { 1.42 + if ((NULL == rb) || (NULL == elem)) 1.43 + { 1.44 + errno = EINVAL; 1.45 + return NULL; 1.46 + } 1.47 + 1.48 + if (rb->count == rb->max) 1.49 + { 1.50 + errno = ENOMEM; 1.51 + return NULL; 1.52 + } 1.53 + 1.54 + size_t end = (rb->start + rb->count) % rb->max; 1.55 + 1.56 + rb->data[end] = elem; 1.57 + rb->count++; 1.58 + 1.59 + return elem; 1.60 + } 1.61 + 1.62 +//////////////////////////////////////////////////////////////////////////////// 1.63 +void * queue_pop(struct queue * rb) 1.64 + { 1.65 + if (NULL == rb) 1.66 + { 1.67 + errno = EINVAL; 1.68 + return NULL; 1.69 + } 1.70 + 1.71 + if (0 == rb->count) 1.72 + return NULL; 1.73 + 1.74 + void * t = rb->data[rb->start]; 1.75 + rb->count--; 1.76 + rb->start = (rb->start + 1) % rb->max; 1.77 + 1.78 + return t; 1.79 + } 1.80 + 1.81 +//////////////////////////////////////////////////////////////////////////////// 1.82 +size_t queue_size(struct queue * rb) 1.83 + { 1.84 + if (NULL == rb) 1.85 + { 1.86 + errno = EINVAL; 1.87 + return -1; 1.88 + } 1.89 + 1.90 + return rb->count; 1.91 + } 1.92 + 1.93 +//////////////////////////////////////////////////////////////////////////////// 1.94 +void queue_delete(struct queue * rb) 1.95 + { 1.96 + if (NULL != rb) free(rb->data); 1.97 + free(rb); 1.98 + }
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/src/queue.h Thu Sep 20 00:08:32 2012 -0500 2.3 @@ -0,0 +1,18 @@ 2.4 +#ifndef QUEUE_ 2.5 +#define QUEUE_ 2.6 + 2.7 +struct queue 2.8 + { 2.9 + void ** data; 2.10 + size_t max; 2.11 + size_t start; 2.12 + size_t count; 2.13 + }; 2.14 + 2.15 +struct queue * queue_new(size_t const size); 2.16 +void queue_delete(struct queue * rb); 2.17 +void * queue_push(struct queue * rb, void * elem); 2.18 +void * queue_pop(struct queue * rb); 2.19 +size_t queue_size(struct queue * rb); 2.20 + 2.21 +#endif
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/src/queue_test.c Thu Sep 20 00:08:32 2012 -0500 3.3 @@ -0,0 +1,61 @@ 3.4 +#include <stdio.h> 3.5 +#include <stdlib.h> 3.6 + 3.7 +#include "queue.h" 3.8 + 3.9 +#define MAX 10 3.10 + 3.11 +int main(int argc, char**argv) 3.12 + { 3.13 + int i, j; 3.14 + int *ip; 3.15 + struct queue * q; 3.16 + void * p; 3.17 + 3.18 + q = queue_new(MAX); 3.19 + if (NULL == q) 3.20 + { 3.21 + perror("queue_new"); 3.22 + exit(EXIT_FAILURE); 3.23 + } 3.24 + 3.25 + // Fill the queue 3.26 + for (i=0; i < MAX; i++) 3.27 + { 3.28 + ip = malloc(sizeof(int)); 3.29 + *ip = i; 3.30 + if (NULL == queue_push(q, (void *) ip)) 3.31 + perror("queue_push"); 3.32 + } 3.33 + 3.34 + // remove 5 items 3.35 + printf("queue size is %zd\n", queue_size(q)); 3.36 + for (j=0; j < 5 && NULL != (ip = queue_pop(q)); j++) 3.37 + { 3.38 + printf("%d\n", *ip); 3.39 + free(ip); 3.40 + } 3.41 + printf("queue size is %zd\n", queue_size(q)); 3.42 + 3.43 + // Overfill the queue 3.44 + for (i=MAX; i < 2*MAX; i++) 3.45 + { 3.46 + ip = malloc(sizeof(int)); 3.47 + *ip = i; 3.48 + if (NULL == queue_push(q, (void *) ip)) 3.49 + perror("queue_push"); 3.50 + } 3.51 + 3.52 + // Empty the queue 3.53 + printf("queue size is %zd\n", queue_size(q)); 3.54 + while (NULL != (ip = queue_pop(q))) 3.55 + { 3.56 + printf("%d\n", *ip); 3.57 + free(ip); 3.58 + } 3.59 + printf("queue size is %zd\n", queue_size(q)); 3.60 + 3.61 + queue_delete(q); 3.62 + 3.63 + exit(EXIT_SUCCESS); 3.64 + }
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/src/ring_buffer.c Thu Sep 20 00:08:32 2012 -0500 4.3 @@ -0,0 +1,95 @@ 4.4 +#include <stdlib.h> 4.5 +#include <errno.h> 4.6 + 4.7 +#include "ring_buffer.h" 4.8 + 4.9 +//////////////////////////////////////////////////////////////////////////////// 4.10 +struct ring_buffer * ring_buffer_new(size_t const max) 4.11 + { 4.12 + if (max < 1) 4.13 + { 4.14 + errno = EINVAL; 4.15 + return NULL; 4.16 + } 4.17 + 4.18 + struct ring_buffer * rb = malloc(sizeof(struct ring_buffer)); 4.19 + if (NULL == rb) 4.20 + return NULL; 4.21 + 4.22 + rb->start = rb->count = 0; 4.23 + rb->max = max; 4.24 + 4.25 + rb->data = calloc(rb->max, sizeof(void *)); 4.26 + if (NULL == rb->data) 4.27 + { 4.28 + free(rb); 4.29 + return NULL; 4.30 + } 4.31 + 4.32 + return rb; 4.33 + } 4.34 + 4.35 +//////////////////////////////////////////////////////////////////////////////// 4.36 +// Returns: 4.37 +// NULL on error 4.38 +// elem on success and the buffer is not full 4.39 +// the overwritten element on success if the buffer was full 4.40 +void * ring_buffer_write(struct ring_buffer * rb, void * elem) 4.41 + { 4.42 + if ((NULL == rb) || (NULL == elem)) 4.43 + { 4.44 + errno = EINVAL; 4.45 + return NULL; 4.46 + } 4.47 + 4.48 + size_t end = rb->start + rb->count; 4.49 + void * ret = rb->data[end % rb->max]; 4.50 + rb->data[end % rb->max] = elem; 4.51 + if (rb->count == rb->max) 4.52 + rb->start = (rb->start + 1) % rb->max; 4.53 + else 4.54 + { 4.55 + rb->count++; 4.56 + ret = elem; 4.57 + } 4.58 + 4.59 + return ret; 4.60 + } 4.61 + 4.62 +//////////////////////////////////////////////////////////////////////////////// 4.63 +void * ring_buffer_read(struct ring_buffer * rb) 4.64 + { 4.65 + if (NULL == rb) 4.66 + { 4.67 + errno = EINVAL; 4.68 + return NULL; 4.69 + } 4.70 + 4.71 + if (0 == rb->count) 4.72 + return NULL; 4.73 + 4.74 + void * t = rb->data[rb->start]; 4.75 + rb->count--; 4.76 + rb->start = (rb->start + 1) % rb->max; 4.77 + 4.78 + return t; 4.79 + } 4.80 + 4.81 +//////////////////////////////////////////////////////////////////////////////// 4.82 +size_t ring_buffer_size(struct ring_buffer * rb) 4.83 + { 4.84 + if (NULL == rb) 4.85 + { 4.86 + errno = EINVAL; 4.87 + return -1; 4.88 + } 4.89 + 4.90 + return rb->count; 4.91 + } 4.92 + 4.93 +//////////////////////////////////////////////////////////////////////////////// 4.94 +void ring_buffer_delete(struct ring_buffer * rb) 4.95 + { 4.96 + if (NULL != rb) free(rb->data); 4.97 + free(rb); 4.98 + }
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 5.2 +++ b/src/ring_buffer.h Thu Sep 20 00:08:32 2012 -0500 5.3 @@ -0,0 +1,18 @@ 5.4 +#ifndef RING_BUFFER_ 5.5 +#define RING_BUFFER_ 5.6 + 5.7 +struct ring_buffer 5.8 + { 5.9 + void ** data; 5.10 + size_t max; 5.11 + size_t start; 5.12 + size_t count; 5.13 + }; 5.14 + 5.15 +struct ring_buffer * ring_buffer_new(size_t const size); 5.16 +void ring_buffer_delete(struct ring_buffer * rb); 5.17 +void * ring_buffer_write(struct ring_buffer * rb, void * elem); 5.18 +void * ring_buffer_read(struct ring_buffer * rb); 5.19 +size_t ring_buffer_size(struct ring_buffer * rb); 5.20 + 5.21 +#endif
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 6.2 +++ b/src/ring_buffer_test.c Thu Sep 20 00:08:32 2012 -0500 6.3 @@ -0,0 +1,63 @@ 6.4 +#include <stdio.h> 6.5 +#include <stdlib.h> 6.6 + 6.7 +#include "ring_buffer.h" 6.8 + 6.9 +#define MAX 10 6.10 + 6.11 +int main(int argc, char**argv) 6.12 + { 6.13 + int i, j; 6.14 + int *ip; 6.15 + struct ring_buffer * rb; 6.16 + void * p; 6.17 + 6.18 + rb = ring_buffer_new(MAX); 6.19 + if (NULL == rb) 6.20 + { 6.21 + perror("ring_buffer_new: "); 6.22 + exit(EXIT_FAILURE); 6.23 + } 6.24 + 6.25 + // Add 10 items 6.26 + for (i=0; i < MAX; i++) 6.27 + { 6.28 + ip = malloc(sizeof(int)); 6.29 + *ip = i; 6.30 + p = ring_buffer_write(rb, (void *) ip); 6.31 + if ((p != NULL) && (p != ip)) 6.32 + free(p); 6.33 + } 6.34 + 6.35 + // remove 5 items 6.36 + printf("ring_buffer size is %zd\n", ring_buffer_size(rb)); 6.37 + for (j=0; j < 5 && NULL != (ip = ring_buffer_read(rb)); j++) 6.38 + { 6.39 + printf("%d\n", *ip); 6.40 + free(ip); 6.41 + } 6.42 + printf("ring_buffer size is %zd\n", ring_buffer_size(rb)); 6.43 + 6.44 + // add 8 more items 6.45 + for (j = 0; j < MAX-2; j++, i++) 6.46 + { 6.47 + ip = malloc(sizeof(int)); 6.48 + *ip = i; 6.49 + p = ring_buffer_write(rb, (void *) ip); 6.50 + if ((p != NULL) && (p != ip)) 6.51 + free(p); 6.52 + } 6.53 + 6.54 + // remove all items 6.55 + printf("ring_buffer size is %zd\n", ring_buffer_size(rb)); 6.56 + while (NULL != (ip = ring_buffer_read(rb))) 6.57 + { 6.58 + printf("%d\n", *ip); 6.59 + free(ip); 6.60 + } 6.61 + printf("ring_buffer size is %zd\n", ring_buffer_size(rb)); 6.62 + 6.63 + ring_buffer_delete(rb); 6.64 + 6.65 + exit(EXIT_SUCCESS); 6.66 + }
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 7.2 +++ b/src/stack.c Thu Sep 20 00:08:32 2012 -0500 7.3 @@ -0,0 +1,84 @@ 7.4 +#include <stdlib.h> 7.5 +#include <errno.h> 7.6 + 7.7 +#include "stack.h" 7.8 + 7.9 +//////////////////////////////////////////////////////////////////////////////// 7.10 +struct stack * stack_new(size_t const max) 7.11 + { 7.12 + if (max < 1) 7.13 + { 7.14 + errno = EINVAL; 7.15 + return NULL; 7.16 + } 7.17 + 7.18 + struct stack * s = malloc(sizeof(struct stack)); 7.19 + if (NULL == s) 7.20 + return NULL; 7.21 + 7.22 + s->size = 0; 7.23 + s->max = max; 7.24 + 7.25 + s->data = calloc(s->max, sizeof(void *)); 7.26 + if (NULL == s->data) 7.27 + { 7.28 + free(s); 7.29 + return NULL; 7.30 + } 7.31 + 7.32 + return s; 7.33 + } 7.34 + 7.35 +//////////////////////////////////////////////////////////////////////////////// 7.36 +void * stack_push(struct stack * s, void * elem) 7.37 + { 7.38 + if ((NULL == s) || (NULL == elem)) 7.39 + { 7.40 + errno = EINVAL; 7.41 + return NULL; 7.42 + } 7.43 + 7.44 + if (s->size == s->max) 7.45 + { 7.46 + errno = ENOMEM; 7.47 + return NULL; 7.48 + } 7.49 + 7.50 + return s->data[(s->size)++] = elem; 7.51 + } 7.52 + 7.53 +//////////////////////////////////////////////////////////////////////////////// 7.54 +void * stack_pop(struct stack * s) 7.55 + { 7.56 + if (NULL == s) 7.57 + { 7.58 + errno = EINVAL; 7.59 + return NULL; 7.60 + } 7.61 + 7.62 + if (0 == s->size) 7.63 + { 7.64 + return NULL; 7.65 + } 7.66 + 7.67 + return s->data[--(s->size)]; 7.68 + } 7.69 + 7.70 +//////////////////////////////////////////////////////////////////////////////// 7.71 +size_t stack_size(struct stack * s) 7.72 + { 7.73 + if (NULL == s) 7.74 + { 7.75 + errno = EINVAL; 7.76 + return -1; 7.77 + } 7.78 + 7.79 + return s->size; 7.80 + } 7.81 + 7.82 +//////////////////////////////////////////////////////////////////////////////// 7.83 +void stack_delete(struct stack * s) 7.84 + { 7.85 + if (NULL != s) free(s->data); 7.86 + free(s); 7.87 + }
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 8.2 +++ b/src/stack.h Thu Sep 20 00:08:32 2012 -0500 8.3 @@ -0,0 +1,17 @@ 8.4 +#ifndef STACK_ 8.5 +#define STACK_ 8.6 + 8.7 +struct stack 8.8 + { 8.9 + void ** data; 8.10 + size_t size; 8.11 + size_t max; 8.12 + }; 8.13 + 8.14 +struct stack * stack_new(size_t const max); 8.15 +void stack_delete(struct stack * s); 8.16 +void * stack_push(struct stack * s, void * elem); 8.17 +void * stack_pop(struct stack * s); 8.18 +size_t stack_size(struct stack * s); 8.19 + 8.20 +#endif
9.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 9.2 +++ b/src/stack_test.c Thu Sep 20 00:08:32 2012 -0500 9.3 @@ -0,0 +1,37 @@ 9.4 +#include <stdio.h> 9.5 +#include <stdlib.h> 9.6 +#include "stack.h" 9.7 + 9.8 +#define MAX 100 9.9 + 9.10 +int main(int argc, char**argv) 9.11 + { 9.12 + int i; 9.13 + int *ip; 9.14 + struct stack * s; 9.15 + 9.16 + s = stack_new(MAX); 9.17 + if (NULL == s) 9.18 + { 9.19 + perror("stack_new: "); 9.20 + exit(EXIT_FAILURE); 9.21 + } 9.22 + 9.23 + for (i=0; i < MAX/2; i++) 9.24 + { 9.25 + ip = malloc(sizeof(int)); 9.26 + *ip = i; 9.27 + stack_push(s, (void *) ip); 9.28 + } 9.29 + 9.30 + printf("stack size is %zd\n", stack_size(s)); 9.31 + while (NULL != (ip = stack_pop(s))) 9.32 + { 9.33 + printf("%d\n", *ip); 9.34 + } 9.35 + printf("stack size is %zd\n", stack_size(s)); 9.36 + 9.37 + stack_delete(s); 9.38 + 9.39 + exit(EXIT_SUCCESS); 9.40 + }