Reversal of a singly linklist by recursion.

Started by aruljothi, Mar 31, 2009, 11:07 AM

Previous topic - Next topic

aruljothi

#include<stdio.h>
#include<conio.h>
#include<alloc.h>
struct node
                  {
                    int data;
                    struct node*next;
                  };
void insert(struct node**p,int num)   /*Function for inserting an
element into a list */
{
   if(*p==NULL)
     {
      (*p)=(struct node*)malloc(sizeof(struct node));
      (*p)->next=NULL;
      (*p)->data=num;
     }
   else
    {
     insert(&((*p)->next),num);
    }
}
void display(struct node*p) /*Function for displaying the list*/
{
   while(p!=NULL)
    {
     printf("%d ",p->data);
     p=p->next;
    }
}
void reverse(struct node**p) /*Function for reversing the list by
recursion */
{
   struct node*q,*r,*x;
     int d;
     q=(*p);     /*stores the address of the first element */
     x=q;        /*also stores the element of the first element for
counter pourpose */
     d=q->data;  /*stores the data of the first element*/
     r=q->next;  /*stores the address of the second element in the list
*/
      free(q);   /*deletes the first element of the list*/
      if(x==NULL)
                return ;
                else
                  {
                    reverse(&(r));/*Recursive call*/
                    insert(p,d);  /*This function is put in the stack so the first
                                                     will be taken as last element for the new list */
                  }
}
void main()
{
  clrscr();
  struct node*p=NULL;
  int n,d,i=0;
   printf("How many...?  ");
   scanf("%d",&n);
    while(i++!=n)
     {
      scanf("%d",&d);
      insert(&p,d);
     }
  display(p);
  reverse(&p);
  printf("
The reversed list is...");
  display(p);
  getch();
}