Linked List reversal in C not working -
i want operations linked list in c. have wrote functions - insert @ beginning, insert @ tail, delete beginning etc. in code tried implement reversal of linked list. not working expected. print 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 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 @ beginning\n2.insert @ tail\n3.insert @ position\n4.exit\n"); scanf("%d",&choice); if(choice<4) { printf("\nenter data 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 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 beginning\n2.delete tail\n3.delete 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 data 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 function 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; { printf("\nenter 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 working. after calling reverse_list_iteration() calling display_list() displays 1 data. think links broken, can't figure out.
just change current->link!=null current!=null in reverse_list_iteration() , problem solved.
hope helps you. happy coding.
Comments
Post a Comment