Write a program that uses functions to perform the following - Create a singly linked list of integers - Insert a given integer in the above linked list at beginning, middle and end. - Delete a given integr in the above linked list at beginning, middle and end. - Display the contents of the list after deletion.
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *create_node(int data) {
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
return new_node;
}
void insert_head(Node **head, int data) {
// as we are modiying the head itself, we also need to change the head
// reference pointer
Node *new_node = create_node(data);
new_node->next = *head;
*head = new_node;
}
void insert_end(Node *head, int data) {
Node *new_node = create_node(data);
Node *ptr = head;
while (ptr->next != NULL) {
ptr = ptr->next;
}
ptr->next = new_node;
}
void insert_middle(Node *head, int data, int index) {
Node *new_node = create_node(data);
int i = 0;
Node *next = head;
while (next != NULL) {
if (i++ == index) {
new_node->next = next->next;
next->next = new_node;
return;
// ^ early return
}
next = next->next;
}
printf("\tIndex %d not found in Linked List\n", index);
}
void delete_head(Node **head) {
Node *new_head = (*head)->next;
free(*head);
*head = new_head;
}
void delete_end(Node *head) {
Node *next = head;
Node *prev = NULL;
while (next->next != NULL) {
prev = next;
next = next->next;
}
prev->next = NULL;
free(next);
}
void delete_middle(Node *head, int index) {
int i = 0;
Node *next = head;
Node *tmp = NULL;
while (next != NULL) {
if (++i == index && next->next != NULL) {
tmp = next->next;
next->next = tmp->next;
free(tmp);
return;
}
next = next->next;
}
printf("\tIndex %d not found in Linked List\n", index);
}
void print_lnk_list(Node *head) {
Node *next = head;
while (next != NULL) {
printf("%d, ", next->data);
next = next->next;
}
}
void reverse_list(Node **node) {
Node *prev = NULL;
Node *next = NULL;
while (*node != NULL) {
next = (*node)->next;
(*node)->next = prev;
prev = *node;
*node = next;
}
*node = prev;
}
int main() {
Node *head = create_node(10);
// inserting elements
insert_head(&head, 21);
insert_head(&head, 20);
insert_end(head, 2);
insert_end(head, 3);
insert_end(head, 4);
insert_end(head, 5);
insert_end(head, 6);
insert_head(&head, 1);
insert_middle(head, 100, 3);
printf("Linked List Elements After Insertion: \n");
print_lnk_list(head);
printf("\n");
// This inserts the Node after Index 3 (after 4th element)
// deleting nodes
delete_head(&head);
delete_end(head);
delete_middle(head, 2);
printf("Linked List Elements After Deletion: \n");
print_lnk_list(head);
printf("\n");
printf("Linked List Reversed: \n");
reverse_list(&head);
print_lnk_list(head);
printf("\n");
return 0;
}