#include <stdio.h>
#include <stdlib.h>
/* Basic node structure. */
struct cl_node {
int INFO;
struct cl_node * NEXT;
};
struct cl_node *FIRST = NULL;
struct cl_node *LAST = NULL;
/* Functions declarations */
void insert(int);
void delete(int);
void display(void);
struct cl_node * search(int);
int main()
{
int num1, num2, choice;
struct cl_node *LOC = NULL;
/* Run forever until user chooses 0 */
while(1)
{
printf("--------------------------------------------\n"); printf(" CIRCULAR LINKED LIST PROGRAM \n"); printf("--------------------------------------------\n"); printf("--------------------------------------------\n"); printf("Enter your choice : "); switch(choice)
{
case 1:
printf("Enter element to be inserted: "); insert(num1);
break;
case 2:
printf("Enter key to delete from list: "); delete(num2);
break;
case 3: printf("Enter key to be searched from list: "); LOC=search(num2);
if(LOC == NULL)
printf("\nElement not found...!\n"); else
printf("\n Element found \n"); break;
case 4: display();
break;
default: return 0;
} // end case
} // end while
}
void insert(int data)
{
struct cl_node *PTR =
(struct cl_node
*)malloc(sizeof(struct cl_node
)); PTR->INFO = data;
if(FIRST == NULL) // no CLL
{
FIRST = LAST = PTR;
PTR->NEXT = FIRST;
}
else
{
LAST->NEXT = PTR;
PTR->NEXT = FIRST;
LAST = PTR;
}
}
void delete(int key)
{
struct cl_node *LOC, *TEMP;
LOC = search(key);
if (LOC == NULL)
{
printf("\nElement not found...!\n"); return;
}
if(LOC==FIRST)
{
if(FIRST==LAST) // only element
{
FIRST=LAST=NULL;
return;
}
else
{
FIRST = FIRST->NEXT;
LAST->NEXT = FIRST;
return;
}
}
for(TEMP=FIRST; TEMP->NEXT != LOC ; TEMP=TEMP->NEXT)
;
if(LOC == LAST)
{
LAST = TEMP;
TEMP->NEXT = FIRST;
}
else
TEMP->NEXT = LOC->NEXT;
return;
}
struct cl_node * search(int key)
{
struct cl_node *PTR;
if(FIRST==NULL)
return NULL;
if(FIRST->INFO==key)
return FIRST;
for(PTR=FIRST; PTR != LAST; PTR=PTR->NEXT)
if(PTR->INFO == key)
return(PTR);
if(LAST->INFO == key)
return(LAST);
else
return(NULL);
}
void display()
{
struct cl_node *PTR;
if(FIRST==NULL) // no element
{
printf("\n CIRCULAR Linked list is empty\n"); return;
}
if(FIRST == LAST) // Single element
{
printf("\nFIRST --> %d --> LAST\n", FIRST
->INFO
); return;
}
for (PTR=FIRST; PTR !=LAST; PTR=PTR->NEXT)
printf("%d --> ", PTR
->INFO
) ;
printf("%d --> LAST\n",LAST
->INFO
); }
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+Ci8qIEJhc2ljIG5vZGUgc3RydWN0dXJlLiAqLwpzdHJ1Y3QgY2xfbm9kZSB7CiAgICBpbnQgSU5GTzsKICAgIHN0cnVjdCBjbF9ub2RlICogTkVYVDsKfTsKCnN0cnVjdCBjbF9ub2RlICpGSVJTVCA9IE5VTEw7CnN0cnVjdCBjbF9ub2RlICpMQVNUID0gTlVMTDsKCi8qIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgKi8Kdm9pZCBpbnNlcnQoaW50KTsKdm9pZCBkZWxldGUoaW50KTsKdm9pZCBkaXNwbGF5KHZvaWQpOwpzdHJ1Y3QgY2xfbm9kZSAqIHNlYXJjaChpbnQpOwoKaW50IG1haW4oKQp7CiAgICBpbnQgbnVtMSwgbnVtMiwgY2hvaWNlOwoKICAgIHN0cnVjdCBjbF9ub2RlICpMT0MgPSBOVUxMOwoKICAgIC8qIFJ1biBmb3JldmVyIHVudGlsIHVzZXIgY2hvb3NlcyAwICovCiAgICB3aGlsZSgxKQogICAgewoJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CglwcmludGYoIiAgICAgICAgQ0lSQ1VMQVIgTElOS0VEIExJU1QgUFJPR1JBTSAgICAgICAgXG4iKTsKCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoJcHJpbnRmKCIxLiBJbnNlcnQgXG4iKTsKCXByaW50ZigiMi4gRGVsZXRlIFxuIik7CglwcmludGYoIjMuIFNlYXJjaFxuIik7CglwcmludGYoIjQuIERpc3BsYXlcbiIpOwoJcHJpbnRmKCIqLiBFeGl0XG4iKTsKCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoJcHJpbnRmKCJFbnRlciB5b3VyIGNob2ljZSA6ICIpOwoJc2NhbmYoIiVkIiwgJmNob2ljZSk7Cglzd2l0Y2goY2hvaWNlKQoJewoJICAgIGNhc2UgMToKCQlwcmludGYoIkVudGVyIGVsZW1lbnQgdG8gYmUgaW5zZXJ0ZWQ6ICIpOwoJCXNjYW5mKCIlZCIsICZudW0xKTsKCQlpbnNlcnQobnVtMSk7CgkJYnJlYWs7CgkgICAgY2FzZSAyOgoJCXByaW50ZigiRW50ZXIga2V5IHRvIGRlbGV0ZSBmcm9tIGxpc3Q6ICIpOwoJCXNjYW5mKCIlZCIsICZudW0yKTsKCQlkZWxldGUobnVtMik7CgkJYnJlYWs7CgkJCWNhc2UgMzogcHJpbnRmKCJFbnRlciBrZXkgdG8gYmUgc2VhcmNoZWQgZnJvbSBsaXN0OiAiKTsKCQlzY2FuZigiJWQiLCAmbnVtMik7CgkJTE9DPXNlYXJjaChudW0yKTsKCQkJCWlmKExPQyA9PSBOVUxMKQoJCQkJCXByaW50ZigiXG5FbGVtZW50IG5vdCBmb3VuZC4uLiFcbiIpOwoJCQkJZWxzZQoJCQkJCXByaW50ZigiXG4gRWxlbWVudCBmb3VuZCBcbiIpOwoJCWJyZWFrOwoJCQljYXNlIDQ6IGRpc3BsYXkoKTsKCQlicmVhazsKCSAgICBkZWZhdWx0OiByZXR1cm4gMDsKCX0gLy8gZW5kIGNhc2UKICAgIH0gLy8gZW5kIHdoaWxlCn0KCnZvaWQgaW5zZXJ0KGludCBkYXRhKQp7CiAgc3RydWN0IGNsX25vZGUgKlBUUiA9CgkgICAgICAoc3RydWN0IGNsX25vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGNsX25vZGUpKTsKICAgIFBUUi0+SU5GTyA9IGRhdGE7CglpZihGSVJTVCA9PSBOVUxMKSAvLyBubyBDTEwKCXsKCQlGSVJTVCA9IExBU1QgPSBQVFI7CgkJUFRSLT5ORVhUID0gRklSU1Q7Cgl9CgllbHNlCgl7CgkJTEFTVC0+TkVYVCA9IFBUUjsKCQlQVFItPk5FWFQgPSBGSVJTVDsKCQlMQVNUID0gUFRSOwoJfQp9Cgp2b2lkIGRlbGV0ZShpbnQga2V5KQp7CglzdHJ1Y3QgY2xfbm9kZSAqTE9DLCAqVEVNUDsKCUxPQyA9IHNlYXJjaChrZXkpOwoJaWYgKExPQyA9PSBOVUxMKQoJewoJICBwcmludGYoIlxuRWxlbWVudCBub3QgZm91bmQuLi4hXG4iKTsKICAgICAgcmV0dXJuOwoJfQoJaWYoTE9DPT1GSVJTVCkKCXsKCQlpZihGSVJTVD09TEFTVCkgLy8gb25seSBlbGVtZW50IAoJCXsKCQkJRklSU1Q9TEFTVD1OVUxMOwoJCQlmcmVlKExPQyk7CgkJCXJldHVybjsKCQl9CgkJZWxzZQoJCXsKCQkJRklSU1QgPSBGSVJTVC0+TkVYVDsKCQkJTEFTVC0+TkVYVCA9IEZJUlNUOwoJCQlmcmVlKExPQyk7CgkJCXJldHVybjsKCQl9Cgl9Cglmb3IoVEVNUD1GSVJTVDsgVEVNUC0+TkVYVCAhPSBMT0MgOyBURU1QPVRFTVAtPk5FWFQpCgkJCQkJCTsKCWlmKExPQyA9PSBMQVNUKQoJewoJCUxBU1QgPSBURU1QOwoJCVRFTVAtPk5FWFQgPSBGSVJTVDsKCX0KCWVsc2UKCQlURU1QLT5ORVhUID0gTE9DLT5ORVhUOwpmcmVlKExPQyk7CiByZXR1cm47Cn0KCnN0cnVjdCBjbF9ub2RlICogc2VhcmNoKGludCBrZXkpCnsKICAgc3RydWN0IGNsX25vZGUgKlBUUjsKICAgCiAgIGlmKEZJUlNUPT1OVUxMKQoJICAgcmV0dXJuIE5VTEw7CiAgIGlmKEZJUlNULT5JTkZPPT1rZXkpCgkgcmV0dXJuIEZJUlNUOwoKICAgZm9yKFBUUj1GSVJTVDsgUFRSICE9IExBU1Q7IFBUUj1QVFItPk5FWFQpCglpZihQVFItPklORk8gPT0ga2V5KQoJICAgcmV0dXJuKFBUUik7CiAgIGlmKExBU1QtPklORk8gPT0ga2V5KQoJcmV0dXJuKExBU1QpOwogICBlbHNlCglyZXR1cm4oTlVMTCk7Cn0KCnZvaWQgZGlzcGxheSgpCnsKCXN0cnVjdCBjbF9ub2RlICpQVFI7CglpZihGSVJTVD09TlVMTCkgLy8gbm8gZWxlbWVudAoJewoJICAgcHJpbnRmKCJcbiBDSVJDVUxBUiBMaW5rZWQgbGlzdCBpcyBlbXB0eVxuIik7CgkgICByZXR1cm47Cgl9CgkKCWlmKEZJUlNUID09IExBU1QpIC8vIFNpbmdsZSBlbGVtZW50Cgl7CgkJcHJpbnRmKCJcbkZJUlNUIC0tPiAlZCAtLT4gTEFTVFxuIiwgRklSU1QtPklORk8pOwoJCXJldHVybjsKCX0KCQoJZm9yIChQVFI9RklSU1Q7IFBUUiAhPUxBU1Q7IFBUUj1QVFItPk5FWFQpCgkJcHJpbnRmKCIlZCAtLT4gIiwgUFRSLT5JTkZPKSA7CgkKCXByaW50ZigiJWQgLS0+IExBU1RcbiIsTEFTVC0+SU5GTyk7Cn0K