program seznam; uses list; var queue : DList; p : ^ block; begin Init (queue); InsertLast (queue, 'abc'); InsertLast (queue, 'def'); InsertLast (queue, 'klm'); InsertAfter (queue, queue.first, 'something'); InsertAfter (queue, queue.last, 'last'); InsertBefore (queue, queue.first, 'first'); InsertBefore (queue, queue.last, 'before last'); Remove (queue, queue.first); Remove (queue, queue.last^.prev); Remove (queue, queue.last); p := queue.first; while p <> nil do begin writeln (p^.data); p := p^.next; end; readln; end. unit List; interface type content = string; block = record data : content; prev , next : ^ block; end; DList = record first: ^ block; last: ^ block; end; procedure Init (var seznam: DList); procedure InsertFirst (var seznam: DList ; value: content); procedure InsertLast (var seznam: DList ; value: content); procedure InsertBefore (var seznam: DList; target:^block; value:content); // procedure InsertAfter (var seznam: DList; target:^block; value:content); // function Find (var seznam: DList; value:content) : ^ block; // procedure Remove (var seznam: DList; target:^block); implementation procedure Init (var seznam: DList); begin seznam.first := nil; seznam.last := nil; { with seznam do begin first := nil; last := nil; end; } end; procedure InsertLast (var seznam: DList ; value: content); var p : ^ block; begin new (p); p^.data := value; p^.prev := nil; p^.next := nil; if seznam.first = nil then begin seznam.first := p; seznam.last := p; end else begin seznam.last^.next := p; p^.prev := seznam.last; seznam.last := p; end; end; procedure InsertFirst (var seznam: DList ; value: content); var p : ^ block; begin new (p); p^.data := value; p^.prev := nil; p^.next := nil; if seznam.first = nil then begin seznam.first := p; seznam.last := p; end else begin seznam.first^.prev := p; p^.next := seznam.first; seznam.first := p; end; end; procedure InsertAfter (var seznam: DList; target:ref; value:content); var p : ^ block; begin assert (target <> nil); new (p); p^.data := value; p^.prev := target; {1} p^.next := target^.next; {2} target^.next := p; {3} if p^.next = nil then seznam.last := p {4a} else p^.next^.prev := p {4b} end; procedure InsertBefore (var seznam: DList; target:ref; value:content); var p : ^ block; begin assert (target <> nil); new (p); p^.data := value; p^.prev := target^.prev; p^.next := target; target^.prev := p; if p^.prev = nil then seznam.first := p else p^.prev^.next := p end; procedure Remove (var seznam: DList; target:ref); begin assert (target <> nil); if target^.prev = nil then seznam.first := target^.next else target^.prev^.next := target^.next; if target^.next = nil then seznam.last := target^.prev else target^.next^.prev := target^.prev; dispose (target); end; end.