|  | /* insque(3C) routines | 
|  | This file is in the public domain.  */ | 
|  |  | 
|  | /* | 
|  |  | 
|  | @deftypefn Supplemental void insque (struct qelem *@var{elem}, @ | 
|  | struct qelem *@var{pred}) | 
|  | @deftypefnx Supplemental void remque (struct qelem *@var{elem}) | 
|  |  | 
|  | Routines to manipulate queues built from doubly linked lists.  The | 
|  | @code{insque} routine inserts @var{elem} in the queue immediately | 
|  | after @var{pred}.  The @code{remque} routine removes @var{elem} from | 
|  | its containing queue.  These routines expect to be passed pointers to | 
|  | structures which have as their first members a forward pointer and a | 
|  | back pointer, like this prototype (although no prototype is provided): | 
|  |  | 
|  | @example | 
|  | struct qelem @{ | 
|  | struct qelem *q_forw; | 
|  | struct qelem *q_back; | 
|  | char q_data[]; | 
|  | @}; | 
|  | @end example | 
|  |  | 
|  | @end deftypefn | 
|  |  | 
|  | */ | 
|  |  | 
|  |  | 
|  | struct qelem { | 
|  | struct qelem *q_forw; | 
|  | struct qelem *q_back; | 
|  | }; | 
|  |  | 
|  |  | 
|  | void | 
|  | insque (struct qelem *elem, struct qelem *pred) | 
|  | { | 
|  | elem -> q_forw = pred -> q_forw; | 
|  | pred -> q_forw -> q_back = elem; | 
|  | elem -> q_back = pred; | 
|  | pred -> q_forw = elem; | 
|  | } | 
|  |  | 
|  |  | 
|  | void | 
|  | remque (struct qelem *elem) | 
|  | { | 
|  | elem -> q_forw -> q_back = elem -> q_back; | 
|  | elem -> q_back -> q_forw = elem -> q_forw; | 
|  | } |