1169695Skan/* insque(3C) routines
2169695Skan   This file is in the public domain.  */
3169695Skan
4169695Skan/*
5169695Skan
6169695Skan@deftypefn Supplemental void insque (struct qelem *@var{elem}, struct qelem *@var{pred})
7169695Skan@deftypefnx Supplemental void remque (struct qelem *@var{elem})
8169695Skan
9169695SkanRoutines to manipulate queues built from doubly linked lists.  The
10169695Skan@code{insque} routine inserts @var{elem} in the queue immediately
11169695Skanafter @var{pred}.  The @code{remque} routine removes @var{elem} from
12169695Skanits containing queue.  These routines expect to be passed pointers to
13169695Skanstructures which have as their first members a forward pointer and a
14169695Skanback pointer, like this prototype (although no prototype is provided):
15169695Skan
16169695Skan@example
17169695Skanstruct qelem @{
18169695Skan  struct qelem *q_forw;
19169695Skan  struct qelem *q_back;
20169695Skan  char q_data[];
21169695Skan@};
22169695Skan@end example
23169695Skan
24169695Skan@end deftypefn
25169695Skan
26169695Skan*/
27169695Skan
28169695Skan
29169695Skanstruct qelem {
30169695Skan  struct qelem *q_forw;
31169695Skan  struct qelem *q_back;
32169695Skan};
33169695Skan
34169695Skan
35169695Skanvoid
36169695Skaninsque (struct qelem *elem, struct qelem *pred)
37169695Skan{
38169695Skan  elem -> q_forw = pred -> q_forw;
39169695Skan  pred -> q_forw -> q_back = elem;
40169695Skan  elem -> q_back = pred;
41169695Skan  pred -> q_forw = elem;
42169695Skan}
43169695Skan
44169695Skan
45169695Skanvoid
46169695Skanremque (struct qelem *elem)
47169695Skan{
48169695Skan  elem -> q_forw -> q_back = elem -> q_back;
49169695Skan  elem -> q_back -> q_forw = elem -> q_forw;
50169695Skan}
51