tholm@uvicctr.UUCP (Terrence W. Holm) (09/21/88)
EFTH MINIX report #48 - September 1988 - insque(3) & remque(3)
There follows an implementation of insque(3) and remque(3)
for MINIX. Please consider this public domain software.
A "man" page is included.
NOTE: These subroutines are not available on all UNIX systems.
----------------------------------------------------------
echo x - insque.3
gres '^X' '' > insque.3 << '/'
XSUBROUTINES
X insque(3) - queue manipulation
X
XINVOCATION
X struct queue
X {
X struct queue *q_next;
X struct queue *q_last;
X . . .
X };
X
X insque( element, where )
X struct queue *element;
X struct queue *where;
X
X remque( element )
X struct queue *element;
X
XEXPLANATION
X Insque(3) and remque(3) are used to insert and remove elements
X from a circular doubly linked list. <element> must point to a
X structure which contains room for two pointers, as in the
X "struct queue" prototype.
X
X Insque(3) inserts <element> after the entry <where>, remque(3)
X removes the <element>. A list starts with a header which has
X both q_next and q_last pointing to itself.
X
XEXAMPLE
X struct word
X {
X struct word *q_next, *q_last;
X char *message;
X };
X
X main()
X {
X struct word *header, *first_element, *last_element;
X
X /* Construct a queue header. */
X
X header = (struct word *) malloc( sizeof(struct word) );
X header->q_next = header->q_last = header;
X header->message = "Header";
X
X /* Insert an element at the front of the queue. */
X
X first_element = (struct word *) malloc( sizeof(struct word) );
X first_element->message = "Front";
X
X insque( first_element, header );
X
X /* Insert an element at the tail of the queue. */
X
X last_element = (struct word *) malloc( sizeof(struct word) );
X last_element->message = "Tail";
X
X insque( last_element, header->q_last );
X
X /* Remove an element. */
X
X remque( first_element );
X
X /* The queue is now "Header" <=> "Tail". */
X }
X
XREFERENCES
X VAX Architecture Handbook
/
echo x - insque.c
gres '^X' '' > insque.c << '/'
X/* insque(3) and remque(3)
X *
X * Author: Terrence W. Holm Sep. 1988
X */
X
Xstruct queue
X {
X struct queue *q_next;
X struct queue *q_last;
X };
X
X
Xinsque( element, where )
X register struct queue *element;
X register struct queue *where;
X
X {
X register struct queue *next = where->q_next;
X
X element->q_next = next;
X element->q_last = where;
X next->q_last = element;
X where->q_next = element;
X }
X
X
Xremque( element )
X register struct queue *element;
X
X {
X register struct queue *next = element->q_next;
X register struct queue *last = element->q_last;
X
X last->q_next = next;
X next->q_last = last;
X }
/
----------------------------------------------------------
Edwin L. Froese
uw-beaver!ubc-cs!mprg!handel!froese
Terrence W. Holm
uw-beaver!uvicctr!tholm