#1 09.10.2008 15:56:03

Dreamworld
UltraMember
Ort: Karlsruhe
Registriert: 06.12.2005
Beiträge: 368

Liste

Hi,
ich hab grad Probleme mit ner einfach verketteten Liste.
Und zwar weiß ich nicht, wie ich die Liste auslese.

Code: delphi

 
 pdaten = ^tdaten;
  tdaten = record
    such  : string;
    next   : pdaten;
  end;


Das Einfügen von neuen Elemennten is ok, nur wie les ich am Ende von Anfang an alles aus? Wie greif ich auf das erste Element zu? Steh völlig aufm Schlauch.

Grüße

Offline

 

#2 09.10.2008 16:18:39

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Liste

Na an sich müsstest du dir den Kopf der Liste irgendwo speichern. Wenn du dann alles auslesen möchtest, dann nimmst du dir einen Pointer vom Typ pdaten und lässt ihn auf das erste Element zeigen. Dann kannst du übers dereferenzieren den string auslesen und danach dem Pointer seinen eigenen next Pointer zuweisen, dadurch zeigt er dann auf das nächste Element. Dies machst du dann so lange bis er am Ende angelangt ist wo er dann auf nil zeigen müsste und fängst dies dann ab. Du müsstest nur beim Einfügen den Kopf-Pointer verändern oder am Ende anfügen, damit du nicht den Anfang verlierst.

Gruß Gnietschow


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#3 10.10.2008 08:14:27

Dreamworld
UltraMember
Ort: Karlsruhe
Registriert: 06.12.2005
Beiträge: 368

Re: Liste

Ja so dacht ich auch, aber wie speicher ich den Head ab? Ich müsste ja theoretisch die Adresse speichern, also in nem Pointer? Und dann muss ich der neuen Variable vom Typ PDaten diese Adresse zuweisen, wenn ich auslesen möchte?
Ich weiß nur nicht wie ich das anstelle smile

Offline

 

#4 10.10.2008 08:41:58

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Liste

Wo ist das Problem? Es gibt eine fixe Variable vom Typ PDaten, nennen wir sie einfach mal pRootnode. Wenn die Liste leer ist, so ist pRootNode = nil; beim ersten Element machst du ein new(pRootNode) und kannst anschliessend dem String beliebige Zeichenfolgen zuweisen. Willst du ein weiteres Element einfügen, so wäre das prinzipiell über new(pRootNode^.next), anschliessend kannst du dann pRootNode^.next.such wieder auf den String zugreifen - so geht es weiter.

Wenn du jetzt eine Liste mit vielen Elementen hast und beispielsweise alles ausgeben willst, gehst du wie folgt vor:

Code:

var
  ptr : PDaten;
begin
  ptr := pRootNode;

  while(ptr <> nil) do
  begin
    listbox1.items.add(ptr^.such);
    ptr := ptr^.next;
  end;

end;

Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#5 10.10.2008 10:04:56

Dreamworld
UltraMember
Ort: Karlsruhe
Registriert: 06.12.2005
Beiträge: 368

Re: Liste

Jetzt hab ich den Beitrag gelöscht...wollt doch editieren (das passiert, wenn man nicht liest smile )

Das Problem ist, dass ich mich mit Pointern nicht auskenn.
Danke für das Beispiel. Elemente kann ich auch so einfügen, hab ich mir überlegt:

Code: delphi

 
var ele:pdaten;

 ele:=root;
  while (ele^.next <> nil) do
  begin
    ele:=ele^.next;
  end;
  new(ele^.next);
  ele^.next.such:='hallo3';
  ele^.next.next:=nil;

Offline

 

#6 10.10.2008 10:08:55

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Liste

Ja, das ist die korrekte Vorgangsweise - hat allerdings auch zur Folge, dass du für das Einfügen Eines Elements einen Aufwand von Theta(n) hast, d.h. das Einfügen wird umso langsamer je mehr Elemente du in der Liste hast. Sinnvoll ist daher, dass man nicht nur eine root node speichert sondern auch einen pointer hat der auf das letzte Element zeigt, somit kannst du diesen pointer verwenden um ein neues Element einzufügen anstatt immer durch die ganze Liste iterieren zu müssen; das reduziert den Aufwand auf O(1).


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#7 10.10.2008 10:15:05

Dreamworld
UltraMember
Ort: Karlsruhe
Registriert: 06.12.2005
Beiträge: 368

Re: Liste

Alles klar.

Offline

 

#8 10.10.2008 11:24:57

DragonFlyOfGold
ProMember
Ort: Berlin
Registriert: 09.11.2005
Beiträge: 139

Re: Liste

Oder man fügt die Elemente am Anfang ein, dann hat man nur den Mehraufwand, dass man den pRootNode Pointer neu setzen muss. Also neuen Eintrag erstellen, nextPointer:=pRootNode; und PRootNode:=@NeuErstelltenNode;

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson