C Program to Insert a Node at the middle of a Linked List
Insertion in the middle of a Linked List in C
We will look at different methods to do insertion in the middle of a Singly Linked list in C
We will look at two different methods –
- Method 1: Uses additional size variable to keep track of Linked List Size
- Method 2: No additional variable, we calculate the size in realtime
Now lets have look on how to write a routine to add a node in the middle of the linked list
Method 1
Method 2
Method 1
Run
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node *next;
};
int size = 0;
void insertMiddle (struct Node **head, int data)
{
struct Node *newNode = (struct Node *) malloc (sizeof (struct Node));
newNode->data = data;
// if the LL was empty
if (*head == NULL)
{
newNode->data = data;
newNode->next = *head;
*head = newNode;
size++;
return;
}
// otherwise
struct Node *temp = *head;
// find correct insertion position for middle
int mid = (size % 2 == 0) ? (size / 2) : (size + 1) / 2;
// traverse to current mid position
while (--mid)
{
temp = temp->next;
}
newNode->next = temp->next;
temp->next = newNode;
size++;
}
void display (struct Node *node)
{
printf ("Linked List : ");
// as linked list will end when Node is Null
while (node != NULL)
{
printf ("%d ", node->data);
node = node->next;
}
printf ("\n\n");
}
int main ()
{
//creating 2 pointers of type struct Node
//So these can point to address of struct type variable
struct Node *head = NULL;
struct Node *node2 = NULL;
// allocate 3 nodes in the heap
head = (struct Node *) malloc (sizeof (struct Node));
node2 = (struct Node *) malloc (sizeof (struct Node));
head->data = 10; // data set for head node
head->next = node2; // next pointer assigned to address of node2
node2->data = 50;
node2->next = NULL;
size = 2;
display (head);
insertMiddle (&head, 20);
display (head);
insertMiddle (&head, 40);
display (head);
insertMiddle (&head, 30);
display (head);
return 0;
}
Output
Linked List : 10 50 Linked List : 10 20 50 Linked List : 10 20 40 50 Linked List : 10 20 30 40 50
Method 2
Run
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node *next;
};
int getCurrSize (struct Node *node)
{
int size = 0;
while (node != NULL)
{
node = node->next;
size++;
}
return size;
}
void insertMiddle (struct Node **head, int data)
{
struct Node *newNode = (struct Node *) malloc (sizeof (struct Node));
newNode->data = data;
// if the LL was empty
if (*head == NULL)
{
newNode->data = data;
newNode->next = *head;
*head = newNode;
return;
}
// otherwise
struct Node *temp = *head;
int size = getCurrSize (*head);
// find correct insertion position for middle
int mid = (size % 2 == 0) ? (size / 2) : (size + 1) / 2;
// traverse to current mid position
while (--mid)
{
temp = temp->next;
}
newNode->next = temp->next;
temp->next = newNode;
}
void display (struct Node *node)
{
printf ("Linked List : ");
// as linked list will end when Node is Null
while (node != NULL)
{
printf ("%d ", node->data);
node = node->next;
}
printf ("\n\n");
}
int main ()
{
//creating 4 pointers of type struct Node
//So these can point to address of struct type variable
struct Node *head = NULL;
struct Node *node2 = NULL;
// allocate 3 nodes in the heap
head = (struct Node *) malloc (sizeof (struct Node));
node2 = (struct Node *) malloc (sizeof (struct Node));
head->data = 10; // data set for head node
head->next = node2; // next pointer assigned to address of node2
node2->data = 50;
node2->next = NULL;
display (head);
insertMiddle (&head, 20);
display (head);
insertMiddle (&head, 40);
display (head);
insertMiddle (&head, 30);
display (head);
return 0;
}
Output
Linked List : 10 50 Linked List : 10 20 50 Linked List : 10 20 40 50 Linked List : 10 20 30 40 50

Login/Signup to comment