Reputation: 613
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
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