CurrentElement->next = CurrentElement->next->next (UNDEFINED?)

From: Deniz Bahar (deniz.bahar_at_gmail.com)
Date: 03/08/05


Date: 8 Mar 2005 14:26:21 -0800

Hi,

I'm working with a single linked list and want to delete elements by
searching through the list (starting form the HEAD) then finding the
element, then doing the following:

NewElement = CurrentElement->next;
CurrentElement->next = NewElement->next->next;
free(NewElement);

Does the double ->next invoke undefined behaviour (sequence points
etc)?

========
The full function follows:
========

typedef struct ElementTag Element;

extern Element *NewElement;
extern Element *CurrentElement;
extern Element *HeadElement;

/* Finds and deletes person- returns 1, returns 0 for failure) */
int
FindDeletePerson(const char *name)
{
    if(!strcmp(HeadElement->Person.name, name))
    {
        NewElement = HeadElement->next;
        free(HeadElement);
        HeadElement = NewElement;
        return 1;
    }
    else
    {
        CurrentElement = HeadElement;
        while(CurrentElement->next)
        {
            if(!strcmp(CurrentElement->next->Person.name, name))
            {
                NewElement = CurrentElement->next;
                CurrentElement->next = NewElement->next->next;
                free(NewElement);
                return 1;
            }
            CurrentElement = CurrentElement->next;
        }
    }
    return 0;
}