PROCEDURE InsertAppointment(VAR list: ListOfAppointments;
appointment: Appointment);
VAR
ptr, prev, element: Element;
BEGIN
NEW(element); element.appointment := appointment;
IF (list.first = NIL) OR
(Op.Compare(appointment.time,
list.first.appointment.time) < 0) THEN
(* insert element at the beginning of the list *)
element.next := list.first; list.first := element;
ELSE
prev := list.first; ptr := list.first.next;
WHILE (ptr # NIL) &
(Op.Compare(appointment.time,
ptr.appointment.time) >= 0) DO
prev := ptr; ptr := ptr.next;
END;
(* following holds now:
(ptr = prev.next) &
(appointment.time >= prev.appointment.time) &
((ptr = NIL) OR
(appointment.time < ptr.appointment.time))
we insert element between prev and ptr:
*)
element.next := ptr; prev.next := element;
END;
INC(list.length);
END InsertAppointment;
|