Re: Question concerning linked lists

From: Daniel A. Koepke (dkoepke@california.com)
Date: 12/14/99


On Tue, 14 Dec 1999, Jason Beeland wrote:

> [snip]

         REMOVE_BIT(EXITN(ch->in_room, door)->exit_info, EX_FIRETRAP);

         for (kPrev = NULL, k = spec_door_list; k; kPrev = k, k = k->next)
           if (k->door == EXITN(ch->in_room, door))
             break;

         if (k) {
           if (kPrev) {
             kPrev->next = k->next;
           } else {
             spec_door_list = spec_door_list->next;
           }
           free(k);
         }

Note the movement of the free() statement inside of the "if (k) {}" block.
You do not want to try free(NULL).  Since we're expecting the door to be
in the spec_door_list at this point (at least, I think we are?) it'd make
sense to make a log() if we fail to find it in there, so:

    if (k) {
      if (kPrev) {
        kPrev->next = k->next;
      } else {
        spec_door_list = spec_door_list->next;
      }
      free(k);
    } else
      log("SYSERR: Expected firetrap to be in spec_door_list.");

> [snip]

Modify the rest of the code accordingly.

Lastly, what are we using the spec_door_list list for, anyway?  Obviously,
we're adding a firetrap door to the spec_door_list somewhere, and we're
removing it here ... are we ever traversing the list for some other
reason?  If the answer is no, you probably don't need a linked list to
begin with.

-dak : They're my initials.


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     |  http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html  |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/15/00 PST