variable initialization using class meber function : why the head is not NULL at the beginning if I initialized it with the class member function. It is a tricky part. Thanks in advance.

    #include <iostream>
    using namespace std;
    
    struct node
    {
        int data;
        node *next;
    };
    
    
    class linked_list
    {
    private:
        node *head;
    public:
    //    linked_list();
    //    ~linked_list();
        void push(node *head, int data);
        void printList(node *head);
        void printMiddle(node *head);
        void makeHeadNull();
    };
    
    void linked_list::push(node *head, int data)
    {
        node *newNode=new node;
        if(head==NULL)
        {
            head=newNode;
        }
        else {
            newNode->data = data;
            newNode->next = head;
            head = newNode;
        }
    }
    
    //linked_list::linked_list():head(NULL)
    //{
    //
    //}
    //linked_list::~linked_list() {
    //    delete head;
    //}
    
    //void linked_list::printMiddle(node *head)
    //{
    //    int count=0;
    //    node *temp=head;
    //    while(temp!=NULL)
    //    {
    //        temp=temp->next;
    //        count++;
    //
    //    }
    //    int i=0;
    //    while(i<count/2)
    //    {
    //        head=head->next;
    //        i++;
    //    }
    //    if(head->next!=NULL)
    //    {
    //        cout<<head->next->data<<" ";
    //    }
    //}
    
    void linked_list::printMiddle(node *head)
    {
    
            node *slow_ptr = head;
            node *fast_ptr = head;
    
            if (head!=NULL)
            {
                while (fast_ptr != NULL && fast_ptr->next != NULL)
                {
                    fast_ptr = fast_ptr->next->next;
                    slow_ptr = slow_ptr->next;
                }
                printf("The middle element is [%d]\n\n", slow_ptr->data);
            }
        }
    
    
    
    void linked_list::printList(node *head)
    {
        while(head!=NULL)
        {
            cout<<head->data<<" ";
            head=head->next;
    
        }
    }
    
    void linked_list::makeHeadNull()
    {
        head=NULL;
    }
    
    
    
    int main()
    {
        node *head;
        linked_list l;
        l.makeHeadNull();
    
    
        l.push(head, 0);
        l.push(head, 1);
        l.push(head, 2);
        l.push(head, 3);
        l.push(head, 4);
    
        l.printMiddle(head);
    }

I wanted to initialize head inside a constructor, but when I initialized head like that, the head node has always been NULL inside main. When I initialize head in the constructor and then I want to pass it as a parameter of a function push I get errors.