You are checking for the NULL value at the end of the list to break out
of your loop if a match isn't found...
> for(k = spec_door_list; k ; k = k->next) {
> if( k->door == EXITN(ch->in_room, door)) break;
> }
...but if that happens you ned up trying to remove that null value...
> REMOVE_FROM_LIST(k, spec_door_list, next);
>
> now just so you'll know, here's the definition of the macro REMOVE_FROM_LIST
> #define REMOVE_FROM_LIST(item, head, next) \
if you have no items in the list this would be called with both item and
head being NULL...
> if ((item) == (head)) \
> head = (item)->next; \
Translates to...
if (NULL == NULL) /* true */
NULL = NULL->next; /* Error! Seg. Fault! */
> else { \
> temp = head; \
> while (temp && (temp->next != (item))) \
> temp = temp->next; \
> if (temp) \
> temp->next = (item)->next; \
> } \
>
> as a last question:
> when removing a item from this linked list, i assume i should free it. I
> have written a free_spec_door() function, but could someone
> more knowledgeable about this give me what is -correct- for a free_spec_door
> function, givin the above structure for spec_door?
> I really appreaciate all the help, and the CM mailing list is already in the
> credits on my login page. :-)
> thanks all
Try this...
for (k = spec_door_list, j = 0; k; j = k, k = k->next) {
if (k->door == EXITN(ch->in_room, door)) {
if (j)
j->next = k->next; /* k is not the first item in the list so we
have to update the pointer of the previous
item */
else
spec_door_list = k->next; /* k is the first item in the list so
update
the start of the list instead */
free(k); /* This is how you free the memory, simple enough ;) */
break;
}
}
+------------------------------------------------------------+
| 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