From d98f46ce647846b0aa30b2e16a30fd4e152a1bf5 Mon Sep 17 00:00:00 2001 From: Carlos Maiolino Date: Thu, 10 Jul 2025 22:55:07 +0200 Subject: Add new code Signed-off-by: Carlos Maiolino --- Algorithms/linked_list.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 Algorithms/linked_list.c (limited to 'Algorithms/linked_list.c') diff --git a/Algorithms/linked_list.c b/Algorithms/linked_list.c new file mode 100644 index 0000000..16bf24b --- /dev/null +++ b/Algorithms/linked_list.c @@ -0,0 +1,177 @@ +/* + * Copyright (c) Carlos Maiolino . + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + /* This is a simple example of double linked lists I wrote for fun + * Because I had nothing better to do :) + */ + +#include +#include + +struct list_item { + int key; + struct list_item *prev; + struct list_item *next; +}; + +struct list_item *list_add(struct list_item *HEAD, int key) +{ + struct list_item *item = malloc(sizeof(struct list_item)); + + if (!item) + goto err_out; + + item->key = key; + item->prev = NULL; + + /* list is empty, just asign this item as HEAD */ + if (!HEAD) { + item->next = NULL; + HEAD = item; + return HEAD; + } + + item->next = HEAD; + HEAD->prev = item; + HEAD = item; + return HEAD; + +err_out: + return NULL; +} + +void list_del_by_item(struct list_item **HEAD, int i) +{ + struct list_item *item = *HEAD; + + for (; i > 0; i--) { + if (item) { + item = item->next; + } else { + printf("Can't free an inexistent item\n"); + return; + } + } + + /* if this is the last item, item->next is already NULL */ + if (item->prev) + item->prev->next = item->next; + else { + *HEAD = item->next; + } + + if (item->next) + item->next->prev = item->prev; + + free(item); + return; +} +/* +int list_del_by_key(list, key) +int list_search(list, key) +*/ + +void print_list(struct list_item *HEAD) +{ + struct list_item *iter = HEAD; + + if (!HEAD) { + printf("List is empty\n"); + return; + } + + if (HEAD->prev != NULL) { + printf("Item is not the head of the list\n"); + return; + } + + while (iter) { + printf(" %d", iter->key); + iter = iter->next; + } + printf("\nEND OF LIST\n"); +} + +void print_node(struct list_item *item) +{ + int *val = &(item->key); + printf("NODE= %p \n", item); + printf(" .prev = %p\n", item->prev); + printf(" .next = %p\n", item->next); + printf(" .key = %p\n", &(item->key)); + printf(" .key = %d\n", *(&(item->key))); + printf(" .key = %d\n", *val); +} + +void debug_list(struct list_item *HEAD) +{ + while (HEAD) { + print_node(HEAD); + HEAD = HEAD->next; + } +} + +int main(void) +{ + /* Init list head */ + struct list_item *HEAD = NULL; + int val; + char cmd; + + while (1) { + printf("Select option: "); + scanf(" %c", &cmd); + + switch (cmd) { + case 'a': + printf("Add value: "); + scanf(" %d", &val); + HEAD = list_add(HEAD, val); + break; + case 'd': + printf("Item to delete (starting on 0): "); + scanf(" %d", &val); + if (HEAD) + list_del_by_item(&HEAD, val); + else + printf("List is empty\n"); + break; + + case 'p': + print_list(HEAD); + break; + case 'D': + debug_list(HEAD); + break; + case 'q': + goto out; + default: + printf("a: add to list, d: del item, p: print\n"); + break; + } + } + +out: + while (HEAD) { + struct list_item *next = HEAD->next; + free(HEAD); + HEAD = next; + } + + return 0; +} -- cgit v1.2.3