Einzelnen Beitrag anzeigen

Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#22
  Alt 5. Jan 2003, 12:35
Hallo,
mit deinem Wissen über Pointer, kannst du nun auch einfache verkette Listen erstellen. Wichtig für Ketten sind die While Schleifen, die du bei fast allen Aktionen brauchst (z.B beim Einfügen, Löschen und durchsuchen der Kette)

Delphi-Quellcode:
Type
   pElementZeiger := ^tElement;
   tElement := object
                 next :tElementZeiger;
                 inhalt: integer;
               end;

Var
kopf : pElementZeiger; //Globale Variable die immer auf das erste Element der Liste zeigt.
Einfügen in die Liste geht dann z.B so:

Delphi-Quellcode:
Procedure InsertNewElement (content : integer);
Var hilf, newelement : pElementZeiger;
Begin
hilf := kopf^.next;
while (hilf<>nil) do
 hilf := hilf^.next; //mit der Schleife kommt man ans Ende der Liste, wo dann das neue Element eingefügt wird

new(newelement);
newelement^.inhalt := content;
newelement.^next := nil;
hilf^.next := newelement;
end;
Das Ausgeben der Liste ist genauso einfach:
Delphi-Quellcode:
Procedure ShowList;
Var hilf :pElementZeiger;
Begin
hilf := kopf;
while (hilf^.next <> nil) do
 begin
  memo1.lines.Add (inttostr(hilf^.inhalt));
  hilf := hilf^.next;
 end;
end;
Suchen funktioniert ebenfalls mit der Schleife:
Delphi-Quellcode:
Procedure FindElement (content : integer);
Var hilf : pElementZeiger;
Begin
hilf := kopf;
while (hilf <> nil) do
 begin
  if hilf^.inhalt = content then
   showmessage('Element gefunden: ' + inttostr(hilf^.inhalt));
   hilf := hilf^.next;
 end;
end;
Das löschen eines Elementes in der Liste ist schon komplizierter, da man darauf achten muss, dass die Zeiger später wieder auf die richtigen Elemente Zeigen und die Kette nicht auseinander bricht.

Delphi-Quellcode:
Procedure LoescheElement (content : integer);
Var hilf1, hilf2 : pelementZeiger;
Begin
Hilf1 := Kopf;
If Kopf^.inhalt = content then
 begin
  Kopf := Kopf^.next;
  Dispose (hilf1);
 end
else
 Repeat
  hilf2 := hilf1; hilf1 := hilf1^.next;
 Until (Hilf1 = nil) or (Hilf1^.inhalt = content);

If Hilf1 <> nil then
 begin
  Hilf2^.next := Hilf1^.next;
  Dispose (Hilf1);
 end;
end;
So, ich denke das ist schonmal ein kleiner Überblick wie man mit einfach verketten Listen arbeitet. Doppelt verkette Listen haben nicht nur einen Zeiger auf das Nachfolge Elemnet, sondern auch einen Zeiger auf ihren Vorgänger. Dadurch werde Opperationen wie z.B das Löschen einfacher.
Die Quelltexte können Fehler beinhalten, da ich sie eben so aus dem Kopf aufgeschrieben habe. Ist schon wieder etwas her wo ich mich mit Listen beschäftigen musste.

Mfg Salomon
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat