Merge two lists
BlitzMax Forums/BlitzMax Programming/Merge two lists
| ||
Is there a FAST way of merging two TLists into one? Or appending one after the other? Otherwise I am having to return a TList/array of TLists and iterate through two levels. |
| ||
No, I had to extend functionality into Tlist to add that as I wanted to do a quick chop and connect list for the solitaire game I was making. |
| ||
couldn't you just take the link from the last of one and point it to the first link of another? |
| ||
I think this is a good example:SuperStrict 'We get two separated TList objects: Global List1:TList = New TList Global List2:TList = New TList Print List2.Count() 'Add items to the first list: List1.AddLast("one") List1.AddLast("two") List1.AddLast("three") 'Add items to the second list: List2.AddLast("four") List2.AddLast("five") List2.AddLast("six") 'We merge the two lists in one: Local ResultList:TList = MergeTwoList(List1, List2) 'Show results: Print "ResultList contains " + ResultList.Count() + " items." For Local Str:String = EachIn ResultList Print Str Next Print Print "---- reverse display -----" Print Global lnk:TLink = ResultList.lastLink() While lnk Print String(lnk.value()) lnk = lnk.PrevLink() Wend End 'This function appends one list to another. Function AppendList(Source:TList, Additional:TList) Local lastlink:TLink = source.LastLink() If lastlink = Null Then Source._head = Additional._head Else lastlink._succ = Additional._head._succ Additional._head._succ._pred = lastlink Local LastLink2:TLink = Additional.lastlink() LastLink2._succ = Source._head Source._head._pred = LastLink2 End If Additional._head = New TLink Additional._head._succ = Additional._head Additional._head._pred = Additional._head Additional._head._value = Additional._head End Function 'This function joins 2 lists and creates a new one Function MergeTwoList:TList(List1:TList, List2:TList) Local TempList:TList = New TList AppendList(TempList, List1) AppendList(TempList, List2) Return TempList End Function EDIT: Notice that after the merge operation, List2 is no longer valid. Anyway, fix should be easy to implement. EDIT2: Fixed. It no longer leaves List2 in a corrupted state. Notice that the merge operation clears List2. Thats intended to keep data consitency. Last edited 2011 Last edited 2011 |
| ||
Thank you. |
| ||
I've just fixed a small issue (see above) that was causing a crash if one of the lists was empty. It's fast but clears the merged lists once the merge operation is done. This is by design. |
| ||
@ziggy the list is not quite consolidated when it's merged: SuperStrict 'We get two separated TList objects: Global List1:TList = New TList Global List2:TList = New TList Print List2.Count() 'Add items to the first list: List1.AddLast("one") List1.AddLast("two") List1.AddLast("three") 'Add items to the second list: List2.AddLast("four") List2.AddLast("five") List2.AddLast("six") 'We merge the two lists in one: Local ResultList:TList = MergeTwoList(List1, List2) 'Show results: Print "ResultList contains " + ResultList.Count() + " items." For Local Str:String = EachIn ResultList Print Str Next Print Print "---- reverse display -----" Print Global lnk:TLink = ResultList.lastLink() While lnk Print String(lnk.value()) lnk = lnk.PrevLink() Wend End 'This function appends one list to another. Function AppendList(Source:TList, Additional:TList) Local lastlink:TLink = source.LastLink() If lastlink = Null Then Source._head = Additional._head Else lastlink._succ = Additional._head._succ Local LastLink2:TLink = Additional.lastlink() LastLink2._succ = Source._head End If Additional._head = New TLink Additional._head._succ = Additional._head Additional._head._pred = Additional._head Additional._head._value = Additional._head End Function 'This function joins 2 lists and creates a new one Function MergeTwoList:TList(List1:TList, List2:TList) Local TempList:TList = New TList AppendList(TempList, List1) AppendList(TempList, List2) Return TempList End Function |
| ||
I was missing an assignation for the reverse _succ _pred. This should fix this:SuperStrict 'We get two separated TList objects: Global List1:TList = New TList Global List2:TList = New TList Print List2.Count() 'Add items to the first list: List1.AddLast("one") List1.AddLast("two") List1.AddLast("three") 'Add items to the second list: List2.AddLast("four") List2.AddLast("five") List2.AddLast("six") 'We merge the two lists in one: Local ResultList:TList = MergeTwoList(List1, List2) 'Show results: Print "ResultList contains " + ResultList.Count() + " items." For Local Str:String = EachIn ResultList Print Str Next Print Print "---- reverse display -----" Print Global lnk:TLink = ResultList.lastLink() While lnk Print String(lnk.value()) lnk = lnk.PrevLink() Wend End 'This function appends one list to another. Function AppendList(Source:TList, Additional:TList) Local lastlink:TLink = source.LastLink() If lastlink = Null Then Source._head = Additional._head Else lastlink._succ = Additional._head._succ Additional._head._succ._pred = lastlink Local LastLink2:TLink = Additional.lastlink() LastLink2._succ = Source._head Source._head._pred = LastLink2 End If Additional._head = New TLink Additional._head._succ = Additional._head Additional._head._pred = Additional._head Additional._head._value = Additional._head End Function 'This function joins 2 lists and creates a new one Function MergeTwoList:TList(List1:TList, List2:TList) Local TempList:TList = New TList AppendList(TempList, List1) AppendList(TempList, List2) Return TempList End Function Ah right, I was forgetting to modify the appended list _head._predd pointer too. It should be ok now. Last edited 2011 |
| ||
:) |