From d823bb50697d67e9b3f32603708fdd0299072c49 Mon Sep 17 00:00:00 2001 From: James Shaw Date: Sat, 22 Sep 2007 11:25:29 +0000 Subject: Initial revision of linked list implementation svn path=/trunk/dom/; revision=3559 --- test/list.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/list.h | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 test/list.c create mode 100644 test/list.h (limited to 'test') diff --git a/test/list.c b/test/list.c new file mode 100644 index 0000000..c2d098f --- /dev/null +++ b/test/list.c @@ -0,0 +1,64 @@ +/* + * This file is part of libdom test suite. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2007 James Shaw + */ + +#include +#include +#include + +#include "list.h" + +struct list* list_new(void) { + struct list* list = malloc(sizeof(struct list)); + list->size = 0; + list->head = NULL; + list->tail = NULL; + return list; +} + +void list_destroy(struct list* list) { + struct list_elt* elt = list->head; + while (elt != NULL) { + struct list_elt* nextElt = elt->next; + free(elt); + elt = nextElt; + } + free(list); +} + +void list_add(struct list* list, void* data) { + struct list_elt* elt = malloc(sizeof(struct list_elt)); + elt->data = data; + elt->next = NULL; + struct list_elt* tail = list->tail; + + // if tail was set, make its 'next' ptr point to elt + if (tail != NULL) { + tail->next = elt; + } + + // make elt the new tail + list->tail = elt; + + if (list->head == NULL) { + list->head = elt; + } + + // inc the size of the list + list->size++; +} + +bool list_contains(struct list* list, void* data, int (*comparator)(const void* a, const void* b)) { + struct list_elt* elt = list->head; + while (elt != NULL) { + if (comparator(elt->data, data) == 0) { + return true; + } + elt = elt->next; + } + return false; +} + diff --git a/test/list.h b/test/list.h new file mode 100644 index 0000000..444f5c8 --- /dev/null +++ b/test/list.h @@ -0,0 +1,35 @@ +/* + * This file is part of libdom test suite. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2007 James Shaw + */ + +#ifndef list_h_ +#define list_h_ + +struct list_elt { + void* data; + struct list_elt* next; +}; + +struct list { + unsigned int size; + struct list_elt* head; + struct list_elt* tail; +}; + +struct list* list_new(void); +void list_destroy(struct list* list); + +/** + * Add data to the tail of the list. + */ +void list_add(struct list* list, void* data); + +/** + * Tests if data is equal to any element in the list. + */ +bool list_contains(struct list* list, void* data, int (*comparator)(const void* a, const void* b)); + +#endif -- cgit v1.2.3