From e2b0f73d1ad81cdfdc81bd7c2d73aca7307c8248 Mon Sep 17 00:00:00 2001 From: lukas-heiligenbrunner Date: Mon, 25 Apr 2022 16:13:48 +0200 Subject: [PATCH] init --- CMakeLists.txt | 6 ++ main.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 main.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..2e6d24b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.22) +project(untitled C) + +set(CMAKE_C_STANDARD 99) + +add_executable(untitled main.c) diff --git a/main.c b/main.c new file mode 100644 index 0000000..766818f --- /dev/null +++ b/main.c @@ -0,0 +1,151 @@ +#include +#include +#include + +struct Node { + struct Node *next; + struct Node *prev; + void *dta; +}; +typedef struct Node Node; + +typedef struct { + Node *head; + unsigned length; +} List; + +List *newList() { + List *list = malloc(sizeof(List)); + return list; +} + +Node *_newNode(Node *next, Node *prev, void *dta) { + Node *newnode = malloc(sizeof(Node)); + newnode->next = next; + newnode->prev = prev; + newnode->dta = dta; + return newnode; +} + +Node *_traverseToLast(Node *node) { + if (node->next != NULL) { + return _traverseToLast(node->next); + } else { + return node; + } +} + +Node *_traverseToPos(Node *node, int pos) { + if (pos > 0) { + if (node->next != NULL) { + return _traverseToPos(node->next, pos - 1); + } else { + return NULL; + } + } else { + return node; + } +} + +void append(List *list, void *elem) { + if (list->head == NULL) { + // create head + list->head = _newNode(NULL, NULL, elem); + } else { + // append element + Node *last = _traverseToLast(list->head); + last->next = _newNode(NULL, last, elem); + } +} + +int _length(Node *node) { + if (node->next == NULL) { + return 1; + } else { + return 1 + _length(node->next); + } +} + +int length(List *list) { + if (list->head == NULL) { + return 0; + } + return _length(list->head); +} + +void insert(List *list, int position) { + +} + +void delete(List *list, int position) { + Node *todel = _traverseToPos(list->head, position); + + if (todel->prev == NULL) { + // we are the header + list->head = todel->next; + if (list->head != NULL) { + list->head->prev = NULL; + } + } else if (todel->next == NULL) { + // we are the last item + todel->prev->next = NULL; + } else { + todel->prev->next = todel->next; + todel->next->prev = todel->prev; + } + + free(todel); +} + +void deleteAll(List *list) { + while (list->head != NULL) { + delete(list, 0); + } +} + +void deleteList(List *list) { + deleteAll(list); + free(list); +} + +List *merge(List *list1, List *list2) { + return NULL; +} + +void *first(List *list) { + return list->head->dta; +} + +void *last(List *list) { + return _traverseToLast(list->head)->dta; +} + +void print(List *list, char *typeFormatter) { + Node *curr = list->head; + while (curr != NULL) { + printf(typeFormatter, curr->dta); + printf("\n"); + + curr = curr->next; + } +} + +int main() { + printf("Hello, World!\n"); + List *mylist = newList(); + + append(mylist, "test"); + append(mylist, "test2"); + append(mylist, "test3"); + print(mylist, "%s"); + printf("length is: %d\n", length(mylist)); + + printf("\n"); + + deleteAll(mylist); + printf("length is: %d\n", length(mylist)); + print(mylist, "%s"); + + deleteList(mylist); + return 0; +}