Linked list tweak gone arry
BlitzMax Forums/BlitzMax Module Tweaks/Linked list tweak gone arry
| ||
I've been looking att he best way to organize my parsed data, and put it through various processes to change it, and this seems like the best way - have a list of objects. In many cases, obviously, the objects will have inter-relationships, usually before/after/etc. Decided the best way to do this was access the last created enumerator... Anyway, in working on it ive noticed some odd stuff:Strict Framework brl.standardio Local hmm:TList=New TList hmm.AddLast("moo") hmm.Addlast("cow") For Local i$=EachIn hmm Print i$ hmm.Enum._link._value="hi" Next Type TLink Field _value:Object Field _succ:TLink,_pred:TLink End Type Type TListEnum Field _link:TLink Method HasNext() Return _link._value<>_link End Method Method NextObject:Object() Local value:Object=_link._value Assert value<>_link _link=_link._succ Return value End Method End Type Type TList Field _head:TLink Field Enum:TListEnum Method New() _head=New TLink _head._succ=_head _head._pred=_head _head._value=_head End Method Method Delete() _head._value=Null _head._succ=Null _head._pred=Null End Method Method AddLast:TLink( value:Object ) Return InsertBeforeLink( value,_head ) End Method Method InsertBeforeLink:TLink( value:Object,succ:TLink ) Local link:TLink=New TLink link._value=value link._succ=succ link._pred=succ._pred link._pred._succ=link succ._pred=link Return link End Method Method ObjectEnumerator:TListEnum() enum=New TListEnum enum._link=_head._succ Return enum End Method End Type This is some example code plus a very cut-down linked list module. as you can see very oddly it loops. I dont see why it would. By setting the value of the current node, it should simply overwrite it and move on (a flushmem would cleanup the leftovers). However, for whatever reason, it loops forever instead. I've tried debugstop, but for some reason or another debugstop basically exits the program for me. never used it before. I hit step and it skips everything o.0, in otherwords i see nothing in output. Posting it here cause it has code from a brl module... Any idea whats going on? If i comment out the thing that is only changing the value of a variable it works fine, but obviously doesnt change the stuff in the list. Sure, I could make a new list but its inefficient and less elegant. |
| ||
figured it out - the linked list is actually a linked loop, where the end/start has a value of TLink. To obtain the actual current link you have to access the previous one, which is what causes it to overwrite the head with a string causing an infinite loop. |