Эта функция
Node * pop(Node * head)
{
Node * temp = head;
long val = temp -> value; //store the value before deallocating
head = head -> next;
free(temp);
return createNode(val);
}
не имеет смысла.
Для начала голова должна передаваться по ссылке
Node * pop(Node **head);
и, во-вторых, вместо освобождения вытолкнутого узел, вы можете просто вернуть его setiing его член данных рядом с NULL. Также в общем случае головной узел может быть равен NULL.
Функция может выглядеть как
Node * pop( Node **head )
{
Node *current = *head;
if ( *head != NULL )
{
*head = ( *head )->next;
current->next = NULL;
}
return current;
}