#include <iostream>

struct node
{
    int data;
    node* next;
};
node *head = NULL;

void insertFirst(int data)
{
    node *newNode = new node;
    newNode->data = data;
    newNode->next = head;
    head = newNode;
}

void deleteFirst()
{
    if (head != NULL)
    {
        node *temp = head;
        head = head->next;
        delete temp;
    }
}

void deleteLast()
{
    if (head != NULL)
    {
        node **temp = &head;

        while ((*temp)->next != NULL) {
            temp = &((*temp)->next);
        }

        delete *temp;
        *temp = NULL;
    }
}

void deleteAll()
{
    while (head != NULL)
    {
        node *temp = head->next;
        delete head;
        head = temp;
    }
}

void print()
{
    if (head != NULL)
    {
	    node *temp = head;
    	while (temp != NULL)
    	{
        	std::cout << temp->data << " ";
        	temp = temp->next;
    	}
    }
    else
    	std::cout << "<empty>";
    std::cout << "\n";
}

int main()
{
    insertFirst(10);
    insertFirst(20);
    insertFirst(30);
    print();

    deleteLast();
    insertFirst(40);
    print();

    deleteAll();
    print();

    return 0;
}