believe it or not still more code is needed. Specifically code regarding Node class/struct. My presumption is that code looks something like this:

struct Node
{
Itemtype datum;
Node * ptr;
};

such that ptr will hold the address of the next Node object in the list and you are searching for a node whose Itemtype matches the one passed to SearchHelper. The initial Node * you pass to SearchHelper appears to be the head node. The code in SearchHelper appears to have three options:

//if this is the last node in the list then don't look any further
if(r->ptr == NULL){
return NULL;
}
//if the current node has the desired value
else{
if (r->ptr->datum == item){
return r->ptr;
}
//otherwise send next node to SearchHelper
else{
SearchHelper (r->ptr,item);

Assuming this is the set up then there is one probable coding error and one probable logic error. the apparent coding error is here:

r->ptr->datum

I think it would be better to use this:

r->datum

instead, as r is the current node and r->ptr is the next node in the list.

The logic error is that you should should check for datum == item first. If the last node in the list has the desired value, the sequence you use will miss it.

The return value from the original call to SearchHelper() could be used like this in the original call: