#include <iostream>
using namespace std;
template <typename Object>
struct Node
{
    Object data;
    Node* next;
    Node(const Object &d = Object(), Node *n = (Object)NULL) : data(d), next(n) {}
};
template <typename Object>
class singleList
{
public:
    singleList() { init(); }
    ~singleList() { eraseList(head); }
    singleList(const singleList &rhs)
    {
        eraseList(head);
        init();
        *this = rhs;
        print();
        contains(head);
    }
    void init()
    {
        theSize = 0;
        head = new Node<Object>;
        head->next = (Object)NULL;
    }
    void eraseList(Node<Object> *h)
    {
        Node<Object> *ptr = h;
        Node<Object> *nextPtr;
        while (ptr != (Object)NULL)
        {
            nextPtr = ptr->next;
            delete ptr;
            ptr = nextPtr;
        }
    }
    int size()
    {
        return theSize;
    }
    void print()
    {
        int i;
        Node<Object> *current = head;
        for(i=0; i < theSize; ++i){
            cout << current->data << " ";
            current = current->next;
        }
    }
    bool contains(int x)
    {
        Node<Object> *current = head;
        for (int i = 0; i < theSize; ++i){
            if (current->data == x){
                return true;
            }
            current = current -> next;
        }
        return false;
    }
    bool add(Object x){
        if(!contains(x)){
            Node<Object> *new_node = new Node<Object>(x);
            new_node->data = x;
            new_node->next = head;
            head = new_node;
            //head->next = new_node;
            theSize++;
            return true;
        }
        return false;
    }
    bool remove(int x)
    {
        if(contains(x)){
            Node<Object> *temp = head;
            Node<Object> *prev = NULL;
            if(temp != NULL && temp ->data == x){
                head = temp->next;
                delete temp;
                return 0;
            }else{
                while(temp != NULL && temp->data != x){
                    prev = temp;
                    temp = temp->next;
                }
                if(temp ==NULL){
                    return 0;
                }
                prev->next = temp->next;
                delete temp;
            }
            return true;
            //theSize--;
        }
        return false;
    }
private:
    Node<Object> *head;
    int theSize;
};
 int main()
 {
     singleList<int> *lst = new singleList<int>();
     lst->add(10);
     lst->add(12);
     lst->add(15);
     lst->add(6);
     lst->add(3);
     lst->add(8);
     lst->add(3);
     lst->add(18);
     lst->add(5);
     lst->add(15);
     cout << "The original linked list: ";
     lst->print();
     cout << endl;
     lst->remove(6);
     lst->remove(15);
     cout << "The updated linked list: ";
     lst->print();
     cout << endl;
     cout << "The number of node in the list: " << lst->size() << endl;
     return 0;
 }
so the output is supposed to be the following:
The original linked list: 5 18 8 3 6 15 12 10
The update linked list: 5 18 8 3 12 10
The number of node in the list: 6
my output gives the original linked list part but then gives a segmentation fault (core dumped) error. I am not sure where my code is wrong but i think it is in my remove().
Some help will definitely be appreciated.
 
    