Remove odd valued nodes from linked list
It seems you can simplify this by quite a lot.
I added explanation of the algorithm inside the code,
that way it might be easier to follow:

void rem_odd(struct Node** head)
{
    struct Node* curr = *head;
    struct Node* l_even;

    // iterate until the first even element, or the end
    while (curr != NULL &amp;&amp; curr-&gt;data % 2 != 0)
    {
        curr = curr-&gt;next;
    }

    // the new head is the first even element, or the end
    *head = curr;

    // if no more elements, we're done here
    if (curr == NULL) {
        return;
    }

    // the last even element is the current element, naturally
    l_even = curr;

    // we know the current element is even, and not null, so moving on
    curr = curr-&gt;next;

    // iterate until the end
    while (curr != NULL)
    {
        // is the current element even?
        if (curr-&gt;data % 2 == 0) {

            // -&gt; yes, it's even, so the last even element should point to it
            l_even-&gt;next = curr;

            // ... and this is the new last-even-element now
            l_even = curr;
        }
        curr = curr-&gt;next;
    }

    // last even might still point to an odd valued element, so NULL it out
    l_even-&gt;next = NULL;
}


Notice that I added spaces around the operators.
For example this is extremely hard to read:


while(curr!=NULL&amp;&amp;curr-&gt;data%2!=0)