180183Sjkh/* insque(3C) routines
280183Sjkh   This file is in the public domain.  */
380183Sjkh
480183Sjkh/*
580183Sjkh
680183Sjkh@deftypefn Supplemental void insque (struct qelem *@var{elem}, @
780183Sjkh  struct qelem *@var{pred})
880183Sjkh@deftypefnx Supplemental void remque (struct qelem *@var{elem})
980183Sjkh
1080183SjkhRoutines to manipulate queues built from doubly linked lists.  The
1180183Sjkh@code{insque} routine inserts @var{elem} in the queue immediately
1280183Sjkhafter @var{pred}.  The @code{remque} routine removes @var{elem} from
1380183Sjkhits containing queue.  These routines expect to be passed pointers to
1480183Sjkhstructures which have as their first members a forward pointer and a
1580183Sjkhback pointer, like this prototype (although no prototype is provided):
1680183Sjkh
1780183Sjkh@example
1880183Sjkhstruct qelem @{
1980183Sjkh  struct qelem *q_forw;
2080183Sjkh  struct qelem *q_back;
2180183Sjkh  char q_data[];
2280183Sjkh@};
2380183Sjkh@end example
2480183Sjkh
2580183Sjkh@end deftypefn
2680183Sjkh
2780183Sjkh*/
28221466Snwhitehorn
29264995Snwhitehorn
30264995Snwhitehornstruct qelem {
31294980Ssmh  struct qelem *q_forw;
32264995Snwhitehorn  struct qelem *q_back;
33264995Snwhitehorn};
34264995Snwhitehorn
35264995Snwhitehorn
36264995Snwhitehornvoid
37264995Snwhitehorninsque (struct qelem *elem, struct qelem *pred)
38264995Snwhitehorn{
39264995Snwhitehorn  elem -> q_forw = pred -> q_forw;
40264995Snwhitehorn  pred -> q_forw -> q_back = elem;
41264995Snwhitehorn  elem -> q_back = pred;
42264995Snwhitehorn  pred -> q_forw = elem;
4380183Sjkh}
4480183Sjkh
4580183Sjkh
4680183Sjkhvoid
4780183Sjkhremque (struct qelem *elem)
4880183Sjkh{
4980183Sjkh  elem -> q_forw -> q_back = elem -> q_back;
5080183Sjkh  elem -> q_back -> q_forw = elem -> q_forw;
5180183Sjkh}
5280183Sjkh