Reverse digits and add until a palindrome appears
reverse()

Your reverse() function only works for numbers below 1010.  Although that upper bound may be good enough to solve this particular challenge, it's not correct in general.  (Keep in mind that the standard says that an unsigned long is at least 32 bits — possibly larger.)

Here is a simpler implementation that works in general:

unsigned long reverse(unsigned long original) {
    unsigned long reversed = 0;
    for (; original; original /= 10) {
        reversed = (10 * reversed) + (original % 10);
    }
    return reversed;
}


is_palindrome()

For every iteration, you end up calling reverse() twice: once to test whether a palindrome has appeared, and again to obtain the next number to add.  You would be better off eliminating this function, and rolling the palindrome check into the reverse_add() loop itself.

reverse_add()

For clarity, I would rename the function to reverse_add_until_paindrome().

Conventionally, C functions are designed so that a status code is returned, and the data being manipulated are passed by reference.  I recommend redesigning the interface so that it returns the number of iterations, as that is closer in spirit to a status code.  The number itself can be passed by reference.  Notice what happens then: it becomes an in-out parameter!  The rationale for the convention makes itself apparent.

int reverse_add_until_palindrome(unsigned long *n) {
    int i;
    unsigned long rev;
    for (i = 0; (rev = reverse(*n)) != *n; i++) {
        *n += rev;
    }
    return i;
}


The problem statement guarantees that you will never be given a P that will require more than 1000 iterations.  That's just for your information; I don't think you need to verify that fact.  (If you do want to bail out, you should add code in main() to detect that the computation was aborted.)

main()

The way you try to use one scanf() to read both N and the Pi is awkward.  Not only does that make the code less clear, it also imposes a penalty of an extra conditional on every subsequent loop.  In addition, it's wrong: the format string for an int is "%d", whereas the format string for an unsigned long is "%lu".

You read n, but never make use of it.  That works, I suppose.  I prefer to use it to see whether all of the expected input was received.

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main() {
    int n;
    unsigned long p;

    if (1 != scanf("%d", &amp;n)) {
        return EXIT_FAILURE;
    }
    while (n-- &amp;&amp; scanf("%lu", &amp;p)) {
        int iterations = reverse_add_until_palindrome(&amp;p);
        printf("%d %lu\n", iterations, p);
    }
    return (n == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}