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.