program LiTe;

{ Listen-Test! }

uses
   LinkedList;

var
   l, m, n : PList;
   lel	   : PList;
   pin	   : ^LongInt;
   Index   : LongInt;

begin
   l := nil;
   m := nil;

   { Erzeugen der ersten Liste }
   for Index := 10 downto 1 do
   begin
      New(pin);
      pin^ := Index;
      Cons(pin,l);
   end;

   { Erzeugen der zweiten Liste }
   for Index := 110 downto 100 do
   begin
      New(pin);
      pin^ := Index;
      Cons(pin,m);
   end;

   { Konkatenieren der Listen }
   ConcatR(l,m);

   { Iterieren der Liste zwecks Ausgabe }
   n := l;
   while n <> nil do
   begin
      pin := n^.Data;
      Write(pin^,' ');
      n := n^.Next;
   end;
   Writeln;

   { Abbilden (mappen) der Liste }
   m := nil;
   n := l;
   while n <> nil do
   begin
      New(pin);
      pin^ := 2 * LongInt(n^.Data^);
      New(lel);
      lel^.Data := pin;
      if m <> nil m^.Next := lel;
      m := l;
      n := n^.Next;
   end;

   { Ausgeben }
   Writeln('Mal zwei:');
   n := m;
   while n <> nil do
   begin
      pin := n^.Data;
      Write(pin^,' ');
      n := n^.Next;
   end;
   Writeln;

   { Nun kann die Ergebnisliste wieder freigegeben werden }
   while m <> nil do
   begin
      pin := m^.Data;
      Dispose(pin);
      n := m^.Next;
      Dispose(m);
      m := n;
   end;

   { Jetzt wird das Filtern demonstriert }
   n := l;
   while n <> nil do
   begin
      if LongInt(n^.Data^) mod 2 = 0 then
      begin
	 New(pin);
	 pin^ := LongInt(n^.Data^);
	 New(lel);
	 lel^.Data := pin;
	 if m <> nil m^.Next := lel;
	 m := lel;
      end;
      n := n^.Next;
   end;

   { Und weil's so schön war... }
   Writeln('Durch zwei teilbar?');
   n := m;
   while n <> nil do
   begin
      pin := n^.Data;
      Write(pin^,' ');
      n := n^.Next;
   end;
   Writeln;

   { Jetzt können die Liste und die Ergebnisliste freigegeben werden;
    dazu konkatenieren wir sie und geben dann alles auf einmal frei. }
   Concat(l,m);
   while l <> nil do
   begin
      pin := l^.Data;
      Dispose(pin);
      n := l^.Next;
      Dispose(l);
      l := n;
   end;
   
      
end.

