Code:
node *delnodebyvalue( node *n, data_t v )
{
node *d = n;
if( d )
{
node *p = d;
for( ; d && p; p = d, d = d->next )
{
if( d->value == v )
break;
}
if( d == p ) /* head */
{
d = d->next;
free( p );
p = NULL;
n = d;
}
else
if( d )
{
p->next = d->next;
free( d );
d = p;
}
}
return n /* d */;
}
I haven't tested this, but that looks about right. That looks better.
I find your added layer of 'list' as a wrapper too hard to read this late in the evening for me. It's easier for me to just write a new one than it is to try and figure out what you've done wrong. At a quick glance, I'd say it's probably somewhere here:
Code:
if (ptr->data==value)
{
tmp = prev;
prev = ptr->next;
free(tmp);
ptr = prev;
}
if (ptr->data==value && ptr->next==NULL)
{
tmp = prev;
prev = NULL;
free(tmp);
ptr = prev;
}
Either you're being clever here, or you've missed something here, since what your code here might do is free ptr twice, since you don't have an else there. Like I said though, you may just be doing something clever that I'm too tired to catch.
Quzah.