Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie lösche ich eine komplette Liste? (Pointer) (https://www.delphipraxis.net/10790-wie-loesche-ich-eine-komplette-liste-pointer.html)

Chewie 25. Okt 2003 14:12

Re: Wie lösche ich eine komplette Liste? (Pointer)
 
Die Liste wird komplett gelöscht: du prüfst, ob pFirst <> nil ist. pFirst ist genau dann nil, wenn an der Stelle kein Element sitzt.

Wusel 25. Okt 2003 14:16

Re: Wie lösche ich eine komplette Liste? (Pointer)
 
prima :bouncing4: :hello:

nochmal danke an euch :corky:

Wusel 25. Okt 2003 15:07

Re: Wie lösche ich eine komplette Liste? (Pointer)
 
hm ... jetzt bekomm ich den Fehler EInvalidPointer und er markiert mir die Zeile wo ich die Procedur DelWholeList aufrufe. Kann es damit zusammenhängen, dass ich nen record benutze?

Wusel 25. Okt 2003 17:15

Re: Wie lösche ich eine komplette Liste? (Pointer)
 
Also hier mal der Code eventuell seht ihr den Fehler

Delphi-Quellcode:
type
  PZahl = ^TZahl;
  TZahl = record
    Next : PZahl;
    iZahl : Integer;
    dwWann : Cardinal;
  end;

Var
  p,      // Hilfvariable, genauso wie p2
  pFirst, // gibt immer die 1. Zeile an
  p2 : PZahl;

procedure AddItem(iNumber : Integer; dwZeit : Cardinal);
begin
  New(p);                     // holt Speicher
  p^.iZahl := iNumber;        // setzt die Zahl in den Speicher
  p^.dwWann := dwZeit;
  p^.Next := nil;             // setzt letztes Element auf nil
  if pFirst = nil then        // setzt die erste Zeile, wenn noch nicht vorher gemacht
    pFirst := p
  else
  begin
    p2 := pFirst;
    while (p2^.Next <> nil) do // wandert an die letzte Zeile
      p2 := p2^.Next;
    p2^.Next := p;
  end;
end;

procedure DelWholeList;
begin
  while (pFirst <> nil) do  // es wird solange gelöscht, bis pFirst nil ist
  begin                     // und das ist wenn die Liste zu ende ist
    p := pFirst;
    pFirst := pFirst^.Next;
    Dispose(p);
  end;
end;
Wo liegt da der EInvalidPointer Fehler :?:

neolithos 26. Okt 2003 18:33

Re: Wie lösche ich eine komplette Liste? (Pointer)
 
:shock:

Man da muss ich mir ja noch eine Aufgabe ausdenken :wink: , wenn das so schnell geht...


Delphi-Quellcode:
Var
  p,      // Hilfvariable, genauso wie p2
  pFirst, // gibt immer die 1. Zeile an
  p2 : PZahl;
Hilfsvariablen (p, p2) sind bei mir niemals Global.

Delphi-Quellcode:
function GetLast : PZahl;
// wandert an die letzte Zeile
begin
  Result := pFirst;
  while (Result^.Next <> nil) do
    Result := Result^.Next;
end;

procedure AddItem(iNumber : Integer; dwZeit : Cardinal);
var pTmp : PZahl;
begin
  New(pTmp);                     // holt Speicher
  with pTmp^ do
    begin
      iZahl := iNumber;        // setzt die Zahl in den Speicher
      dwWann := dwZeit;
      pNext := nil; // setzt letztes Element auf nil
    end;            
  if pFirst = nil then        // setzt die erste Zeile, wenn noch nicht vorher gemacht
     pFirst := pTmp
  else
     GetLast^.pNext := pTmp;      
end;

procedure DelWholeList;
var pDel,
    pTmp : PZahl;
begin
  pTmp := pFirst;
  while (pTmp <> nil) do  // es wird solange gelöscht, bis pTmp nil ist
    begin                 // und das ist wenn die Liste zu ende ist
      pDel := pTmp;
      pTmp := pTmp^.pNext;
      Dispose(pDel);
    end;
end;
Übrigens Doku reicht aus.

Schick mir mal eine PM, damit ich genau weis wer Wusel ist :shock: .

negaH 27. Okt 2003 10:35

Re: Wie lösche ich eine komplette Liste? (Pointer)
 
Chewie hat den iterativen Algorithmus aufgezeigt, vielleicht hilft dir vom Verständnis her noch der rekursive Algo weiter.

Delphi-Quellcode:
procedure Free(P: PNode);
begin
  if P <> nil then
  begin
    Free(P.Next);
    Dispose(P);
  end;
end;
Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz