Just nu i M3-nätverket
Jump to content

Länkad lista som inte går att ändra ordning på.


Hookan

Recommended Posts

Hej.

Jag har en länkad lista som jag har en after och en before i:

 

class order

...

...

 

dim After as order

dim Before as order

 

Public Sub New(ByVal Ord_nr As Integer)

Ordrnr = Ord_nr

 

 

Before = Nothing

After = Nothing

 

End Sub

 

end class

 

Jag sätter sedan before och after till att peka på nya order och dessa ingår i min länkade lista.

 

Jag har sedan en funktion som skall byta plats på två element i listan.

 

Private Function Change(ByRef A As Order, ByRef B As Order)

Dim temp As Order

temp = B

' temp.Before = B.Before

'temp.After = B.After

 

'B.After = A

'B.Before = A.Before

B.After = Nothing

B.Before = Nothing

B = Nothing

 

B = A

A.After = Nothing

A.Before = Nothing

A = Nothing

A = temp

' Return temp

End Function

 

Jag vill alltså att A och B skall byta plats men jag lyckas inte hur jag än gör. Det fungerar kanon att göra temp = B men när jag skall göra A=B så får jag en loop av after som aldrig slutar.......

 

 

Vad gör jag för fel?

 

MVH Håkan

 

Link to comment
Share on other sites

Anjuna Moon

- Till att börja med måste du deklarera After och Before som Public, annars kommer du inte åt dem utifrån.

- Sedan tänker du lite fel i Change.Det enda temp gör är att peka på B, det är ingen kopia av B.

- Change ska vara en Sub och inte en Function.

 

Spara istället undan After och Before från A och B och swappa dessa istället:

 

   
Class order
       Public After,Before As order
       Public Ordrnr As Integer

       Public Sub New(ByVal Ord_nr As Integer)
           Ordrnr = Ord_nr
           Before = Nothing
           After = Nothing
       End Sub
   End Class


Private Sub Change(ByRef A As order, ByRef B As order)
       Dim a1, a2, b1, b2 As order
       a1 = A.After
       a2 = B.After
       b1 = A.Before
       b2 = B.Before
       A.After = a2
       B.After = a1
       A.Before = b2
       B.Before = b1
End Sub

 

Link to comment
Share on other sites

Tackar för svar men det fungerar inte.

 

Jag kör koden som du visade:

Dim a1, a2, b1, b2 As order

a1 = A.After

a2 = B.After

b1 = A.Before

b2 = B.Before

A.After = a2

B.After = a1

A.Before = b2

B.Before = b1

 

A och B ser bra ut hela tiden medans jag kör de 4 första raderna. När jag kör rad 5 : A.After = a2 så försvinner B helt. När sedan rad 6 kommer så blir det ett fel att objektreferensen har inte angetts till en instans av ett objekt.

 

 

andra förslag?

 

Link to comment
Share on other sites

Anjuna Moon

Hm, förstår inte varför, det fungerar bra för mig. På länken nedan har jag postat mitt fullständiga exempel som fungerar för mig.

 

EDIT: Glöm det förresten, exemplet fungerade men hade inte rätt effekt =) Återkommer

[inlägget ändrat 2005-06-16 22:03:05 av Anjuna Moon]

Link to comment
Share on other sites

Tackar för tiden du tar dig.

 

Jag förstår inte heller. Jag har kodat en del i C++ och jag måste säga att det kanske är lite omständigare men man har bättre koll på vad som är en pekare och vad den pekar på.

 

Jag kör VB.NET 2003 .

 

 

MVH Håkan

 

Link to comment
Share on other sites

Anjuna Moon

Ok, fick tänka ett par steg till. Det finns tre fall att ta hänsyn till

- B ligger precis före A

- A ligger precis före B

- A och B är skilda med minst en mellanliggande länk

 

Har inte testat alla kombinationer än, men här är koden

 

http://a5903ce7e5e09b1c.paste.se/

 

[inlägget ändrat 2005-06-16 22:33:05 av Anjuna Moon]

[inlägget ändrat 2005-06-16 22:33:46 av Anjuna Moon]

Link to comment
Share on other sites

Hej. har testat men utan framgång.

 

Jag kör denna sub inne i klassen order. spelar ingen roll,

 

i min kod så skapar jag en länkad lista först och sedan går jag igenom den för att kontrollera om nästa är större än förra.

 

jag anropar funktionen för att byta plats på dessa två objekt.

 

i Detta fallet nu så händer följande:

Public Class Order

Dim Lvd1_Vset As String

Dim Lvd2_Vset As String

Dim Lvd3_Vset As String

Dim Lvd1_Value As Double

Dim Lvd2_Value As Double

Dim Lvd3_Value As Double

Dim Lvd1_Len As Double

Dim Lvd2_Len As Double

Dim Lvd3_Len As Double

Dim Lvd1_Kniv As Integer

Dim Lvd2_Kniv As Integer

Dim Lvd3_Kniv As Integer

Dim Lvd1_Dyna As Integer

Dim Lvd2_Dyna As Integer

Dim Lvd3_Dyna As Integer

 

Dim Ordrnr As Integer

Dim Opt_tid As Double

Dim Bock_vecka As Integer

Dim dag As Integer

Dim Efter As Integer

Dim Pallplats As String

Dim Sorterad As Boolean

 

Public Before As Order

Public After As Order

Public Sub New(ByVal Ord_nr As Integer, ByVal Opt As Double, ByVal week As Integer, ByVal day As Integer, ByVal Efterbearb As Integer)

Ordrnr = Ord_nr

Opt_tid = Opt

Bock_vecka = week

dag = day

Efter = Efterbearb

 

Before = Nothing

After = Nothing

Sorterad = False

End Sub

 

Private Sub Change(ByRef A As Order, ByRef B As Order)

Dim oAfterA, oBeforeA, oAfterB, oBeforeB As Order

oAfterA = A.After

oAfterB = B.After

oBeforeA = A.Before

oBeforeB = B.Before

If A.After Is B Then

Insert(A, B, oAfterB)

Insert(B, oBeforeA, A)

ElseIf B.After Is A Then

Insert(A, oBeforeB, B)

Insert(B, A, oBeforeA)

Else

Insert(A, oBeforeB, oAfterB)

Insert(B, oBeforeA, oAfterA)

End If

End Sub

Public Sub Insert(ByRef oOrder As Order, ByRef PrevOrder As Order, ByRef NextOrder As Order)

oOrder.Before = PrevOrder

oOrder.After = NextOrder

If Not IsNothing(PrevOrder) Then PrevOrder.After = oOrder

If Not IsNothing(NextOrder) Then NextOrder.Before = oOrder

End Sub

....

end class

 

 

När jag kör koden och det är så att A.after = B så kommer koden till första insert

 

oOrder.Before = PrevOrder fungerar bra

oOrder.After = Nothing vilket fungerar bra

Dessa uppfylls inte...

If Not IsNothing(PrevOrder) Then PrevOrder.After = oOrder

If Not IsNothing(NextOrder) Then NextOrder.Before = oOrder

 

När sub:en är klar är A ok medans B is nothing

Detta medför att vi är tillbaka till samma ställe igen eftersom jag i nästa insert får en objektreferensen har inte angetts till en instans av ett objekt.

 

 

hmmmm....

 

Jag är väldigt tacksam för hjälpen....

 

Link to comment
Share on other sites

Anjuna Moon

Problemet är att du använder min kod som metoder i klassen. Som det är skrivet nu så måste du lägga dem utanför klassen

 

Sedan undrar jag vad tanken är bakom att ha ordrar representerade som en länkad lista? Känns som att det vore enklare med en arraylist eller en hashtabell

[inlägget ändrat 2005-06-16 22:58:33 av Anjuna Moon]

Link to comment
Share on other sites

Ok det var bra att vi hittar ett fel jag gör men hur gör jag för att skriva dem i klassen?

 

 

 

/Håkan

 

Link to comment
Share on other sites

hmmmm.

 

Jag testade nu att lägga detta i min vanliga fil och inte i klassen.

 

Precis som innan fast använder då funktioner för att få ut värden.

 

Detta genererar samma problem som innan.

 

 

 

 

 

Link to comment
Share on other sites

Anjuna Moon

Jag fick även din kod att fungera (fick dock ändra Change till Public eftersom jag anropar Change utifrån) så felet kanske ligger i hur du anropar metoderna. Var utför du din sortering och anropen?

 

Här är tillsvidare en mer logiskt urformad metod (istället för Change) om den skall ligga inne i klassen, A.SwapWith(B)

 

http://7d36d285c52f5df1.paste.se/

 

Link to comment
Share on other sites

Ok nu skall vi se

 

Jag har en applikation som är main och sedan öppnar jag en ny form som inte är modal. I denna form skapar jag min länkade lista enligt klassen order som jag visat tidigare.

 

Jag hanterar en massa insättningar i den länkade listan och när detta är klart så anropar jag från den första posten i listan

 

'L_order är nu sist och L_Order_first pekar på den första.

If L_order_First Is Nothing Then

Else

 

L_order_First.Sort_Order(L_order_First)

 

hmmmm här har jag ett fel ....

 

jag återkommer imorgon för jag skall upp klockan 5.

 

Tackar för allt

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...