C Programming Reverse the Linked List

How to reverse the linked list?

Linked list are not stored in adjacent locations and array occupy continuous locations.

Printing nodes from tail to head pointer.

C Program to Reverse the Linked List

#include<stdio.h>  

//structure contains data and link
struct node
{
    int data;
    struct node *link;
};

void append(struct node **head, int data)
{
    struct node *temp, *tail;
    temp = *head;

    // if linked list is empty, adding as first node.
    if(*head == NULL)
    {
        temp = malloc( sizeof (struct node));
        temp->data = data;
        temp->link = NULL;
        *head = temp;
    }
    // adding in the last if linked list is not empty
    else
    {
        //Move to last node
        while(temp->link != NULL)
        {
            temp = temp->link;
        }
        tail = malloc( sizeof (struct node));
        tail->data = data;
        tail->link = NULL;
        temp->link = tail;
    }
    
}

// displays the linked list from head to tail nodes
void display(struct node *head)
{
    printf("\n");
    // traversing entire linked list
    printf("\nhead==>");
    while(head != NULL)
    {
        printf("%d-->", head->data);
        head = head->link;
    }
    printf("tail");
}

// finds the number of nodes added in the linked list.
int count(struct node *head)
{
    int c = 0;
    while(head != NULL)                                                         
    {                                                                           
        head = head->link;          
        c++;
    } 
    return c;
}

// deletes the linked list elements
int delete(struct node **head, int data)
{
    struct node *old, *temp;
    temp = *head;

    while(temp != NULL)
    {
        if(temp->data == data)
        {
            // deleting first node if data matches
            if(temp == *head)
            {
                *head = temp->link;
                free(temp);
                return 1;
            }
            // deleting other nodes except first node
            else
            {
                old->link = temp->link;
                free(temp);
                return 1;
            }
        }
        // old points to the previous node
        old = temp;
        temp = temp->link;
    }
    return 0;
}

// reverses the linked list from tail to head nodes
void reverse(struct node **head)
{
    struct node *temp1, *temp2, *temp3;
    temp1 = *head;
    temp2 = NULL;

    while(temp1!=NULL)
    {
        temp3 = temp2;
        temp2 = temp1;
        temp1 = temp1->link;
        temp2->link = temp3;
    }
    *head = temp2;
}


void main()                                                                     
{       
    int op, data, loc;                                                                        
    struct node *ptr;                                                           
    // Empty linked list                                                        
    ptr = NULL;                                                                 
                                                                                
    printf("\nNumber of elements in the linked list: %d", count(ptr));          
    append(&ptr, 1);                                                            
    append(&ptr, 2);                                                            
    append(&ptr, 3);                                                            
                                                                                
    display(ptr);       
    printf("\nNumber of elements in the linked list: %d", count(ptr));

    do
    {
        printf("\nLinked List\n---------------\n1.Add element in end\n2.reverse\n3.delete\n4.display\n5.count\n0.exit");
        printf("\nEnter choice: ");
        scanf("%d", &op);
        switch(op)
        {
            case 1:
                printf("\nEnter element: ");                                    
                scanf("%d", &data);                                             
                append(&ptr, data);  
                break;
            case 2:
                printf("\nReverse linked list: ");
                reverse(&ptr);
                break;
                
            case 3:
                printf("\nEnter element: ");                                    
                scanf("%d", &data);                                             
                delete(&ptr, data);  
                break;
            case 4:
                display(ptr);
                break;
            case 5:
                printf("\nNumber of elements in the linked list: %d", count(ptr));
                break;
        }
    }while(op>=1 && op<=4);
}       
                                                                                                                                                                                                                                                                                                                                                                                                           
Compilation:
$ cc reverse-linked-list.c 
reverse-linked-list.c: In function ‘append’:
reverse-linked-list.c:18:16: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration]
         temp = malloc( sizeof (struct node));
                ^~~~~~
reverse-linked-list.c:18:16: warning: incompatible implicit declaration of built-in function ‘malloc’
reverse-linked-list.c:18:16: note: include ‘’ or provide a declaration of ‘malloc’
reverse-linked-list.c:31:16: warning: incompatible implicit declaration of built-in function ‘malloc’
         tail = malloc( sizeof (struct node));
                ^~~~~~
reverse-linked-list.c:31:16: note: include ‘’ or provide a declaration of ‘malloc’
reverse-linked-list.c: In function ‘delete’:
reverse-linked-list.c:76:17: warning: implicit declaration of function ‘free’ [-Wimplicit-function-declaration]
                 free(temp);
                 ^~~~
reverse-linked-list.c:76:17: warning: incompatible implicit declaration of built-in function ‘free’
reverse-linked-list.c:76:17: note: include ‘’ or provide a declaration of ‘free’
reverse-linked-list.c:83:17: warning: incompatible implicit declaration of built-in function ‘free’
                 free(temp);
                 ^~~~
reverse-linked-list.c:83:17: note: include ‘’ or provide a declaration of ‘free’
Output:
$ ./a.out 

Number of elements in the linked list: 0

head==>1-->2-->3-->tail
Number of elements in the linked list: 3
Linked List
---------------
1.Add element in end
2.reverse
3.delete
4.display
5.count
0.exit
Enter choice: 1

Enter element: 4

Linked List
---------------
1.Add element in end
2.reverse
3.delete
4.display
5.count
0.exit
Enter choice: 4


head==>1-->2-->3-->4-->tail
Linked List
---------------
1.Add element in end
2.reverse
3.delete
4.display
5.count
0.exit
Enter choice: 2

Reverse linked list
Linked List
---------------
1.Add element in end
2.reverse
3.delete
4.display
5.count
0.exit
Enter choice: 4


head==>4-->3-->2-->1-->tail
Linked List
---------------
1.Add element in end
2.reverse
3.delete
4.display
5.count
0.exit
Enter choice: 5

Number of elements in the linked list: 4
Linked List
---------------
1.Add element in end
2.reverse
3.delete
4.display
5.count
0.exit
Enter choice: 2

Reverse linked list
Linked List
---------------
1.Add element in end
2.reverse
3.delete
4.display
5.count
0.exit
Enter choice: 4


head==>1-->2-->3-->4-->tail
Linked List
---------------
1.Add element in end
2.reverse
3.delete
4.display
5.count
0.exit
Enter choice: 0



C Programming Examples

C Program To Implement Linked List and Operations

C Program To Implement Sorted Linked List and Operations

C Program to Reverse the Linked List

C Program to Stack and Operations using Linked List

C Program to Queue and Operations using Linked List

C Program to calculate multiplication of two numbers using pointers

C Program To Calculate Median

C Program To Calculate Standard Deviation

C Program For Fahrenheit To Celsius Conversion

C Program To Calculate Average

C Program For Quadratic Equations

C Program To Check Character Type

C Program To Find Largest Of Three Values

C Program To Find Max Value In Array

C Program To Find Min Value In Array

C Program To Print Multiplication Table

C Program For Frequency Counting

C Program To Read A Line Of Text

C Program To Find ASCII Value For Any Character

C Program To Find A Character Is Number, Alphabet, Operator, or Special Character

C Program To Find Reverse Case For Any Alphhabet using ctype functions

C Program To Find Number Of Vowels In Input String

C Program Pointers Example Code

C Program To Find Leap Year Or Not

C Program To Swap Two Integers Using Call By Reference

C Program To Swap Two Integers Without Using Third Variable

C Program To List Prime Numbers Upto Limit

C Program To List Composite Numbers Upto Limit

C Program To Calculate Compound Interest

C Program To Calculate Depreciation Amount After of Before Few Years

C Program To Calculate Profit Percentage

C Program To Calculate Loss Percentage

C Program To Find String Is Polindrome Or Not

C Program To Find Factorial of a Number

C Program To Check Number is a Polindrome or Not

C Program To Generate Random Integers

C Program To Generate Random Float Numbers

C Program to find Square Root of a Number

C Program to find Area of a Rectangle

C Program to find Perimeter of a Rectangle

C Program to find Area of a Square

C Program to find Area of a Triangle

C Program to find Area of a Parallelogram

C Program to find Area of a Rhombus

C Program to find Area of a Trapezium

C Program to find Area of a Circle and Semi-circle

C Program to find Circumference of a Circle and Semi-circle

C Program to find length of an arc

C Program to find Area of a Sector

Privacy Policy  |  Copyright@2017 - All Rights Reserved.  |  Contact us   |  Report website issues in Github   |  Facebook page   |  Google+ page

Email Facebook Google LinkedIn Twitter
^