From: Chris Jacobson <fear@ATHENET.NET> >So I was thinking, what would be the SAFEST way to implement linked >lists, and to iterate through the list without losing place, when there >is the chance that the current, previous, next, or any other item in the >list could be removed in mid-iteration.... > <snip> How about marking any 'deleted' entry with a flag variable, then using that variable to skip processing that element of the list. Then have a seperate routine to run every so often to compact the list. I assume you only have one thread and just need to do stuff inside the loop construct that might affect the linked list in a random location. That'd keep your links happy and allow simple code (read: easy to debug). I use this approach in a few places on Antares and find it works quite well. Something like this fragment :-) #define my_stuff_flag_deleted (1 <<0) #define my_stuff_flag_blah1 (1 <<1) ... #define my_stuff_flag_blahn (1 <<n) struct my_stuff { int flags; int mynumber; char *mystring; }; struct my_stuff *stuff; void look_through_stuff () { struct my_stuff *stuff_next, *blah; for (blah=stuff;blah;blah=stuff_next) { stuff_next=blah->next; if (IS_SET(blah->flags, my_stuff_flag_deleted)) continue; /* handle element */ } } --Mallory +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST