Sarath S Nair
Sarath S Nair

Reputation: 613

Linked List reversal in C not working

I want to do some operations with linked list in C. I have wrote some functions for this like - Insert at beginning, Insert at tail, Delete from beginning etc. In my code I tried to implement reversal of linked list. But it is not working as expected. It always print only first value.

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *link;
}*new_node,*ptr,*head = NULL,*tmp;

void create_list(int data)
{
    new_node = (struct node*) malloc(sizeof(struct node));
    head = new_node;
    new_node->link=NULL;
    new_node->data=data;
}

void insert_beginning(int data)
{

    if(head==NULL)
    {
        create_list(data);
    }
    else
    {
        new_node = (struct node*) malloc(sizeof(struct node));
        new_node->link = head;
        new_node->data=data;
        head=new_node;
    }
}
void insert_tail(int data)
{
    if(head==NULL)
    {
        create_list(data);
    }
    else
    {
        new_node = (struct node*) malloc(sizeof(struct node));
        ptr = head;
        while(ptr->link!=NULL)
        {
            ptr=ptr->link;
        }
        new_node->link = NULL;
        new_node->data=data;
        ptr->link=new_node;
    }
}
void insert_any_position(int data)
{
    int pos;
    printf("\nEnter the position: ");
    scanf("%d",&pos);
    if(pos==1)
    {
        insert_beginning(data);
    }
    else
    {
        int i=1;
        new_node = (struct node*) malloc(sizeof(struct node));
        ptr = head;
        while(ptr->link!=NULL&&i<(pos-1))
        {
            ptr=ptr->link;
            i++;
        }
        new_node->link = ptr->link;
        new_node->data=data;
        ptr->link=new_node;
    }
}
void insert_node()
{
    int choice,data;
    printf("\n1.Insert at beginning\n2.Insert at tail\n3.Insert at any position\n4.Exit\n");
    scanf("%d",&choice);
    if(choice<4)
    {
        printf("\nEnter the data to be inserted: ");
        scanf("%d",&data);
        switch(choice)
        {
        case 1:
            insert_beginning(data);
            break;
        case 2:
            insert_tail(data);
            break;
        case 3:
            insert_any_position(data);
            break;
        default:
            return;
        }
    }
    else
        return;

}

void delete_beginning()
{
    head = head->link;
}

void delete_tail()
{
    ptr=head;
    while(ptr->link!=NULL)
    {
        tmp=ptr;
        ptr=ptr->link;
    }
    tmp->link=NULL;
}
void delete_any_position()
{   int pos;
    printf("\nEnter the position: ");
    scanf("%d",&pos);
    if(pos==1)
    {
        delete_beginning();
    }
    else
    {
        ptr=head;
        int i=1;
        while(ptr->link!=NULL && i<(pos-1))
        {
            ptr=ptr->link;
            i++;
        }
        ptr->link=(ptr->link)->link;
    }

}
void delete_data()
{

}

void delete_node()
{
    int choice,data;
    printf("\n1.Delete from beginning\n2.Delete from tail\n3.Delete from any position\n4.Delete data\n5.Exit\n");
    scanf("%d",&choice);
    if(choice<5)
    {

        switch(choice)
        {
        case 1:
            delete_beginning();
            break;
        case 2:
            delete_tail();
            break;
        case 3:
            delete_any_position();
            break;
        case 4:
            printf("\nEnter the data to be deleted: ");
            scanf("%d",&data);
            delete_data(data);
            break;
        default:
            return;
        }
    }
    else
        return;
}
void display_list()
{
    ptr = head;
    while(ptr!=NULL)
    {
        printf("%d ",ptr->data);
        ptr = ptr->link;
    }
}

void display_list_recursion(struct node* ptr)
{
    if(ptr==NULL)
        return;
    else
    {
        printf("%d ",ptr->data);
        display_list_recursion(ptr->link);
    }
}
void display_list_recursion_reverse(struct node* ptr)
{
    if(ptr==NULL)
        return;
    else    
    {
        display_list_recursion_reverse(ptr->link);
        printf("%d ",ptr->data);
    }   

}

This is the function that is not working:

void reverse_list_iteration()
{
    struct node *current,*prev,*next;
    current=head;
    prev=NULL;
    while(current->link!=NULL)
    {
        next = current->link;
        current->link = prev;
        prev=current;
        current=next;
    }
    head=prev;
}

main()
{
    int choice;
    do
    {
        printf("\nEnter your choice\n1.Insert\n2.Delete\n3.Display\n4.Display using recursion");
        printf("\n5.Display Reverse\n6.ReverseListIteration\n7.Exit\n\t\t\t");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:
            insert_node();
            break;
        case 2:
            delete_node();
            break;
        case 3:
            display_list();
            break;
        case 4:display_list_recursion(head);
            break;
        case 5:display_list_recursion_reverse(head);
            break;
        case 6:reverse_list_iteration();
            break;
        case 7:
            exit(0);
        }
    }
    while(choice<7);
}

Other functions are working. After calling reverse_list_iteration() then calling display_list() it displays only one data. I think some links are broken, but I can't figure it out.

Upvotes: 2

Views: 105

Answers (1)

aakansha
aakansha

Reputation: 695

Just change current->link!=NULL to current!=NULL in reverse_list_iteration() and your problem is solved.

Hope it helps you. Happy coding.

Upvotes: 3

Related Questions