/* Libraries for fields, doubly-linked lists and red-black trees. Copyright (C) 2001 James S. Plank This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------- Please see http://web.eecs.utk.edu/~jplank/plank/classes/cs360/360/notes/Libfdr/ for instruction on how to use this library. Jim Plank plank@cs.utk.edu http://web.eecs.utk.edu/~jplank Associate Professor Department of Computer Science University of Tennessee 203 Claxton Complex 1122 Volunteer Blvd. Knoxville, TN 37996-3450 865-974-4397 Fax: 865-974-4404 */ #include /* Basic includes and definitions */ #include "dllist.h" /*---------------------------------------------------------------------* * PROCEDURES FOR MANIPULATING DOUBLY LINKED LISTS * Each list contains a sentinal node, so that * the first item in list l is l->flink. If l is * empty, then l->flink = l->blink = l. *---------------------------------------------------------------------*/ Dllist new_dllist() { Dllist d; d = (Dllist) malloc (sizeof(struct dllist)); d->flink = d; d->blink = d; return d; } void dll_insert_b(Dllist node, Jval v) /* Inserts before a given node */ { Dllist newnode; newnode = (Dllist) malloc (sizeof(struct dllist)); newnode->val = v; newnode->flink = node; newnode->blink = node->blink; newnode->flink->blink = newnode; newnode->blink->flink = newnode; } void dll_insert_a(Dllist n, Jval val) /* Inserts after a given node */ { dll_insert_b(n->flink, val); } void dll_append(Dllist l, Jval val) /* Inserts at the end of the list */ { dll_insert_b(l, val); } void dll_prepend(Dllist l, Jval val) /* Inserts at the beginning of the list */ { dll_insert_b(l->flink, val); } void dll_delete_node(Dllist node) /* Deletes an arbitrary iterm */ { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node); } int dll_empty(Dllist l) { return (l->flink == l); } void free_dllist(Dllist l) { while (!dll_empty(l)) { dll_delete_node(dll_first(l)); } free(l); } Jval dll_val(Dllist l) { return l->val; }