From 9891f38ddcca971fa21ab61e7a70832c8c877b0a Mon Sep 17 00:00:00 2001 From: Michael Hunteman Date: Sat, 23 Sep 2023 12:53:46 -0500 Subject: Initial commit --- doublylinkedlist.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 doublylinkedlist.c (limited to 'doublylinkedlist.c') diff --git a/doublylinkedlist.c b/doublylinkedlist.c new file mode 100644 index 0000000..e98217a --- /dev/null +++ b/doublylinkedlist.c @@ -0,0 +1,161 @@ +#include +#include + +struct node { + int val; + struct node *prev; + struct node *next; +}; + +struct node *head; +struct node *tail; +int len = 0; + +void +prepend(int val) +{ + struct node *tmp = malloc(sizeof(struct node)); + tmp->val = val; + if (head == NULL) { + head = tail = tmp; + return; + } + tmp->val = val; + tmp->next = head; + head->prev = tmp; + head = tmp; + ++len; +} + +void +append(int val) +{ + struct node *tmp = malloc(sizeof(struct node)); + tmp->val = val; + if (!tail) { + head = tail = tmp; + return; + } + tmp->prev = tail; + tail->next = tmp; + tail = tmp; + ++len; +} + +struct node +*get_at(int i) +{ + struct node *cur = head; + for (int j = 0; cur && j < i; ++j) { + cur = cur->next; + } + return cur; +} + +void +insert_at(int val, int i) +{ + if (i > len) { + printf("index is greater than the list length\n"); + } else if (i == len) { + append(val); + return; + } else if (i == 0) { + prepend(val); + return; + } + struct node *cur = get_at(i); + struct node *tmp = malloc(sizeof(struct node)); + tmp->next = cur; + tmp->prev = cur->prev; + cur->prev = tmp; + + if (tmp->prev) { + tmp->prev->next = tmp; + } + ++len; +} + +int +remove_node(struct node *tmp) +{ + --len; + if (len == 0) { + head = tail = NULL; + return -1; + } + + if (tmp->prev) { + tmp->prev->next = tmp->next; + } + if (tmp->next) { + tmp->next->prev = tmp->prev; + } + + if (tmp == head) { + head = tmp->next; + } + if (tmp == tail) { + tail = tmp->prev; + } + + int val = tmp->val; + free(tmp); + return val; +} + +int +remove_val(int val) +{ + struct node *cur = head; + for (int i = 0; cur && cur->val != val && i < len; ++i) { + cur = cur->next; + } + if (!cur) { + return -1; + } + return remove_node(cur); +} + +int +remove_at(int i) +{ + struct node *tmp = get_at(i); + if (!tmp) { + return -1; + } + return remove_node(tmp); +} + +int +get(int i) +{ + get_at(i)->val; +} + +void +print() +{ + struct node *cur = head; + while (cur != NULL) { + printf("%d ", cur->val); + cur = cur->next; + } + printf("\n"); +} + +int +main() +{ + int val, n = 0; + printf("How many integers?\n"); + scanf("%d", &n); + for (int i = 0; i < n; ++i) { + printf("Enter an integer \n"); + scanf("%d", &val); + prepend(val); + print(); + } + + return 0; +} -- cgit v1.2.3