1*1debfc3dSmrg /* insque(3C) routines 2*1debfc3dSmrg This file is in the public domain. */ 3*1debfc3dSmrg 4*1debfc3dSmrg /* 5*1debfc3dSmrg 6*1debfc3dSmrg @deftypefn Supplemental void insque (struct qelem *@var{elem}, @ 7*1debfc3dSmrg struct qelem *@var{pred}) 8*1debfc3dSmrg @deftypefnx Supplemental void remque (struct qelem *@var{elem}) 9*1debfc3dSmrg 10*1debfc3dSmrg Routines to manipulate queues built from doubly linked lists. The 11*1debfc3dSmrg @code{insque} routine inserts @var{elem} in the queue immediately 12*1debfc3dSmrg after @var{pred}. The @code{remque} routine removes @var{elem} from 13*1debfc3dSmrg its containing queue. These routines expect to be passed pointers to 14*1debfc3dSmrg structures which have as their first members a forward pointer and a 15*1debfc3dSmrg back pointer, like this prototype (although no prototype is provided): 16*1debfc3dSmrg 17*1debfc3dSmrg @example 18*1debfc3dSmrg struct qelem @{ 19*1debfc3dSmrg struct qelem *q_forw; 20*1debfc3dSmrg struct qelem *q_back; 21*1debfc3dSmrg char q_data[]; 22*1debfc3dSmrg @}; 23*1debfc3dSmrg @end example 24*1debfc3dSmrg 25*1debfc3dSmrg @end deftypefn 26*1debfc3dSmrg 27*1debfc3dSmrg */ 28*1debfc3dSmrg 29*1debfc3dSmrg 30*1debfc3dSmrg struct qelem { 31*1debfc3dSmrg struct qelem *q_forw; 32*1debfc3dSmrg struct qelem *q_back; 33*1debfc3dSmrg }; 34*1debfc3dSmrg 35*1debfc3dSmrg 36*1debfc3dSmrg void insque(struct qelem * elem,struct qelem * pred)37*1debfc3dSmrginsque (struct qelem *elem, struct qelem *pred) 38*1debfc3dSmrg { 39*1debfc3dSmrg elem -> q_forw = pred -> q_forw; 40*1debfc3dSmrg pred -> q_forw -> q_back = elem; 41*1debfc3dSmrg elem -> q_back = pred; 42*1debfc3dSmrg pred -> q_forw = elem; 43*1debfc3dSmrg } 44*1debfc3dSmrg 45*1debfc3dSmrg 46*1debfc3dSmrg void remque(struct qelem * elem)47*1debfc3dSmrgremque (struct qelem *elem) 48*1debfc3dSmrg { 49*1debfc3dSmrg elem -> q_forw -> q_back = elem -> q_back; 50*1debfc3dSmrg elem -> q_back -> q_forw = elem -> q_forw; 51*1debfc3dSmrg } 52