LinkedLists und Pointer

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

LinkedLists und Pointer

Beitrag von Lebostein »

Folgendes Codebeispiel: Ich erzeuge mir 4 Knoten in einer Knotenliste und lasse mir die Adressen der Listenelemente ausgeben. Danach entferne ich einige Knoten am Anfang und am Ende der Liste und füge neue hinzu und schaue mir wieder die Adressen an:

Code: Alles auswählen

Structure node
  posx.l
  posy.l
EndStructure

NewList node.node()

Procedure CreateNode(x, y)
  AddElement(node())
  node()\posx = x
  node()\posy = y
EndProcedure

;4 Knoten erzeugen
CreateNode(0,0)
CreateNode(4,0)
CreateNode(0,4)
CreateNode(4,4)

;Knoten ausgeben
ForEach node()
Debug Str(@node()) + " (" + Str(ListIndex(node())) + ") " + Str(node()\posx) + ";" + Str(node()\posy)
Next

;Knoten löschen und hinzufügen
Debug "----------"
FirstElement(node()): DeleteElement(node())
FirstElement(node()): DeleteElement(node())
FirstElement(node()): CreateNode(20,30)
LastElement(node()): CreateNode(40,99)
LastElement(node()): CreateNode(60,60)

;Knoten ausgeben
ForEach node()
Debug Str(@node()) + " (" + Str(ListIndex(node())) + ") " + Str(node()\posx) + ";" + Str(node()\posy)
Next
Die zwei Node(0;4) und Node(4;4) vom Anfang sind zwar jetzt auf einer anderen Listenposition, haben aber noch die gleichen Adresse. Meine Frage: ist dies nur zufällig so, weil ich hier nur sehr geringe Datenmengen im Speicher erzeuge oder bleiben Listenelemente generell an der Speicheradresse, an der sie erzeugt wurden? Anders gefragt: Können sich Listenelemente zur Laufzeit im Speicher dynamisch bewegen, wenn ich zum Beispiel einen großen Speicherbereich allociere oder sonstige Speicheraktionen durchführe?

Ich hoffe ich konnte mich verständlich ausdrücken :)
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Normalerweise bleiben die Elemente einer Linkedlist immer an dem Speicherort an dem sie erstellt wurden, da Änderungen sich immer nur auf die Next/Prev - Pointer der Elemente beziehen. Also es wird in einem Element geändert welches davor liegt und welches dahinter, da ein verschieben des ganzen Elements länger dauert.
Allerdings müsstest du aufpassen wenn du Proceduren benutzt die von Usern erstellt wurden. z.B. gibt es eine Sortierfunktion für Linkedlists (nicht die von mir) welche die Inhalte austauscht, Dann bleibt zwar das eigenliche Element am selben Platz, der Inhalt stimmt aber nichtmehr.
Bei meiner Sortierfunktion passiert dies allerdings nicht - die Elemente bleiben an der selbem Position.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten