1 /* ========================================================================== **
4 * Copyright (C) 1997, 1998 by Christopher R. Hertel
6 * Email: crh@ubiqx.mn.org
7 * -------------------------------------------------------------------------- **
8 * This module implements a simple singly-linked list.
9 * -------------------------------------------------------------------------- **
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Library General Public
13 * License as published by the Free Software Foundation; either
14 * version 2 of the License, or (at your option) any later version.
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Library General Public License for more details.
21 * You should have received a copy of the GNU Library General Public
22 * License along with this library; if not, write to the Free
23 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 * -------------------------------------------------------------------------- **
27 * Log: ubi_sLinkList.c,v
28 * Revision 0.9 1998/07/24 07:30:20 crh
29 * Added the ubi_slNewList() macro.
31 * Revision 0.8 1998/06/04 21:29:27 crh
32 * Upper-cased defined constants (eg UBI_BINTREE_H) in some header files.
33 * This is more "standard", and is what people expect. Weird, eh?
35 * Revision 0.7 1998/06/03 18:06:03 crh
36 * Further fiddling with sys_include.h, which has been moved from the .c file
39 * Revision 0.6 1998/06/02 01:38:47 crh
40 * Changed include file name from ubi_null.h to sys_include.h to make it
43 * Revision 0.5 1998/05/20 04:38:05 crh
44 * The C file now includes ubi_null.h. See ubi_null.h for more info.
46 * Revision 0.4 1998/03/10 02:23:20 crh
47 * Combined ubi_StackQueue and ubi_sLinkList into one module. Redesigned
48 * the functions and macros. Not a complete rewrite but close to it.
50 * Revision 0.3 1998/01/03 01:59:52 crh
51 * Added ubi_slCount() macro.
53 * Revision 0.2 1997/10/21 03:35:18 crh
54 * Added parameter <After> in function Insert(). Made necessary changes
55 * to macro AddHead() and added macro AddHere().
57 * Revision 0.1 1997/10/16 02:53:45 crh
60 * -------------------------------------------------------------------------- **
61 * This module implements a singly-linked list which may also be used as a
62 * queue or a stack. For a queue, entries are added at the tail and removed
63 * from the head of the list. For a stack, the entries are entered and
64 * removed from the head of the list. A traversal of the list will always
65 * start at the head of the list and proceed toward the tail. This is all
66 * mind-numbingly simple, but I'm surprised by the number of programs out
67 * there which re-implement this a dozen or so times.
69 * Note: When the list header is initialized, the Tail pointer is set to
70 * point to the Head pointer. This simplifies things a great deal,
71 * except that you can't initialize a stack or queue by simply
72 * zeroing it out. One sure way to initialize the header is to call
73 * ubi_slInit(). Another option would be something like this:
75 * ubi_slNewList( MyList );
77 * Which translates to:
79 * ubi_slList MyList[1] = { NULL, (ubi_slNodePtr)MyList, 0 };
81 * See ubi_slInit(), ubi_slNewList(), and the ubi_slList structure
84 * + Also, note that this module is similar to the ubi_dLinkList
85 * module. There are three key differences:
86 * - This is a singly-linked list, the other is a doubly-linked
88 * - In this module, if the list is empty, the tail pointer will
89 * point back to the head of the list as described above. This
90 * is not done in ubi_dLinkList.
91 * - The ubi_slRemove() function, by necessity, removed the 'next'
92 * node. In ubi_dLinkList, the ubi_dlRemove() function removes
95 * ========================================================================== **
98 #include "ubi_sLinkList.h" /* Header for *this* module. */
100 /* ========================================================================== **
104 ubi_slListPtr ubi_slInitList( ubi_slListPtr ListPtr )
105 /* ------------------------------------------------------------------------ **
106 * Initialize a singly-linked list header.
108 * Input: ListPtr - A pointer to the list structure that is to be
109 * initialized for use.
111 * Output: A pointer to the initialized list header (i.e., same as
114 * ------------------------------------------------------------------------ **
117 ListPtr->Head = NULL;
118 ListPtr->Tail = (ubi_slNodePtr)ListPtr;
121 } /* ubi_slInitList */
123 ubi_slNodePtr ubi_slInsert( ubi_slListPtr ListPtr,
125 ubi_slNodePtr After )
126 /* ------------------------------------------------------------------------ **
127 * Add a node to the list.
129 * Input: ListPtr - A pointer to the list into which the node is to
131 * New - Pointer to the node that is to be added to the list.
132 * After - Pointer to a list in a node after which the new node
133 * will be inserted. If NULL, then the new node will
134 * be added at the head of the list.
136 * Output: A pointer to the node that was inserted into the list (i.e.,
137 * the same as <New>).
139 * ------------------------------------------------------------------------ **
142 After = After ? After : (ubi_slNodePtr)ListPtr;
143 New->Next = After->Next;
151 ubi_slNodePtr ubi_slRemove( ubi_slListPtr ListPtr, ubi_slNodePtr After )
152 /* ------------------------------------------------------------------------ **
153 * Remove the node followng <After>. If <After> is NULL, remove from the
156 * Input: ListPtr - A pointer to the list from which the node is to be
158 * After - Pointer to the node preceeding the node to be
161 * Output: A pointer to the node that was removed, or NULL if the list is
164 * ------------------------------------------------------------------------ **
167 ubi_slNodePtr DelNode;
169 After = After ? After : (ubi_slNodePtr)ListPtr;
170 DelNode = After->Next;
173 if( !(DelNode->Next) )
174 ListPtr->Tail = After;
175 After->Next = DelNode->Next;
181 /* ================================ The End ================================= */