Zitat von
Preddy2005:
Hallo mal wieder!
Bräuchte mal ein wenig Hilfe...
Und zwar geht es um Erklärungen in Bezug auf eine doppelte verkettete Liste.
Delphi-Quellcode:
procedure TForm1.btnFirstClick(Sender: TObject);
begin
New(pNeuer_Wert); // Neues Element erzeugen
pNeuer_Wert^.Zahl := 1; // Zahl auf den Wert eins setzen
PNeuer_Wert^.Next := nil; // Next - Zeiger zeigt auf kein Element
PNeuer_Wert^.Prev := nil; // Prev - Zeiger zeigt auf kein Element
pErster_Wert := pNeuer_Wert; // Erster Wert Zeiger zeigen auf NIL
pVorheriger_Wert := pNeuer_Wert; // Zweiter Wert Zeiger zeigen auf NIL
btnFirst.Enabled := false; // Knopf ausblenden
end;
{*******************************************************************************
*******************************************************************************}
procedure TForm1.btnNextClick(Sender: TObject);
Var
Temp_Zahl : Integer; // Fürs Inkrementieren der Zahl
begin
if pNeuer_Wert = nil then btnFirst.Click; // Wenn neue Wert ins Nichts zeigt, dann
Temp_Zahl := pNeuer_Wert^.Zahl;
new(pNeuer_Wert); // Neuen Wert Speicher anlegen
pNeuer_Wert.Zahl := Temp_Zahl + 1;
pNeuer_Wert^.Prev := pVorheriger_Wert; // Neue Wert am Ende zeigt auf das vorherige Element
pNeuer_Wert^.Next := nil; // Neue Wert zeigt auf NIL
pVorheriger_Wert^.Next := pNeuer_Wert; // Zeiger des vorherigen Elementes muss auf das neu erzeugte Element gesetzt werden
pVorheriger_Wert := pNeuer_Wert; // ?? pVorherigerWert wird auf Listenende gesetzt
btnRead.Click;
end;
{*******************************************************************************
*******************************************************************************}
procedure TForm1.btnReadClick(Sender: TObject);
begin
if pVorheriger_Wert = nil then Exit; //?? Zielsetzung unklar. Notausgang für undefinierte Situation oder Behandlung einer leeren Liste?
lbElemente.Clear;
pAktueller_Wert := pVorheriger_Wert; //?? pAktueller_Wert wird auf Listenende gesetzt
While pAktueller_Wert^.Prev <> nil Do //?? Die Schleife wird durchlaufen, bis es keinen Vorgänger mehr gibt
Begin // Solange letzter Wert ungleich nil,
lbElemente.Items.Add(IntToStr(pAktueller_Wert^.Zahl));
lbSpeicheradressen.Items.Add('');
lbSpeicheradressen.Items.Add(Format('Next : x%x', [Integer(pAktueller_Wert^.Next)]));
lbSpeicheradressen.Items.Add(Format('Prev : x%x', [Integer(pAktueller_Wert^.Prev)]));
pAktueller_Wert := pAktueller_Wert.Prev; // Letzter Wert dem aktuellen Wert zuweisen
End;
end;
{*******************************************************************************
*******************************************************************************}
Alles was ich mit / ?? Markiert habe, ist mir nicht ganz klar.
Ich habe das Grundprinzip verstanden, aber ich verstehe diese Zeilen nicht ganz. Wenn mir jemand verständlich erklären könnte, wieso man diese Zeilen so schreiben muss oder wieso sie so stehen müssen, dann wäre ich euch schon sehr dankbar.
Danke schonmal im voraus für die Hilfe.
Gruß
Matthias
Ich finde die Implementierung auch nicht so toll. Die Idee ist wohl, dass neue Werte immer an das Listenende gehängt werden und pVorheriger_Wert nach jeder Operation auf das Listenende zeigt. Ich habe die von Dir markierten Bereiche oben kommentiert.