Elemente ans ende der Liste Hinzufügen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Elemente ans ende der Liste Hinzufügen

Beitrag von Lukaso »

Hallo,

ich bräuchte ne möglichkeit, unabhängig von der aktuellen Position (NextElement() etc..) neue Elemente ans ende der Liste Hinzuzufügen, ohne die Position zu verändern.

Ich könnte ja mit LastElement() ans ende Springen, und meine Elemente hinzufügen und wieder zurückspringen, dass problem ist aber, dass ich im Programm mehrere gleichzeitige Lesevorgänge habe und so alles durcheinander kommen könnte.

Danke für eure Hilfe! :allright:

MFG Lukaso
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Du könntest die Liste aller aller höchstens durch LLHandle funktionen bearbeiten.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ohne Kommentare...

Code: Alles auswählen

NewList LinkedList.l()

Procedure AddElementAfterLastWithValue(a.l)
  Protected *Mem
  *Mem = @LinkedList()
  If LastElement(LinkedList())
    If AddElement(LinkedList())
      LinkedList() = a
    EndIf
  EndIf
  ChangeCurrentElement(LinkedList(), *Mem)
EndProcedure

AddElement(LinkedList())
LinkedList() = 1

AddElementAfterLastWithValue(10)
AddElementAfterLastWithValue(44)
AddElementAfterLastWithValue(145)

Debug LinkedList()
Debug ""
ForEach LinkedList()
  Debug LinkedList()
Next
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

@NicTheQuick

Danke :allright:

Könntest du mir bitte mal das Fettgedruckte erklären?
Procedure AddElementAfterLastWithValue(a.l)
Protected *Mem
*Mem = @LinkedList()
If LastElement(LinkedList())
If AddElement(LinkedList())
LinkedList() = a
EndIf
EndIf
ChangeCurrentElement(LinkedList(), *Mem)
EndProcedure
Will nich dumm sterben :roll:

Danke Lukaso :allright:
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Procedure AddElementAfterLastWithValue(a.l)
Protected *Mem
*Mem = @LinkedList() ;Der Zeiger auf das aktuelle Element der Liste wird in *Mem gespeichert
If LastElement(LinkedList())
If AddElement(LinkedList())
LinkedList() = a
EndIf
EndIf
ChangeCurrentElement(LinkedList(), *Mem) ; die ursprüngliche Position der Liste wird mit Hilfe des zwischengespeicherten Zeigers wieder hergestellt
EndProcedure
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Das steht ja im Grunde schon in der Hilfe.
Mit [c]*Mem = @LinkedList()[/c] wird der Zeiger zum aktuellen Element genommen und in [c]*Mem[/c] gespeichert.
Der Befehl [c]ChangeCurrentElement()[/c] wählt dann wieder das Element mit dem Zeiger [c]*Mem[/c] aus und macht es zum aktuellen.

Mir ist allerdings vorhin aufgefallen, dass das ganze nicht mehr so wunderbar funktioniert, wie es früher mal der Fall war. Wäre nämlich bei Aufruf der Procedure kein aktuelles Element da, würde die Zeile [c]*Mem = @LinkedList()[/c] fehlschlagen. Ich glaube bei PB V3.90 hat das noch funktioniert. Da war [c]*Mem = 8[/c] und [c]ChangeCurrentElement(LinkedList(), 8)[/c] hat die LinkedListe dann resettet.
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Danke für die Erklärung!

Ist das eigentlich schneller wie mit ListIndex() und SelectElement()?

Desweiteren stürtzt mir der Code mit Strings ab ....

Code: Alles auswählen

NewList LinkedList.s()

Procedure AddElementAfterLastWithValue(a.s) 
  Protected *Mem 
  *Mem = @LinkedList() 
  If LastElement(LinkedList()) 
    If AddElement(LinkedList()) 
      LinkedList() = a
    EndIf 
  EndIf 
  ChangeCurrentElement(LinkedList(), *Mem)
EndProcedure 

AddElement(LinkedList()) 
LinkedList() = "FLUMP" 

AddElementAfterLastWithValue("BLA1")
AddElementAfterLastWithValue("BLA2")
AddElementAfterLastWithValue("BLA3") 

Debug LinkedList() 
Debug "" 
ForEach LinkedList() 
  Debug LinkedList() 
Next
Ansonsten Danke!

MFG Lukaso
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Wenn das mit Strings abstürzt, kann das nur ein PB-Bug sein.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

NicTheQuick hat geschrieben:Wenn das mit Strings abstürzt, kann das nur ein PB-Bug sein.
Habs mal an Fred gemeldet.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Ok, Rückantwort von Fred ging schnell:
Fred hat geschrieben: That's because a @LinkedList of string type returns the string address. I will change that for the next beta.
Das obige Verhalten resultiert also daraus, dass bei Verwendung von @LinkedList auf den Stringtyp auch die String-Adresse zurückgegeben wird. Er wird's für die nächste Beta ändern... :wink:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten