//Circular Singly Linked List In An Unordered Manner.
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<alloc.h>
void create();
void insert();
void delete();
void display();
void displays();
typedef struct l_link{
			int data;
			struct l_link *link;
			}node;
node *head,*p,*q,*next,*r;
int item,test;
main()
{
	int ch;
	char choice='y';
	clrscr();
	while(choice=='y')
	{
//		clrscr();
		printf(" \n\n\n\t\t  S I N G L Y   L I N K E D_L I S T   O P E R A T I O N\n");
		printf("\t\t\t  1.C R E A T I O N \n");
		printf("\t\t\t  2.I N S E R T I O N \n");
		printf("\t\t\t  3.D E L E T I O N\n");
		printf("\t\t\t  4.D I S P L A Y\n");
		printf("\t\t\t  5.E X I T\n");
		printf("Enter Your choice:");
		scanf("%d",&ch);
		switch(ch)
			{
			case 1:
				create();
				break;
			case 2:
				insert();
				break;
			case 3:
				delete();
				break;
			case 4:
				display();
				break;
			case 5:
				exit(0);
			default:
				printf("Invalid Choice\n Retry:");
				break;
			}
		displays();
		printf("\nDo you Want To Continue[y/n]:");
		scanf("%c",&choice);
		choice=getchar();
	}
getch();
}

void create()
{
	int n,i;
	item=1;
	head=NULL;
	printf("Enter The No. Of Data.");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		printf("\nEnter The data :");
		scanf("%d",&item);
		q=(node*)malloc(sizeof(node));
		q->data=item;
		if(head==NULL)
		{
			head=q;
			head->link=head;
		}
		else
		{
			next->link=q;
			q->link=head;
		}
		next=q;
	}
	return;
}
void insert()
{
	int key;
	test=0;
	printf("\n Enter The Data To Be Inserted:");
	scanf("%d",&item);
	printf("\nEnter The data To be Inserted Before.");
	scanf("%d",&key);
	q=(node*)malloc(sizeof(node));
	q->data=item;
	q->link=NULL;
	if(head==NULL)
	{
		head=q;
		head->link=head;
		test=1;
	}
	if(key == head->data)
	{
		r=head;
		q->link=head;
		head=q;
		for(p=head->link;p->link!=r;p=p->link);
			p->link=head;
		test=1;
	}
	else
	{
		p=head;
		while(p->link!=head)
		{
			if(key == p->link->data)
			{
				test=1;
				break;
										}
			p=p->link;
		}
		q->link=p->link;
		p->link=q;
	}
	if(test==1)
		printf("\n The Entered Data Is Inserted.");
	else
		printf("\n The Entered data To Be Inserted Before Is Not Found.\
		\nThe Entered Data Is Inserted At The End");

	return;
}

void delete()
{
	test=0;
	if(head==NULL)
		return;
       printf("\nEnter The Data To Be Deleted:");
	scanf("%d",&item);
	if(item == head->data)
	{
		if(head->link==head)
			head=NULL;
		else
		{
			head=head->link;
			for(p=head;p->link!=head;p=p->link);
				p->link=head;
		}
		test=1;

	}
	p=head;
	while(p!=NULL)
	{
		q=p->link;
		if(item == q->data)
		{
			test=1;
			break;
		}
		p=p->link;
	}
	p->link=q->link;
	if(test==1)
		printf("\n The Entered Item Is Deleted.");
	else
		printf("\n The Entered Item Is Not Found.");
	free(q);
	return;
}
void display()
{
	char con1='y';

	if(head==NULL)
	{
		printf("\n No Node Is Present.");
		return;
	}
	printf("\nThe contents Of Linked List\n");

		for(p=head;con1=='y';p=p->link)
		{
			item = p->data;
			printf("%d\t",item);
			printf("\n Do You Want To Display The Next Node?");
			scanf("%c",&con1);
			con1=getchar();

		}

	return;
}

void displays()
{
	p=head;
	if(p==NULL)
	{
		printf("\n No Node Is Present.");
		return;
	}
	printf("\nThe contents Of Linked List\n");
	for(p=head;p->link!=head;p=p->link)
		printf("%d\t",p->data);
		printf("%d\t",p->data);
	return;
}




