/* libmisc/linkedlist.c - Singly- and doubly- linked lists * * Copyright (C) 2024-2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include /* for NULL */ #include /* singly linked list *********************************************************/ void lm_sll_push_to_rear(lm_sll_root *root, lm_sll_node *node) { assert(root); node->rear = NULL; if (root->rear) root->rear->rear = node; else root->front = node; root->rear = node; } void lm_sll_pop_from_front(lm_sll_root *root) { assert(root); assert(root->front); root->front = root->front->rear; if (!root->front) root->rear = NULL; } /* doubly linked list *********************************************************/ void lm_dll_push_to_rear(lm_dll_root *root, lm_dll_node *node) { assert(root); assert(node); node->front = root->rear; node->rear = NULL; if (root->rear) root->rear->rear = node; else root->front = node; root->rear = node; } void lm_dll_remove(lm_dll_root *root, lm_dll_node *node) { assert(root); assert(node); if (node->front) node->front->rear = node->rear; else root->front = node->rear; if (node->rear) node->rear->front = node->front; else root->rear = node->front; } void lm_dll_pop_from_front(lm_dll_root *root) { assert(root); assert(root->front); lm_dll_remove(root, root->front); }