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