Einzelnen Beitrag anzeigen

Meniskusschaden

Registriert seit: 1. Apr 2006
27 Beiträge
 
#5

Re: Hilfe bei doppelter verkettete Liste

  Alt 2. Nov 2006, 16:47
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.
  Mit Zitat antworten Zitat