[[seznam]]
 
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.
 
seznam.txt · Last modified: 2013/12/10 17:02 by 147.32.8.115
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki