Seite 1 von 2

SwapList(List())

Verfasst: 03.08.2007 10:01
von Scarabol
Hi Leute,

hab mir schnell einen Code geschrieben mit dem ich eine komplette Liste umdrehen kann als das erste Element als letztes, das zweite als vorletztes und umgekehrt natürlich.

Was muss ich machen, damit der Code auch mit strukturierten Listen fertig wird oder muss ich für jede Struktur einen eigenen Code haben?

Gruß
Scarabol

PS Hier noch der Code

Code: Alles auswählen

Procedure SwapList(List())
  Protected c, i, *s1, *s2
  c = CountList(List())-1
  For i = 0 To Int(c/2)
    SelectElement(List(), i)
    *s1 = @List()
    SelectElement(List(), c-i)
    *s2 = @List()
    SwapElements(List(), *s1, *s2)
  Next
EndProcedure


NewList test()

For i = 1 To 3
  AddElement(test())
  test() = i
Next

ForEach test()
   Debug test()
Next

SwapList(test())

ForEach test()
  Debug test()
Next
2. Wird der Speicher der Protected Variablen am Ende der Procedure wieder freigegeben?

Verfasst: 03.08.2007 10:42
von ts-soft
>> 2. Wird der Speicher der Protected Variablen am Ende der Procedure wieder freigegeben?
Ja, einzige Ausnahme ist AllocateMemory, da wird nur der Zeiger ungültig!!!

Re: SwapList(List())

Verfasst: 03.08.2007 15:47
von PureLust
Scarabol hat geschrieben:Was muss ich machen, damit der Code auch mit strukturierten Listen fertig wird ...
Probier's doch einfach aus.
Da meines Wissens nach bei einem SwapElement() nur die Zeiger auf die Elemente ausgetauscht werden sollte das auch genau so bei strukturierten Elementen klappen.

Tip: Eigentlich sollte ein Umdrehen der LList-Reihenfolge auch schneller zu realisiern sein als durch die von Dir verwendete Methode.
Du bräuchtest im Grunde nur den Start-Zeiger der Liste auf das letzte Element zu setzen und dann bei jedem Element einfach die Prev/Next-Zeiger umzudrehen.

Verfasst: 03.08.2007 16:35
von Scarabol
Probier's doch einfach aus. ...
Hab ich daher die Frage, vom Compiler heißt es nur LL passt nicht zu den Parametern.

Zu deinem Tip:
Wie kann ich den Startzeiger ändern?
und dann so weitermachen?

Code: Alles auswählen

Procedure SwapList2(List())
  ForEach List()
    Swap List()\*Previous, List()\*Next
  Next
EndProcedure

Allerdings bekomm ich dann den Fehler das die Liste keine Struktur hat, die sie wiederum nach der Hilfe zu Addelement schon aufweisen sollte.

Gruß
Scarabol

Verfasst: 03.08.2007 16:50
von Kaeru Gaman
Swap funktioniert definitiv nicht mit strukturen, nur mit nativen typen.

die Help mag da leicht mißverständlich erscheinen:
Vertauscht ("swap") den Wert der beiden Ausdrücke, auf eine optimierte Art und Weise. Beide Parameter <Ausdruck> müssen eine Variable, ein Array- oder ein LinkedList-Element (strukturiert oder nicht) sein und müssen in einem nativen PureBasic Typ wie Long (.l), Quad (.q), String, etc. vorliegen.
das "strukturiert" hier bezieht sich auf die natur der liste.
das ende des satzes ist maßgeblich für den typ des einzelnen elementes.
das funktioniert also:

Code: Alles auswählen

Structure test
  x.l
  y.l
EndStructure

bla.test
bla\x = 13
bla\y = 27

Swap bla\x, bla\y

Debug bla\x
Debug bla\y
hier werden native typen innerhalb einer struktur getauscht.

[edit]
ach ok... SwapElements()... da hab ich wohl was überlesen...
[/edit]


die idee, die previous/next pointer zu vertauschen ist ja ganz nett,
allerdings muss man ja auch in der lage sein,
diesen vorgang in einer schleife abzuhandeln.

also müßte man wohl beim letzten element anfangen,
dort previus und next vertauschen,
dann NextElement(), womit man beim vorletzten landet,
und so weiter die liste rückwärts durchgehen indem man vorwärts-befehle benutzt.

Verfasst: 03.08.2007 16:52
von PureLust
Scarabol hat geschrieben:
Probier's doch einfach aus. ...
Hab ich daher die Frage, vom Compiler heißt es nur LL passt nicht zu den Parametern.
Hier mal das SwapElements()-Beispiel aus der PB-Hilfe, welches ich einfach mal auf eine strukturierte LL umgestellt habe:

Code: Alles auswählen

  NewList Numbers.POINT()
  
  For k=0 To 10
    AddElement(Numbers())
    Numbers()\x = k
  Next
    
  SelectElement(Numbers(), 3) ; Auswählen des vierten Elements (beachte: es gibt auch ein 0-tes Element)
  *FirstElement = @Numbers()
  
  SelectElement(Numbers(), 9) ; Auswählen des zehnten Elements (beachte: es gibt auch ein 0-tes Element)
  *SecondElement = @Numbers()
  
  ; Tausche die 3 mit der 9
  ;
  SwapElements(Numbers(), *FirstElement, *SecondElement)
    
  ; Überprüfen des Ganzen
  ;
  ForEach Numbers()
    Debug Numbers()\x
  Next
Wie Du siehst funktioniert SwapElements() auch mit strukturierten Listen. ;)

Gruß, PL.

Verfasst: 03.08.2007 17:19
von Scarabol
Hehe du Witzbold bei mir funktioniert es ja nicht, weil ich es in einer Procedure aufrufe, womit wir auch wieder beim Thema währen ich möchte der Procedure ja klar machen das ich eine strukturierte Liste hab.

Gruß
Scarabol

Verfasst: 03.08.2007 17:33
von PureLust
Scarabol hat geschrieben: ich möchte der Procedure ja klar machen das ich eine strukturierte Liste hab.
Dann solltest Du in der Prozedurdeklaration aber auch die Struktur der Liste mit angeben (Bsp. von ts-soft).

(Ich bin aber gerade dran, eine universelle FlipLingedList()-Prozedur zu machen ... mom.)

Verfasst: 03.08.2007 17:34
von ts-soft
Scarabol hat geschrieben:Hehe du Witzbold bei mir funktioniert es ja nicht, weil ich es in einer Procedure aufrufe, womit wir auch wieder beim Thema währen ich möchte der Procedure ja klar machen das ich eine strukturierte Liste hab.

Gruß
Scarabol
Entweder Global, Shared oder als Parameter übergeben

Code: Alles auswählen

Procedure bla(mystructlist())

EndProcedure

Verfasst: 03.08.2007 17:52
von Scarabol
Ok danke, ich warte, aber schonmal im Voraus im Beispiel von TS wurde die Struktur ja mit angegeben, ich möchte hierrauf jedoch verzichten und die Procedure universell gestalten.

Gruß
Scarabol