Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer auf das erste Element einer Liste (https://www.delphipraxis.net/3245-pointer-auf-das-erste-element-einer-liste.html)

czapie 2. Mär 2003 20:13


Pointer auf das erste Element einer Liste
 
AAaaah Hilfe!

Ich weiß hier im Forum wurden Listen schon ein paar mal behandelt, aber ich bin nicht so richtig schlau daraus geworden.
Mein Problem ist das ich nicht weiß wie ich zum Anfang einer Liste komme, also den Pointer auf das erste Element setze, bitte helft mir!
Sonst müßt ihr morgen ein Forum-Mitglied zu Grabe tragen, dass von einem wutschaubenden Informatiklehrer erschlagen wurde,

danke,

Czapie.

[edit=Daniel B]Titel geändert. Bitte das nächste mal etwas aussagekräftiges eingeben, nicht Hiiilfe! Ausserdem zweites Posting gelöscht! MfG Daniel B.[/edit]

Touchdown 2. Mär 2003 21:39

Was für eine Liste?

jbg 2. Mär 2003 21:54

Er er von "den Pointer auf das erste Element setze" schreibt, muss man wohl von verketteten Listen ausgehen. Nun kommt es noch daran an, ob eine einfach oder mehrfach verkettete Liste gemeint ist.

Einfach:
Delphi-Quellcode:
type
  PListe = ^TListe;
  TListe = record
    Next: PListe;
    Data: Integer;
  end;

var
  Root: PListe; // Zeigt immer auf das erste Element

procedure AddItem(Data: Integer);
var p, Node: PListe;
begin
  New(p); // neues Element erzeugen
  p^.Next := nil; // wird als letztes Element in die Liste eingefügt
  p^.Data := Data;

  if Root = nil then
  begin
    // noch nichts in der Liste, dann wird die Liste das neue Element selbst
    Root := p;
  end
  else
  begin
   // Neues Element ganz hinten hinzufügen. Dazu muss die gesamte
   // Liste durchlaufen werden
    Node := Root;
    while (Node^.Next <> nil) do Node := Node^.Next;

    Node^.Next := p; // Dem letzten Element als nächstes das neue hinzufügen
  end;
end;

procedure DeleteItem(Data: Integer);
var Node, PreNode: PListe;
begin
  if Root = nil then Exit; // nichts was man löschen könnte vorhanden

  if Root^.Data = Data then
  begin
   // Das 1. Element muss gelöscht werden
    Node := Root^.Next; // Zeiger auf das nächste Element sichern
    Dispose(Root);     // 1. Element freigeben
    Root := Node;      // und neues 1. Element festlegen
  end
  else
  begin
    PreNode := Root; // vorheriges Element
    Node := Root^.Next; // zu prüfendes Element
    while (Node <> nil) do
    begin
      if Node^.Data = Data then
      begin
        PreNode^.Next := Node^.Next; // Node aus der Liste entfernen
        Dispose(Node);              // Node freigeben
        Break;                      // und Löschvorgang beenden
      end;

      PreNode := Node;
      Node := Node^.Next;
    end;
  end;
end;

czapie 3. Mär 2003 08:28

danke
 
Oh Mann,

danke, ich glaub ich habs schwer verwundet überlebt,

Czapie.

DataCool 5. Mär 2003 09:53

Hi,

schau Dir mal das Object TLIst in der Hilfe an !
Das ist eine fertige Zeigerliste, wo Du jeden X-belibigen Zeiger ablegen kannst. Näturlich mußt DU Dich noch um das reservieren und freigeben vom Speicher kümmern.

WEnn Du Objekte in einer Liste speichern möchtest, empfehle ich Dir TObjectList, welche sich auch noch um die Speicherverwaltung kümmert.

Data


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.

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