Einzelnen Beitrag anzeigen

Preddy2005

Registriert seit: 27. Nov 2005
Ort: Mettmann
38 Beiträge
 
#8

Re: Hilfe bei doppelter verkettete Liste

  Alt 7. Nov 2006, 10:32
Hallo nochmal!

Ich habe mal ein wenig ausprobiert und habe den Code umgeschrieben. Allerdings ist in dem Code ein Fehler drinne... Denke ich zumindest. Habe auch keine Möglichkeit gefunden, wie ich den Fehler finden kann. Auch mit Debuggen finde ich nix. Ich stelle mal den Code hier rein. Vielleicht kann mir ja jemand helfen.
Delphi-Quellcode:
Type
  PWert = ^TWert;
  TWert = Record
             Zahl : Integer; // Speichert eine Zahl ab
             Prev : PWert; // Zeiger auf vorheriges Element
             Next : PWert; // Zeiger auf nächstes Element
           End;

var
 pLetztes_Element : pWert; // Zeiger auf das letzte Element
 pListen_Anfang : pWert; // Listenanfang
 pElement_A : pWert; // Listenelement zum verketten
 pElement_B : pWert; // Listenelement zum verketten

implementation

{$R *.DFM}

{*******************************************************************************
*******************************************************************************}


procedure TForm1.btnFirstClick(Sender: TObject);
begin
 pListen_Anfang := nil; // Leere Liste
 New(pElement_A); // Neues Listenelement erzeugen
 pListen_Anfang := pElement_A; // Listenanfang und erste Element verknüpfen
 pListen_Anfang.Next := nil; // Kein Nachfolgerelement
 pListen_Anfang.Prev := nil; // Kein Vorgängerelement
 pListen_Anfang.Zahl := 1; // Wert zuweisen
 pLetztes_Element := pListen_Anfang; // Listenanfang ist auch zugleich das letzte Element
 btnRead.Click; // Werte im Memo ausgeben
end;

{*******************************************************************************
*******************************************************************************}


procedure TForm1.btnNextClick(Sender: TObject);
Var
  Temp : Integer; // Hilfsvariable

begin
  if pLetztes_Element = nil then btnFirst.Click; // Liste ist leer, erste Listenelement erzeugen

 // pElement_A := pLetztes_Element; // Letztes Element ist ein globaler Zeiger auf das letzte Element
  Temp := pElement_A^.Zahl; // Zahl zwischenspeichern
  pElement_A^.Zahl := Temp + 1; // Zahl erhöhen und zuweisen
  new(pElement_B); // Neues Listenelement erzeugen
  pElement_b.next := nil; // Kein Nachfolgeelement vorhanden
  pElement_b.prev := pElement_A; // Vorgänger des Elementes ist A
  pElement_A.next := pElement_B; // Der Nachfolger von A ist Element B
  pLetztes_Element := pElement_B; // Globale Zeiger wird auf das Listende gesetzt
  btnRead.Click; // Elemente im Memo ausgeben
end;

{*******************************************************************************
*******************************************************************************}


procedure TForm1.btnReadClick(Sender: TObject);
begin

 lbElemente.Clear; // Memo leeren
 pLetztes_Element := pListen_Anfang; // Erste Element ist immer das letzte Element

 if pLetztes_Element = nil then exit; // Liste ist leer, verlassen
  while pLetztes_Element^.Next <> nil do // Solange nicht das Listenende erreicht worden ist,
  begin
   lbElemente.Items.Add(IntToStr(pLetztes_Element^.Zahl)); // Zahl in die Listbox eintragen
   pLetztes_Element := pLetztes_Element^.Next; // Zeiger auf das nächste Listenelement verweisen
  end;

end;

{*******************************************************************************
*******************************************************************************}


procedure TForm1.btnDeleteClick(Sender: TObject);
begin
 If pListen_Anfang = nil then exit;

 // Noch zu ergänzen
end;

{*******************************************************************************
*******************************************************************************}


procedure TForm1.btnAnAnfangClick(Sender: TObject);

var Editfeld_Zahl : String;
    Wert_Aus_Editfeld : Integer;

begin

 Editfeld_Zahl := edtWertamAnfangEinfuegen.Text; // Wert vor Konvertierung auf Leerwert prüfen
 if Editfeld_Zahl = 'then exit // Wenn Wert leer, dann verlassen
  else Wert_Aus_Editfeld := StrToInt(edtWertamAnfangEinfuegen.Text); // Ansonsten Umkonvertierung durchführen

 if pListen_Anfang = nil then exit; // Keine Liste erzeugt, verlassen

 new(pElement_A); // Neues Listenelement erzeugen
 pElement_A^.Zahl := Wert_Aus_Editfeld;
 pListen_Anfang^.Next := pElement_A; // Listenanfang verweist auf das erzeugt Element
 pElement_A.Next := pElement_B; // Das erzeugte Element verweist auf B
 btnRead.Click; // Werte auslesen
end;

{*******************************************************************************
*******************************************************************************}


end.
Komme aber immer besser mit der Logik klar.. Dank euch. Hoffe hier kann mir nochmal jemand helfen...

Gruß Matthias
  Mit Zitat antworten Zitat