Operations on CLL(circular linked list)

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct node
   { int data;
     struct node *next;
   }node;

node *create();
node *insert_b(node *head,int x);
node *insert_e(node *head,int x);
node *insert_in(node *head,int x);
node *delete_b(node *head);
node *delete_e(node *head);
node *delete_in(node *head);
void search(node *head);
void print(node *head);

void main()
{ int op,op1,x;
  node *head=NULL;
  clrscr();
  do
    {
      printf("\n\n1)create\n2)Insert\n3)Delete\n4)Search");
      printf("\n5)Print\n6)Quit");
      printf("\nEnter your Choice:");
      scanf("%d",&op);
      switch(op)
       { case 1:head=create();break;
     case 2:printf("\n\t1)Beginning\n\t2)End\n\t3)Anywhere");
        printf("\nEnter your choice : ");
        scanf("%d",&op1);
        printf("\nEnter the data to be inserted : ");
        scanf("%d",&x);
        switch(op1)
         {  case 1: head=insert_b(head,x);
                break;
            case 2: head=insert_e(head,x);
                break;
            case 3: head=insert_in(head, x);
                break;
          }
        break;
     case 3:printf("\n\t1)Beginning\n\t2)End\n\t3)Anywhere");
        printf("\nEnter your choice : ");
        scanf("%d",&op1);
        switch(op1)
         {  case 1:head=delete_b(head);
               break;
            case 2:head=delete_e(head);
               break;
            case 3:head=delete_in(head);
               break;
          }
         break;
     case 4:search(head);break;
     case 5:print(head);break;
       }
    }while(op!=6);
}

node *create()
{ node *head,*p;
  int i,n,x;
  head=NULL;
  printf("\n Enter no of data:");
  scanf("%d",&n);
  printf("\nEnter the data:");
  for(i=0;i<n;i++)
   {
     scanf("%d",&x);
     if(head==NULL)
       {
        head=(node*)malloc(sizeof(node));
        head->next=head;
        head->data=x;
       }
     else
       {
        p=(node*)malloc(sizeof(node));
        p->data=x;
        p->next=head->next;
        head->next=p;
        head=p;
       }
   }
 return(head);
}

node *insert_b(node *head,int x)
{   node *p;
    p=(node*)malloc(sizeof(node));
    p->data=x;
    if(head==NULL)
       {
        p->next=p;
        head=p;
       }
    else
       {
        p->next=head->next;
        head->next=p;

       }
    return(head);
}

node *insert_e(node *head,int x)
{   node *p;
    p=(node*)malloc(sizeof(node));
    p->data=x;
    if(head==NULL)
       {
        p->next=p;
        head=p;
       }
    else
       {
        p->next=head->next;
        head->next=p;
        head=p;
       }
    return(head);
}


node *insert_in(node *head,int x)
{       node *p,*q;
    int loc,i;
    p=(node*)malloc(sizeof(node));
    p->data=x;
    p->next=p;
    printf("\Enter the location : ");
    scanf("%d",&loc);
    if(loc==1) // inserting as a first node
       {    if(head==NULL)
            return(p);
        else
          {
            p->next=head->next;
            head->next=p;
          }
       }
    else
       {
        q=head->next;
        for(i=1; i<loc-1;i++)
            if(q->next != head->next)
                q=q->next;
            else
               {
                printf("\nOverflow ****\n ");
                return head;
               }


     //insert a node as next node of q
        p->next=q->next;
        q->next=p;
        if(q==head)
           head=p;
       }
 return(head);
 }
node *delete_b(node *head)
{
  node *p,*q;
  if(head==NULL)
     {
    printf("\nUnderflow....Empty Linked List");
    return(head);
     }
  p=head->next;
  if(head->next==head)
    head=NULL;
  else
    head->next=p->next;
  free(p);
  return(head);

}
node *delete_e(node *head)
{
  node *p,*q;
  if(head==NULL)
     {
    printf("\nUnderflow....Empty Linked List");
    return(head);
     }
  p=head->next;
  if(head->next==head)
     { // Delete the only element
       head=NULL;
       free(p);
       return(head);
     }
//Locate the last but one node
   for(q=head->next;q->next!=head;q=q->next)
   ;
   p=head;
   head=q;
   head->next=p->next;
   free(p);
   return(head);
}
node *delete_in(node *head)
{
  node *p,*q;
  int loc,i;
  if(head==NULL)
     {
    printf("\nUnderflow....Empty Linked List");
    return(head);
     }
  printf("\nEnter the location of the data to be deleted : ");
  scanf("%d",&loc);
  if(loc==1)
     { // Delete the first element
       p=head->next;
       if(head->next==head)
      head=NULL;
       else
      head->next=p->next;
       free(p);
       return(head);
     }
   else
     {
    q=head->next;
    for(i=1; i<loc-1;i++)
        if(q->next->next!=head->next)
                q=q->next;
         else
               {
                printf("\nunderflow **** ");
                return head;
               }
    p=q->next;
    q->next=p->next;
    if(p==head)
      head=q;
    free(p);
     }
 return(head);

}

void search(node *head)
{ node *p;
  int data,loc=1;
  printf("\nEnter the data to be searched: ");
  scanf("%d",&data);
  p=head->next;
  do
    {
     if(data==p->data)
       {
     printf("\nFound at location=%d",loc);
     return;
       }
     loc++;
     p=p->next;
   }while(p!=head->next);
   printf("\nNot found:");
}

void print(node *head)
 {
    node *p;
    printf("\n\n");
    if(head==NULL)
        return;
    p=head->next;
    do
      {
        printf("%d  ",p->data);
        p=p->next;
      } while(p!=head->next);
  }

Post a Comment

0 Comments