Here we’ll see how to write C program to delete a node from singly linked list. In this example, the node to be deleted will be identified by the value of the node.
Logic to Delete a Node from Singly Linked List
- If the first node (where the head points to) matches with the value to be deleted.
- Point head where the first node points to.
- delete the first node.
- Start traverse list starting from head (head is assigned to tmp in our example program below).
- If the next node exists (not NULL) and the value of the next node matches with the value to be deleted.
- Point the current node (pointed by tmp) where the next node points to.
- Delete the next node.
- Otherwise, move to the next node.
- If the next node exists (not NULL) and the value of the next node matches with the value to be deleted.
C Program to Delete a Node from Singly Linked List
#include <stdio.h> #include <stdlib.h> struct node{ int val; struct node *next; }; void print_list(struct node *head) { printf("H->"); while(head) { printf("%d->", head->val); head = head->next; } printf("|||\n"); } void insert_front(struct node **head, int value) { struct node * new_node = NULL; new_node = (struct node *)malloc(sizeof(struct node)); if (new_node == NULL) { printf("Failed to insert element. Out of memory"); } new_node->val = value; new_node->next = *head; *head = new_node; } void delete_node(struct node **head, int val) { struct node *tmp = NULL; struct node *tmp1 = NULL; if (head == NULL || *head == NULL) return; if((*head)->val == val) { /*Delete the head node*/ tmp = *head; *head = (*head)->next; free(tmp); return; } tmp = *head; while(tmp->next && tmp->next->val != val) tmp = tmp->next; if(tmp->next) { tmp1 = tmp->next; tmp->next = tmp1->next; free(tmp1); } else { printf("%d not found in the list.\n", val); } } void main() { int count = 0, i, val; struct node * head = NULL; printf("Enter number of elements: "); scanf("%d", &count); for (i = 0; i < count; i++) { printf("Enter %dth element: ", i); scanf("%d", &val); insert_front(&head, val); } printf("Initial List: "); print_list(head); printf("Enter a value to delete from the list: "); scanf("%d", &val); delete_node(&head, val); printf("List after deletion: "); print_list(head); }
Output:
Enter number of elements: 5 Enter 0th element: 43 Enter 1th element: 5 Enter 2th element: 10 Enter 3th element: 23 Enter 4th element: 78 Initial List: H->78->23->10->5->43->||| Enter a value to delete from the list: 10 List after deletion: H->78->23->5->43->|||
In this example program delete_node() function implemented the logic described above. print_list() is used to print the list and inset_front() is used to create the list.
Read also: