In my previous article, I explained the basic concepts of a linked list along with its advantages and disadvantages. In this article, I will show you how to insert a new node into an existing linked list.
Earlier, I shared an example where I created a linked list with four nodes. While that example was useful for understanding how to build a linked list, it wasn’t generic or reusable.
In this article, I’ll create a generic function to insert a new node into an existing linked list, allowing flexibility based on the user’s requirement.
There are three common ways to insert a new node in a linked list:
-
At the beginning of the list
-
After a specific node in the list
-
At the end of the list
Insert a Node at the Beginning of the Linked List in C:
To insert a new node at the beginning of a linked list, follow these simple steps:
🟩👉 Allocate memory for the new node using malloc():
NodePointer pNewNode = malloc(sizeof(NodeType));
🟩👉 Store the data in the newly created node, if memory allocation is successful:
if (pNewNode != NULL) { pNewNode->iData = Value; }
🟩👉 Link the new node to the existing list by setting its pNextNode pointer to the current head node.
if (pNewNode != NULL) { pNewNode->pNextNode = head; }
🟩👉 Update the head pointer to point to the new node:
Head = pNewNode;
Below is a sample implementation of a function that inserts a new node at the beginning of the linked list:
/** * @brief Insert a node at the beginning of the list. * * @param[in,out] pHead Pointer to head pointer. * @param[in] value Data to insert. * * @return 0 on success, -1 on failure. */ int InsertAtBeginning(NodePtr* pHead, int value) { int status = -1; NodePtr newNode = (NodePtr)malloc(sizeof(Node)); if (newNode != NULL) { newNode->data = value; newNode->next = *pHead; *pHead = newNode; status = 0; } return status; }
Insert a new node after a node:
In a linked list, data is not stored in contiguous memory, so to reach a specific node, we must always start traversing from the head. Below are the steps to insert a new node after a given position in the linked list:
1. Initialize a temporary pointer and assign it the address of the first node (i.e., the head of the list):
NodePointer pTmpNode = head;
2. Traverse the list to reach the node after which you want to insert the new node:
unsigned int count = 1; // Traverse to the specified position while ((tempNode != NULL) && (count < position)) { tempNode = tempNode->pNextNode; count++; }
3. Verify the existence of the target node (pTmpNode). If it exists, allocate memory for the new node.
if (pTmpNode != NULL) { NodePointer pNewNode = malloc(sizeof(NodeType)); // Here your code }
4. Store the data in the newly created node, if memory allocation was successful:
if(pNewNode != NULL) { pNewNode->iData = Value; }
5. Link the new node by setting its pNextNode to point to the next node of the temporary node:
pNewNode->pNextNode = pTmpNode->pNextNode;
6. Update the temporary node’s link to point to the newly created node:
pTmpNode->pNextNode = pNewNode;
/* * Inserts a new node with the given data after the specified position in the linked list. * * @param pHead Pointer to the head pointer of the linked list * @param value Data to store in the new node * @param position Position after which the new node should be inserted (1-based index) * * @return 0 on success, -1 on failure */ int InsertNodeAfter(NodePointer *pHead, int value, unsigned int position) { int retValue = -1; unsigned int count = 1; NodePointer tempNode = NULL; NodePointer newNode = NULL; // Validate head pointer if ((pHead != NULL) && (*pHead != NULL)) { tempNode = *pHead; // Traverse to the specified position while (count < position && tempNode != NULL) { tempNode = tempNode->pNextNode; count++; } if (tempNode != NULL) { // Allocate memory for the new node newNode = malloc(sizeof(NodeType)); if (newNode != NULL) { // Set node data and links newNode->iData = value; newNode->pNextNode = tempNode->pNextNode; tempNode->pNextNode = newNode; retValue = 0; // success } else { printf("Memory allocation failed.\n"); } } else { printf("Invalid position: exceeds list length.\n"); } } else { printf("Invalid head pointer.\n"); } return retValue; }
Insert a Node at the End of the Linked List:
Appending a new node to the end of a linked list is a common operation. Below are the steps to insert a node at the end of an existing linked list:
🔧 Steps to Append a Node:
1. Create a temporary pointer and assign it the address of the first node using the head pointer.
NodePointer pTmpNode = head;
2. Traverse the list to reach the last node (where pNextNode is NULL).
while (pTmpNode->pNextNode != NULL) { pTmpNode = pTmpNode->pNextNode; }
3. Allocate memory dynamically for the new node.
NodePointer pNewNode = malloc(sizeof(NodeType));
4. If memory allocation is successful, assign the user-defined value to the iData field.
if (pNewNode != NULL) { pNewNode->iData = value; // replace `value` with actual data }
5. Link the new node to the list by assigning its address to the pNextNode of the last node.
pTmpNode->pNextNode = pNewNode;
6. Mark the new node as the last node by setting its pNextNode to NULL.
pNewNode->pNextNode = NULL;
Note: Don’t forget to free the allocated memory.
Free the Allocated memory
/* Paas the reference of the head pointer of a list. This function use to free the all allocated memory*/ void FreeAllocatedMemory(NodePointer *pHead) { NodePointer pTmpNode = NULL; NodePointer pFirstNode = NULL; //Assign the Address of first node pFirstNode = *pHead; /*check if pFirstNode is NULL, then now list is empty, so assign NULL to head and return.*/ while (pFirstNode != NULL) { /*Save the pFirstNode in a pTmpNode node pointer*/ pTmpNode = pFirstNode ; /*Assign the address of next on your list*/ pFirstNode = pFirstNode->pNextNode; //Free the allocated memory free(pTmpNode ); } //Assign NULL to the head pointer *pHead = NULL; }
In below program, I am creating a linked list where I am adding the node at the beginning, end and at any position of the linked list.
// A simple C program to introduce a linked list #include<stdio.h> #include<stdlib.h> // Creating Node struct Node { /*Data field*/ int iData; /*Node Pointer*/ struct Node *pNextNode; }; // Define the new type Node type and Node pointer typedef struct Node NodeType, * NodePointer; /* Paas the reference of the head pointer of a list and an integer data. This function use to add the node at the beginning*/ int InsertNodeAtBeginning(NodePointer * pHead, int iUserData) { int iRetValue = -1; // Call malloc to allocate memory in heap for the new node NodePointer pNewNode = malloc(sizeof(NodeType)); if( pNewNode != NULL) //Check allocated memory { pNewNode->iData = iUserData; //put the desire Data pNewNode->pNextNode = *pHead; //Give the Address of first Node *pHead = pNewNode; // Assign the Address of New Node to Head iRetValue = 0; // Update the return value } return iRetValue; } /* Paas the reference of the tempnode pointer of a list and an integer data*/ int InsertNodeAfterNode(NodePointer * pHead, int iUserData,unsigned int iPosition) { int iRetValue = -1; NodePointer pTmpNode = NULL; unsigned int iCount = 0; //Give the Address of first Node pTmpNode = *pHead; for( iCount = 1; ((iCount < iPosition) && (pTmpNode!= NULL)) ; iCount++) { pTmpNode = pTmpNode ->pNextNode; } /* check the pTmpNode*/ if (pTmpNode == NULL) { printf("Enter Position is Invalid\n"); return iRetValue; } else { /* allocate memory for the new node */ NodePointer pNewNode = malloc(sizeof(NodeType)); if( pNewNode != NULL) { //put in the data pNewNode->iData = iUserData; //Assign the address of next node to the new node pNewNode->pNextNode = pTmpNode->pNextNode; // Assign the address of new node to the previous node pTmpNode->pNextNode = pNewNode; iRetValue = 0; } } return iRetValue; } /* Paas the reference of the head pointer of a list and an integer data. This function use to add the node at the End*/ int InsertNodeAtEnd(NodePointer * pHead, int iUserData) { int iRetValue = -1; NodePointer pLastNode = NULL; NodePointer pNewNode = NULL; //Give the Address of first Node pLastNode = *pHead; // Call malloc to allocate memory in heap for the new node pNewNode = malloc(sizeof(NodeType)); if( pNewNode != NULL) //Check allocated memory { pNewNode->iData = iUserData; //put the desire Data pNewNode->pNextNode = NULL; //Give the Address of first Node iRetValue = 0; // Update the return value } // If there is no node in beginning if(pLastNode == NULL) { *pHead = pNewNode; } else { // Find the address of last node while( pLastNode ->pNextNode != NULL) { pLastNode = pLastNode ->pNextNode; } // Assign last node address pLastNode ->pNextNode = pNewNode; } return iRetValue; } /* Paas the reference of the head pointer of a list. This function use to free the all allocated memory*/ void FreeAllocatedMemory(NodePointer *pHead) { NodePointer pTmpNode = NULL; NodePointer pFirstNode = NULL; //Assign the Address of first node pFirstNode = *pHead; /*check if pFirstNode is NULL, then now list is empty, so assign NULL to head and return.*/ while (pFirstNode != NULL) { /*Save the pFirstNode in a pTmpNode node pointer*/ pTmpNode = pFirstNode ; /*Assign the address of next on your list*/ pFirstNode = pFirstNode->pNextNode; //Free the allocated memory free(pTmpNode ); } //Assign NULL to the head pointer *pHead = NULL; } // This function use to prints the data of the list from the begning //to the given list. void PrintTheList(NodePointer pNode) { //Clear the screen printf("\nLinked List is: \n\n"); while (pNode != NULL) { printf("\n %d\n\n",pNode->iData); pNode = pNode->pNextNode; } system("pause"); } //Create a linked list of certain number of nodes int CreateLinkedList(NodePointer *pHead, int iNumberofNode) { int iData = 0; int iRetValue = -1; int iCount = 0; for(iCount =0; iCount < iNumberofNode; iCount++) { /*Enter desire data*/ printf("\n\nEnter the Data = "); scanf("%d",&iData); if((*pHead) == NULL) { //Create First Node iRetValue = InsertNodeAtBeginning(pHead,iData); } else { //Add the Node at the End iRetValue = InsertNodeAtEnd(pHead,iData); } } return iRetValue; } /* Driver program to test above functions*/ int main(void) { int iChoice = 0; int iNumberNode =0; int iData = 0; int iPosition =0; /*Start with the empty list */ NodePointer head = NULL; while(1) { //Select the Choice as per the requirements printf("\n\n\ 1: Create the Linked List\n\ 2: Display The Linked List\n\ 3: Insert Node at the begninig of Linked list\n\ 4: Insert Node at the End of Linked List \n\ 5: insert Node After a Node \n\ 6: terminatethe process \n\n\n"); printf("\n\nenter your choice = "); scanf("%d",&iChoice); switch(iChoice) { case 1: printf("\n\nEnter the number of nodes = "); scanf("%d",&iNumberNode); CreateLinkedList(&head,iNumberNode); break; case 2: PrintTheList(head); break; case 3: printf("\n\nEnter the desired data = "); scanf("%d",&iData); InsertNodeAtBeginning(&head,iData); break; case 4: printf("\n\nEnter the desired data = "); scanf("%d",&iData); InsertNodeAtEnd(&head,iData); break; case 5: printf("\n\nEnter the Position = "); scanf("%d",&iPosition); printf("\nEnter the desired data = "); scanf("%d",&iData); InsertNodeAfterNode(&head,iData,iPosition); break; case 6: printf("\n\nFree the all Allocated memory\n"); FreeAllocatedMemory(&head); printf("\n\nprocess is terminated\n "); exit(1); break; } } return 0; }
OutPut:
1. Create a linked-list using two nodes.






