C program to delete last node of Singly Linked List

Write a C program to create a singly linked list of n nodes and delete the last node of the list. How to delete last node of a singly linked list in C. Algorithm to delete last node from a singly linked list. Steps to remove last node from singly linked list.

Delete last node from singly linked list

Required knowledge

Basic C programming, Functions, Singly Linked List, Dynamic memory allocation

Algorithm to delete last node of Singly Linked List

Algorithm to delete last node of Singly Linked List
%%Input : head node of the linked list
Begin:
    If (head == NULL) then
        write ('List is already empty')
    End if
    Else then
        toDeletehead
        secondLastNodehead
        While (toDelete.next != NULL) do
            secondLastNodetoDelete
            toDeletetoDelete.next
        End while
        If (toDelete == head) then
            headNULL
        End if
        Else then
            secondLastNode.nextNULL
        End else
        unalloc (toDelete)
    End else
End

Steps to delete last node of a Singly Linked List

  1. Traverse to the last node of the linked list keeping track of the second last node in some temp variable say secondLastNode.
    Deletion of last node from singly linked list1
  2. If the last node is the head node then make the head node as NULL else disconnect the second last node with the last node i.e. secondLastNode->next = NULL.
    Deletion of last node of singly linked list2
  3. Free the memory occupied by the last node.
    Deletion of last node of singly linked list3

Program to delete last node of Singly Linked List

/**
 * C program to delete last node of Singly Linked List
 */

#include <stdio.h>
#include <stdlib.h>


/* Structure of a node */
struct node {
    int data;          // Data
    struct node *next; // Address 
}*head;

void createList(int n);
void deleteLastNode();
void displayList();


int main()
{
    int n, choice;

    /*
     * Create a singly linked list of n nodes
     */
    printf("Enter the total number of nodes: ");
    scanf("%d", &n);
    createList(n);

    printf("\nData in the list \n");
    displayList();

    printf("\nPress 1 to delete last node: ");
    scanf("%d", &choice);

    /* Delete last node from list */
    if(choice == 1)
        deleteLastNode();

    printf("\nData in the list \n");
    displayList();

    return 0;
}


/*
 * Create a list of n nodes
 */
void createList(int n)
{
    struct node *newNode, *temp;
    int data, i;

    head = (struct node *)malloc(sizeof(struct node));

    /*
     * If unable to allocate memory for head node
     */
    if(head == NULL)
    {
        printf("Unable to allocate memory.");
    }
    else
    {
        /*
         * Input data of node from the user
         */
        printf("Enter the data of node 1: ");
        scanf("%d", &data);

        head->data = data; // Link the data field with data
        head->next = NULL; // Link the address field to NULL

        temp = head;

        /*
         * Create n nodes and adds to linked list
         */
        for(i=2; i<=n; i++)
        {
            newNode = (struct node *)malloc(sizeof(struct node));

            /* If memory is not allocated for newNode */
            if(newNode == NULL)
            {
                printf("Unable to allocate memory.");
                break;
            }
            else
            {
                printf("Enter the data of node %d: ", i);
                scanf("%d", &data);

                newNode->data = data; // Link the data field of newNode with data
                newNode->next = NULL; // Link the address field of newNode with NULL

                temp->next = newNode; // Link previous node i.e. temp to the newNode
                temp = temp->next;
            }
        }

        printf("SINGLY LINKED LIST CREATED SUCCESSFULLY\n");
    }
}


/*
 * Delete last node of the linked list
 */
void deleteLastNode()
{
    struct node *toDelete, *secondLastNode;

    if(head == NULL)
    {
        printf("List is already empty.");
    }
    else
    {
        toDelete = head;
        secondLastNode = head;

        /* Traverse to the last node of the list */
        while(toDelete->next != NULL)
        {
            secondLastNode = toDelete;
            toDelete = toDelete->next;
        }

        if(toDelete == head)
        {
            head = NULL;
        }
        else
        {
            /* Disconnect link of second last node with last node */
            secondLastNode->next = NULL;
        }

        /* Delete the last node */
        free(toDelete);

        printf("SUCCESSFULLY DELETED LAST NODE OF LIST\n");
    }
}


/*
 * Display entire list
 */
void displayList()
{
    struct node *temp;

    /*
     * If the list is empty i.e. head = NULL
     */
    if(head == NULL)
    {
        printf("List is empty.");
    }
    else
    {
        temp = head;
        while(temp != NULL)
        {
            printf("Data = %d\n", temp->data); // Print the data of current node
            temp = temp->next;                // Move to next node
        }
    }
}
Enter the total number of nodes: 5
Enter the data of node 1: 10
Enter the data of node 2: 20
Enter the data of node 3: 30
Enter the data of node 4: 40
Enter the data of node 5: 50
SINGLY LINKED LIST CREATED SUCCESSFULLY

Data in the list
Data = 10
Data = 20
Data = 30
Data = 40
Data = 50

Press 1 to delete last node: 1
SUCCESSFULLY DELETED LAST NODE OF LIST

Data in the list
Data = 10
Data = 20
Data = 30
Data = 40