Hi gents,
I thought appending a copy of the list would be faster than incramentally adding each element to the list...
So I wrote this as a test...
SuperStrict
Framework brl.Graphics
Import brl.max2d
Import brl.standardio
Import brl.linkedlist
Import brl.d3d7max2d
Graphics 800,600
Global console:TList = New TList
Global state:String = "Starting"
Local dest:TList = New(TList), from:TList = New(TList)
Const LISTSIZE:Int = 999999
Output "Creating lists "+LISTSIZE+" elements in length"
For Local value:Int = 0 To LISTSIZE
dest.AddLast("A"+value)
from.AddLast("B"+value)
Next
Status "Copying the lists for test purposes..."
Local testDest1:TList = dest.Copy()
Local testDest2:TList = dest.Copy()
Status "Running tests..."
Local timestamp1:Int = MilliSecs()
AddListToList(testDest1, from)
Local timeStamp2:Int = MilliSecs()
ListAppendList(testDest2, from)
Local timeStamp3:Int = MilliSecs()
Local timeToAddLists:Int = timeStamp2-timeStamp1
Local timeToAppendLists:Int = timeStamp3-timeStamp2
Output "Time to Add: "+timeToAddLists
Output "Time to AppendLists: "+timeToAppendLists
Output "Verifying that lists match in content forwards..."
Local listLinkA:TLink = testDest1.FirstLink()
Local listLinkB:TLink = testDest2.FirstLink()
Global Verified:Int = False
Local stringA:String = String(listLinkA.Value())
Local stringB:String = String(listLinkB.Value())
Local counter:Int = 0
While stringA.contains(stringB)
listLinkA = listLinkA.NextLink()
listLinkB = listLinkB.NextLink()
If (counter Mod (LISTSIZE/100)) = 0 Then
Status counter+":"+stringA +" = "+stringB
EndIf
counter:+1
If listLinkA = Null Or listLinkB = Null Then
If listLinkA = listLinkB Then verified = True
Status stringA+" ? "+stringB
Exit
EndIf
stringA = String(listLinkA.Value())
stringB = String(listLinkB.Value())
Wend
Output "Verification Forward Ended"
If verified = True Then
Output "Lists Match"
Else
Output "Lists failed Verification"
EndIf
Output "Verifying that lists match in content backwards..."
listLinkA = testDest1.LastLink()
listLinkB = testDest2.LastLink()
While stringA.contains(stringB)
listLinkA = listLinkA.PrevLink()
listLinkB = listLinkB.PrevLink()
If (counter Mod (LISTSIZE/100)) = 0 Then
Status counter+":"+stringA +" = "+stringB
EndIf
counter:+1
If listLinkA = Null Or listLinkB = Null Then
If listLinkA = listLinkB Then verified = True
Status stringA+" ? "+stringB
Exit
EndIf
stringA = String(listLinkA.Value())
stringB = String(listLinkB.Value())
Wend
Output "Verification Backwards Ended"
If verified = True Then
Output "Lists Match"
Else
Output "Lists failed Verification"
EndIf
While Not AppTerminate()
display()
Wend
'simple console
Function display()
Cls
Local x:Int = 0
Local y:Int = 0
DrawText(state,x,y)
y:+20
For Local str:String = EachIn console
DrawText(str,x,y)
y:+12
Next
Flip
End Function
Function output(text:String)
console.AddLast(text)
display()
End Function
Function status(text:String)
state = text
display()
End Function
Function AddListToList:Int(dest:TList, from:TList)
If dest = Null Or from = Null Or from.Count() = 0 Then Return False
For Local obj:Object = EachIn from
dest.AddLast(obj)
Next
Return True
End Function
Function ListAppendList:Int(dest:TList, from:TList)
Local copy:TList
If dest = Null Or from = Null Or from.Count() = 0 Then Return False
copy = from.Copy()
AppendLink(copy.FirstLink(), dest.LastLink())
Return True
End Function
Function AppendLink(appendee:TLink, appended:TLink)
appended._succ = appendee
appendee._pred = appended
End Function
I get the following result for 999,999 items in list:
Time to Add: 754ms
Time to Append: 583ms
So with the copy there is very little between the two.
Plash not sure why you were using 4 operations to link two lists:
Linked list A <-> B
A -> B A._succ = B
A <- B B._pred = A
Unless I'm missing something?