Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > CurrentElement->next = CurrentElement->next->next (UNDEFINED?)

Reply
Thread Tools

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

 
 
Deniz Bahar
Guest
Posts: n/a
 
      03-08-2005
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;
}

 
Reply With Quote
 
 
 
 
Quentarez
Guest
Posts: n/a
 
      03-08-2005
On 8 Mar 2005 14:26:21 -0800, Deniz Bahar wrote:

> 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)?
>


<snip>

You can use as many ->next as you wish, as long as the ->next link exists.
 
Reply With Quote
 
 
 
 
Andrey Tarasevich
Guest
Posts: n/a
 
      03-09-2005
Deniz Bahar wrote:
> ...
> 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)?
> ...


No. Firstly, you are not accessing the same object twice.
'CurrentElement->next' as an lvalue is neither 'NewElement' nor
'NewElement->next' nor 'NewElement->next->next'. There's no problem with
sequence points here.

However, the code itself doesn't do what it is supposed to do. Doing

NewElement = CurrentElement->next;
CurrentElement->next = NewElement->next->next;

will exclude _two_ consecutive elements from the list (both 'NewElement'
and 'NewElement->next'), not one. Apparently, this is not what you
wanted to do. You probably intended to do either

NewElement = CurrentElement->next;
CurrentElement->next = NewElement->next;

or

NewElement = CurrentElement->next;
CurrentElement->next = CurrentElement->next->next;

That would exclude only one element from the list.

Now in that last version the value of 'CurrentElement->next' is accessed
twice (once to read it and once to modify it), which might rise the
question about sequence points etc. However, it this case everything is
fine too. The old value of 'CurrentElement->next' is read for the sole
purpose of determining its new value.

--
Best regards,
Andrey Tarasevich
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off




Advertisments