w3resource

C Exercises: Insert new node at any position in a doubly linked list


5. Insert at Any Position in Doubly Linked List

Write a program in C to insert a new node at any position in a doubly linked list.

Visual Presentation:

C Exercises: Insert new node at any position in a doubly linked list

Sample Solution:

C Code:

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

struct node {
    int num;
    struct node *preptr;
    struct node *nextptr;
} *stnode, *ennode;

// Function prototypes
void DlListcreation(int n);
void DlLinsertNodeAtBeginning(int num);
void DlLinsertNodeAtEnd(int num);
void DlLinsertNodeAtAny(int num, int pos);
void displayDlList(int a);

int main() {
    int n, num1, a, insPlc;
    stnode = NULL;
    ennode = NULL;

    // User input for the number of nodes
    printf("\n\n Doubly Linked List : Insert new node at any position in a doubly linked list :\n");
    printf("-----------------------------------------------------------------------------------\n");
    printf(" Input the number of nodes : ");
    scanf("%d", &n);

    // Creating the doubly linked list
    DlListcreation(n);
    a = 1;
    displayDlList(a);

    // Inserting a node at a specified position
    printf(" Input the position ( 1 to %d ) to insert a new node : ", n + 1);
    scanf("%d", &insPlc);
    printf(" Input data for the position %d : ", insPlc);
    scanf("%d", &num1);
    DlLinsertNodeAtAny(num1, insPlc);
    a = 2;
    displayDlList(a);

    return 0;
}

// Function to create a doubly linked list
void DlListcreation(int n) {
    int i, num;
    struct node *fnNode;

    if (n >= 1) {
        // Allocating memory for the first node
        stnode = (struct node *)malloc(sizeof(struct node));

        if (stnode != NULL) {
            // Input data for the first node
            printf(" Input data for node 1 : ");
            scanf("%d", &num);

            // Initializing values for the first node
            stnode->num = num;
            stnode->preptr = NULL;
            stnode->nextptr = NULL;
            ennode = stnode;

            // Loop to create subsequent nodes and link them
            for (i = 2; i <= n; i++) {
                fnNode = (struct node *)malloc(sizeof(struct node));
                if (fnNode != NULL) {
                    printf(" Input data for node %d : ", i);
                    scanf("%d", &num);
                    fnNode->num = num;
                    fnNode->preptr = ennode;    // Linking new node with the previous node
                    fnNode->nextptr = NULL;     // Setting next address of fnNode as NULL
                    ennode->nextptr = fnNode;   // Linking previous node with the new node
                    ennode = fnNode;            // Assigning new node as last node
                } else {
                    printf(" Memory can not be allocated.");
                    break;
                }
            }
        } else {
            printf(" Memory can not be allocated.");
        }
    }
}

// Function to insert a node at a specified position in the doubly linked list
void DlLinsertNodeAtAny(int num, int pos) {
    int i;
    struct node *newnode, *tmp;
    if (ennode == NULL) {
        printf(" No data found in the list!\n");
    } else {
        tmp = stnode;
        i = 1;
        while (i < pos - 1 && tmp != NULL) {
            tmp = tmp->nextptr;
            i++;
        }
        if (pos == 1) {
            DlLinsertNodeAtBeginning(num);
        } else if (tmp == ennode) {
            DlLinsertNodeAtEnd(num);
        } else if (tmp != NULL) {
            newnode = (struct node *)malloc(sizeof(struct node));
            newnode->num = num;
            // Linking next address of new node with the next address of tmp node
            newnode->nextptr = tmp->nextptr;
            // Linking previous address of new node with the tmp node
            newnode->preptr = tmp;
            if (tmp->nextptr != NULL) {
                tmp->nextptr->preptr = newnode; // (n+1)th node is linking with new node
            }
            tmp->nextptr = newnode; // (n-1)th node is linking with new node 
        } else {
            printf(" The position you entered is invalid.\n");
        }
    }
}

// Function to insert a node at the beginning of the doubly linked list
void DlLinsertNodeAtBeginning(int num) {
    struct node *newnode;
    if (stnode == NULL) {
        printf(" No data found in the list!\n");
    } else {
        newnode = (struct node *)malloc(sizeof(struct node));
        newnode->num = num;
        newnode->nextptr = stnode;  // Linking next address of new node with starting node
        newnode->preptr = NULL;     // Setting previous address field of new node as NULL
        stnode->preptr = newnode;   // Linking previous address of starting node with new node
        stnode = newnode;           // Setting the new node as starting node
    }
}

// Function to insert a node at the end of the doubly linked list
void DlLinsertNodeAtEnd(int num) {
    struct node *newnode;

    if (ennode == NULL) {
        printf(" No data found in the list!\n");
    } else {
        newnode = (struct node *)malloc(sizeof(struct node));
        newnode->num = num;
        newnode->nextptr = NULL;        // Setting next address field of new node as NULL
        newnode->preptr = ennode;       // Linking previous address of new node with ending node
        ennode->nextptr = newnode;      // Linking next address of ending node with new node
        ennode = newnode;               // Setting the new node as ending node  
    }
}

// Function to display the doubly linked list
void displayDlList(int m) {
    struct node *tmp;
    int n = 1;
    if (stnode == NULL) {
        printf(" No data found in the List yet.");
    } else {
        tmp = stnode;
        if (m == 1) {
            printf("\n Data entered in the list are :\n");
        } else {
            printf("\n After insertion the new list are :\n");
        }
        // Loop to display nodes and their data
        while (tmp != NULL) {
            printf(" node %d : %d\n", n, tmp->num);
            n++;
            tmp = tmp->nextptr; // Moving the current pointer to the next node
        }
    }
}

Sample Output:

 Doubly Linked List : Insert new node at any position in a doubly linked list :                               
-----------------------------------------------------------------------------------                           
 Input the number of nodes : 3                                                                                
 Input data for node 1 : 2                                                                                    
 Input data for node 2 : 5                                                                                    
 Input data for node 3 : 8                                                                                    
                                                                                                              
 Data entered in the list are :                                                                               
 node 1 : 2                                                                                                   
 node 2 : 5                                                                                                   
 node 3 : 8                                                                                                   
 Input the position ( 1 to 4 ) to insert a new node : 4                                                       
 Input data for the position 4 : 9                                                                            
                                                                                                              
 After insertion the new list are :                                                                           
 node 1 : 2                                                                                                   
 node 2 : 5                                                                                                   
 node 3 : 8                                                                                                   
 node 4 : 9

Flowchart:

Flowchart: Insert new node at any position in a doubly linked list

DlListcreation() :

Flowchart: Insert new node at any position in a doubly linked list

DlLinsertNodeAtAny() :

Flowchart: Insert new node at any position in a doubly linked list

DlLinsertNodeAtBeginning() :

Flowchart: Insert new node at any position in a doubly linked list

DlLinsertNodeAtEnd() :

Flowchart: Insert new node at any position in a doubly linked list

displayDlList() :

Flowchart: Insert new node at any position in a doubly linked list


For more Practice: Solve these Related Problems:

  • Write a C program to insert a node at a user-specified position in a doubly linked list with full boundary checking.
  • Write a C program to insert a node into a doubly linked list while maintaining the list’s sorted order.
  • Write a C program to insert a node at any given position in a doubly linked list and then display the list from both the head and tail.
  • Write a C program to insert a node at a specified position using recursion to locate the insertion point in the doubly linked list.

Go to:


PREV : Insert at End of Doubly Linked List.
NEXT : Insert in the Middle of Doubly Linked List.

C Programming Code Editor:



Have another way to solve this solution? Contribute your code (and comments) through Disqus.

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.



Follow us on Facebook and Twitter for latest update.