diff options
author | standenboy <standenboy@seacrossedlovers.xyz> | 2024-04-25 08:45:36 +0100 |
---|---|---|
committer | standenboy <standenboy@seacrossedlovers.xyz> | 2024-04-25 08:45:36 +0100 |
commit | 7d3856203d28281e3ffc6b365cc55b1d192a5599 (patch) | |
tree | 226ffda231a717f625bd1a965a32d02d0d1348b0 /comp/cw/code/tokenizer/ads/dll/dll.c | |
parent | a241ad8e874a2220d81254c2ebfbe69d0470fd9b (diff) |
started cw
Diffstat (limited to 'comp/cw/code/tokenizer/ads/dll/dll.c')
-rw-r--r-- | comp/cw/code/tokenizer/ads/dll/dll.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/comp/cw/code/tokenizer/ads/dll/dll.c b/comp/cw/code/tokenizer/ads/dll/dll.c new file mode 100644 index 0000000..b24b13f --- /dev/null +++ b/comp/cw/code/tokenizer/ads/dll/dll.c @@ -0,0 +1,62 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +typedef struct dll_t dll_t; + +typedef struct dll_t { + void *data; + dll_t *next; + dll_t *prev; +} dll_t; + +dll_t *dllalloc(){ + dll_t *output = malloc(sizeof(dll_t)); + if (output == NULL) + return NULL; + output->next = NULL; + output->prev = NULL; + return output; +} + +void dllsetdata(dll_t *node, void *data){ + node->data = malloc(sizeof(data)); + memcpy(node->data, data, sizeof(data)); +} + +void dllsetnext(dll_t *node, dll_t *next){ + if (node->next == NULL) { + node->next = next; + node->next->prev = node; + } + else + dllsetnext(node->next, next); +} +void dllsetprev(dll_t *node, dll_t *prev){ + if (node->prev == NULL) { + node->prev = prev; + node->prev->next = node; + } + else + dllsetprev(node->prev, prev); +} + +void *dllgetat(dll_t *head, int index){ + if (index == 0) + return head->data; + else { + if (head->next != NULL) { + return dllgetat(head->next, index - 1); + }else { + return NULL; + } + } +} + +void dllfreeall(dll_t *head){ + if (head->next != NULL) + dllfreeall(head->next); + free(head->data); + free(head); +} + |