Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ein item einer verketteten liste hinzufügen (https://www.delphipraxis.net/36389-ein-item-einer-verketteten-liste-hinzufuegen.html)

Pseudemys Nelsoni 19. Dez 2004 13:53


ein item einer verketteten liste hinzufügen
 
hoi,

ich versuche mit folgendem ein item in meine verkettete liste hinzuzufügen:

Delphi-Quellcode:
procedure TServer.ClientConnect(Sender: TObject; ASocket: TCustomWinSocket);
var
  Temp: PUserItem;
  User: PUserItem;
begin
  New(User);
  User^.Socket := ASocket;
  if FUserNode = nil then
    FUserNode := User
  else
  begin
    Temp := FUserNode;
    while (Temp^.next <> nil) do
      Temp := Temp^.next;
    Temp^.next := User;
  end;
end;

FUserNode ist der anker der liste. "User" das neue item.

nun (ich weiss nicht ob das so ist wenn bereits ein item in der liste ist oder wenn es das erste ist) bekomme ich bei meiner while schleife eine access violation...

ist an ihr irgendwas falsch? ich gehe doch nur durch bis zum letzten item und füge das neue an... bzw versuch ich das

SirThornberry 19. Dez 2004 14:02

Re: ein item einer verketteten liste hinzufügen
 
Ist es beabsichtigt das du mit der Variablen "Temp" im Speicher von FUserNode rumänderst? Und warum nimmst du nicht einfach TList oder leitest davon ab, dann musst du das mit dem "Next" etc. nicht mehr machen, man muss das rad ja nicht jedes mal neu erfinden.

Chewie 19. Dez 2004 14:04

Re: ein item einer verketteten liste hinzufügen
 
Zitat:

Zitat von SirThornberry
Und warum nimmst du nicht einfach TList oder leitest davon ab, dann musst du das mit dem "Next" etc. nicht mehr machen, man muss das rad ja nicht jedes mal neu erfinden.

Zum was-weiß-ich-wievielten Mal: TList ist keine verkettete Liste! :roll:

Pseudemys Nelsoni 19. Dez 2004 14:05

Re: ein item einer verketteten liste hinzufügen
 
Zitat:

Ist es beabsichtigt das du mit der Variablen "Temp" im Speicher von FUserNode rumänderst?
jo, das ist die variable mit der ich mich von item zu item hangel

Hansa 19. Dez 2004 14:29

Re: ein item einer verketteten liste hinzufügen
 
Wie ist denn PUserItem deklariert ? Was ist FuserNode ? Und die Glaskugel sagt mir gerade, daß mit dem Temp und User irgendwas nicht stimmt, sie könne ohne Deklaration aber auch nichts damit anfangen. :mrgreen:

Pseudemys Nelsoni 19. Dez 2004 14:35

Re: ein item einer verketteten liste hinzufügen
 
wenn man weiss was verkettete listen sind, dann weiss man auch wie der typ PUserItem aussehen könnte :P :mrgreen:

Delphi-Quellcode:
PUserItem = ^TUserItem;

TUserItem = record
  Socket: TCustomWinSocket;
  Next: PUserItem;
end;

Hansa 19. Dez 2004 14:46

Re: ein item einer verketteten liste hinzufügen
 
Zitat:

Zitat von Pseudemys Nelsoni
könnte

Ja, das ist schon ein Unterschied zu "kann" und "weiß es". :lol: Und wenn du dich schickst, dann kriegst du ein Beispiel einer einfach verketteten Liste. :mrgreen:

Pseudemys Nelsoni 19. Dez 2004 14:47

Re: ein item einer verketteten liste hinzufügen
 
:mrgreen:


habs aber nun raus, ich musste beim erzeugen eines neues items den next zeiger auf NIL setzen, sollte das standardmässig nicht schon so sein?

Hansa 19. Dez 2004 14:56

Re: ein item einer verketteten liste hinzufügen
 
Zitat:

Zitat von Pseudemys Nelsoni
...sollte das standardmässig nicht schon so sein?

Nein. Trotzdem gut, Arbeit gespart, obwohl das Ding dann immer noch seltsam aussieht.. :lol:

Pseudemys Nelsoni 19. Dez 2004 15:04

Re: ein item einer verketteten liste hinzufügen
 
heisst das das wenn ich einen record habe der 50 membervariablen hat ich die ALLE initialisieren muss? oder reicht ein FillChar() ?

Hansa 19. Dez 2004 15:19

Re: ein item einer verketteten liste hinzufügen
 
Fillchar reicht normalerweise, aber eben nicht für die Liste selber. Nur für den Inhalt. Andernfalls wäre es keine verkettete Liste. Brauchst du die Listen überhaupt ? Ich bin immer froh, wenn ich sie nicht brauche. 8) Allerdins sind meine Listen lange fertig, funktionieren und ich kupfere sie immer bei mir selber ab. :mrgreen:

Robert_G 19. Dez 2004 15:23

Re: ein item einer verketteten liste hinzufügen
 
Zitat:

Zitat von SirThornberry
Ist es beabsichtigt das du mit der Variablen "Temp" im Speicher von FUserNode rumänderst? Und warum nimmst du nicht einfach TList oder leitest davon ab, dann musst du das mit dem "Next" etc. nicht mehr machen, man muss das rad ja nicht jedes mal neu erfinden.

Weil TList einen array verwendet. ;)
Nachtrag: Sorry Chewie, unter all den bunten Avataren bist du untergangen. :duck:

@PseudoDings
Ich führe immer einen Tail und einen Head in meiner Liste. Dadurch muss ich nicht immer das Ende suchen, bevor ich etwas einfügen will.
Ein Knoten könnte so aussehen:
Delphi-Quellcode:
   type TSomeListNode = class
   private
      fList    : TSomeList;
      fNext    : TSomeListNode;
      fPrevious : TSomeListNode;
   public
      Data     : SomeDataType;
      constructor Create(); overload;
      constructor Create(aData : SomeDataType); overload;
      destructor Destroy(); override;
   end;
Und das Add der Liste so:
Delphi-Quellcode:
procedure TSomeList.Add(aP: TSomeListNode);
begin
   if fEnumerating then
      raise EMutatingEnumerationException.Create('You can not add nodes to an enumerating list.');

   aP.fList := Self;

   if fHead = nil then
   begin
      fHead := aP;
      fTail := aP;
   end
   else
   begin
      aP.fPrevious := fTail;
      fTail.fNext := aP;
      fTail := aP;
   end;
   inc(fCount);
end;

Pseudemys Nelsoni 19. Dez 2004 15:40

Re: ein item einer verketteten liste hinzufügen
 
danke =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:31 Uhr.

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