Data Structure: Unit I: Lists

Circularly Linked List

Definition, Operations, Advantages, Applications | Data Structure

The Circular Linked List (CLL) is similar to singly linked list except that the last node's next pointer points to first node.

Circularly Linked List

Definition: The Circular Linked List (CLL) is similar to singly linked list except that the last node's next pointer points to first node.

The circular linked list is as shown below

• Various operations that can be performed on circular linked list are,

1. Creation of circular linked list.

2. Insertion of a node in circular linked list.

3. Deletion of any node from linked list.

4. Display of circular linked list.

We will see each operation along with some example.

1. Creation of circular linked list

struct node *Create()

{

char ans;

int flag=1;

struct node *head, *New,*temp;

struct node *get_node();

clrscr();

do

{

New = get_node();

printf("\n\n\n\tEnter The Element\n");

scanf("%d", &New->data);

if(flag==1)/*flag for setting the starting node*/

{

head = New;

New->next = head;

flag=0;/*reset flag*/

}

else /* find last node in list */

{

temp=head;

while (temp->next!= head)/*finding the last node */

temp-temp->next; /*temp is a last node */

temp->next=New;/* attaching the node*/

New->next-head; /*each time making the list circular*/

}

printf("\n Do you want to enter more nodes?");

ans=getch();

} while(ans=='y' || ans ==' 'Y');

return head;

/* function used while allocating memory for a node */

struct node *get_node()

{

struct node *New;

New = (node *) malloc(sizeof(struct node));

New->next = NULL;

return(New);/* created node is returned to calling function*/

}

Initially we will allocate memory for New node using a function get_node(). There is one variable flag whose purpose is to check whether first node is created or not. That means flag is 1 (set) then first node is not created. Therefore after creation of first node we have to reset the flag (making flag = 0).

Initially,

Here variable head indicates starting node.

Now as flag = 0, we can further create the nodes and attach them as follows.

When we have taken element '20'

Thus we can create a circular linked list by inserting one more element 50. It is as shown below

2. Display of circular linked list

void Display(struct node *head)

{

struct node *temp;

temp = head;

if(temp== NULL)

printf("\n Sorry,The List Is Empty\n");

else

{

do

{

printf("%d\t",temp->data);

temp = temp->next;

} while(temp != head);.

}

getch();

}

3. Insertion of circular linked list

While inserting a node in the linked list, there are 3 cases -

a) Inserting a node as a head node

b) Inserting a node as a last node

c) Inserting a node at intermediate position

The functions for these cases is as given below

struct node *insert_head(struct node *head)

{

struct node *get_node();

struct node *New,*temp;

New=get_node();

printf("\n Enter The element which you want to insert ");

scanf("%d", &New->data);

if(head == NULL)

head=New;

else

{

temp=head;

while(temp->next!=head)

temp-temp->next;

temp->next=New;

New->next = head;

head=New;

printf("\n The node is inserted!");

}

return head;

}

/*Insertion of node at last position*/

void insert_last(struct node *head)

{

struct node *New, *temp;

New=get_node();

printf("\n Enter The element which you want to insert ");

scanf("%d", &New->data);

if(head==NULL)

head = New;

else

{

temp=head;

while(temp->next!=head)

temp-temp->next;

temp->next=New;

New->next = head;

printf("\n The node is inserted!");

}

}

void insert_after(struct node *head)

{

int key;

struct node *New,*temp;

New= get_node();

printf("\n Enter The element which you want to insert "); scanf("%d", &New->data);

if(head == NULL)

{

head=New;

}

else

{

printf("\n Enter The element after which you want to insert the node ");

scanf("%d",&key);

temp=head;

do

{

if(temp->data==key)

{

New->next=temp->next;

temp->next=New;

printf("\n The node is inserted");

return;

}

else

temp-temp->next;

}while(temp!=head);

}

}

Suppose linked list is already created as -

4. Deletion of any node

struct node *Delete(struct node *head)

{

int key;

struct node *temp, *temp1;

printf("\n Enter the element which is to be deleted"); scanf("%d",&key);

temp=head;

if(temp->data==key)/*If header node is to be deleted*/

{

temp1=temp->next;

if(temp1==temp)

{

temp=NULL;

head=temp;

printf("\n The node is deleted");

}

else

{

while(temp->next!=head)

temp-temp->next;/*searching for the last node */

temp->next=temp1;

head=temp1;/*new head*/

printf("\n The node is deleted");

}

}

else

{

while(temp->next!=head) /* if intermediate node is to be deleted*/

{

if((temp->next)->data==key)

{

temp1=temp->next;

temp->next=temp1->next;

templ->next=NULL;       

free(temp1);

printf("\n The node is deleted");

}

else

temp-temp->next;

}

}

return head;

Suppose we have created a linked list as,

5. Searching a node from circular linked list

struct node *Search(node *head,int num)

{

struct node *temp;

temp=head;

while(temp->next!=head)

{

if(temp->data == num)

return temp;/*if node is found*/

else

temp-temp->next;

}

return NULL;

}

while searching a node from circular linked list we go on comparing the data field of each node starting from the head node. If the node containing desired data is found we return the address of that node to calling function.

Ex. 1.8.1: Implementation of circular linked list.

/****************************************************************

Program To Perform The Various Operations On The Circular Linked List

****************************************************************/

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

struct node

{

int data;

struct node *next;

};

void main()

{

 char ch;

int num,choice;

struct node *head, *New,*temp;

struct node *Create(void);

void Display(struct node *);

struct node *Insert(node *);

struct node *Delete(struct node *);

struct node *Search(struct node *,int);

head= NULL;

do

{

clrscr();

printf("\n Program For Circular Linked List\n");

printf(" 1.Insertion of any node\n\n");

printf(" 2. Display of Circular List\n\n");

printf(" 3. Insertion of a node in Circular List\n\n");

printf(" 4. Deletion of any node \n\n");

printf(" 5. Searching a Particular Element in The List\n\n");

printf(" 6.Exit");

printf("\n Enter Your Choice");

scanf("%d", &choice);

switch(choice)

{

case 1 head=Create();

break;

case 2 :Display(head);

break;

case 3:head=Insert(head);

break;

case 4:head=Delete(head);

break;

case 5:printf("\n Enter The Element Which Is To Be Searched");

scanf("%d",&num);

temp=Search(head,num); nebor extent seine

if(temp!= NULL)

printf("\n The node is present");

else

printf("\n The node is not present");

break;

case 6:exit(0);

}

printf("\nDo you want to go to Main Menu?\n");

ch= getch();

} while(ch == 'y' || ch == 'Y');

}

struct node *Create()

{

char ans;

int flag=1;

struct node *head, *New,*temp;

struct node *get_node();

clrscr();

do

{

New = get_node();

printf("\n\n\n\tEnter The Element\n");

scanf("%d", &New->data);

if(flag==1) /*flag for setting the starting node*/

{

head=New;

New->next = head; /*the circular list of a single node*/

flag=0;/*reset flag*/

}

else /* find last node in list */

{

 

temp=head;

while (temp->next!= head)/*finding the last node*/

}

temp-temp->next; /*temp is a last node */

temp->next=New;

New->next = head; /*each time making the list circular*/

}

printf("\n Do you want to enter more nodes?");

ans=getch();

}while(ans=='y' || ans =='=='Y');

return head;

}

struct node *get_node()

{

struct node *New;

New = (node *) malloc(sizeof(struct node));

New->next = NULL;

return(New);/*created node is returned to calling function*/

}

void Display(struct node *head)

{

struct node *temp;

temp = head;

if(temp==NULL)

printf("\n Sorry,The List Is Empty\n");

else

{

do

{

printf("%d\t",temp->data);

temp = temp->next;

} while(temp != head);/*Circular linked list*/

}

getch();

}

struct node *Insert(node *head)

{

int choice;                            

struct node *insert_head(node *);

void insert_after(struct node *);

void insert_last(struct node *);

printf("\n 1. Insert a node as a head node");

printf("\n 2. Insert a node as a last node");

printf("\n 3. Insert a node at intermediate position in the linked list");

printf("\n Enter your choice for insertion of node");

scanf("%d", &choice);

switch(choice)

{

case 1: head-insert_head(head);

break;

case 2: insert_last(head);

break;

case 3: insert_after(head);

break;

}

return head;

}

struct node *insert_head(struct node *head)

{

struct node *get_node();

struct node *New,*temp;

New=get_node();

printf("\n Enter The element which you want to insert ");

scanf("%d", &New->data);

if(head == NULL)

head=New;

else

{

temp=head;

while(temp->next!=head)

temp-temp->next;

temp->next=New;

New->next-head;

head=New;

printf("\n The node is inserted!");

}

return head;

/*Insertion of node at last position*/

void insert_last(struct node *head)

{

struct node *New,*temp;

New=get_node();

printf("\n Enter The element which you want to insert ");

scanf("%d", &New->data);

if(head= NULL)

else

{

head=New;

temp=head;

while(temp->next!=head)

temp-temp->next;

temp->next=New;

New->next = head;

printf("\n The node is inserted!");

}

}

void insert_after(struct node *head)

{

int key;

struct node *New,*temp;

New= get_node();

printf("\n Enter The element which you want to insert ");

scanf("%d", &New->data);

if(head == NULL)

{

head=New;

}

else

{

printf("\n Enter The element after which you want to insert the node");

scanf("%d", &key);

temp=head;

do

{

if(temp->data==key)

{

New->next-temp->next;

temp->next=New;

printf("\n The node is inserted");

return;

}

else

temp-temp->next;

} while(temp!=head);

}

}

struct node *Search(node *head,int num)

{

struct node *temp;

temp=head;

while(temp->next!=head)

{

if(temp->data == num)

return temp;/*if node is found*/

else

temp-temp->next;

}

return NULL;

}

struct node *Delete(struct node *head)

{

int key;

struct node *temp, *temp1;

printf("\n Enter the element which is to be deleted");

scanf("%d",&key);

temp=head;

if(temp->data==key)/*If header node is to be deleted*/

{

temp1=temp->next;

if(temp1==temp)

/*if single node is present in circular linked list and we want to delete it*/

{

temp=NULL;

head=temp;

printf("\n The node is deleted");            

}

else /*otherwise*/

{

while(temp->next!=head)

temp-temp->next;/*searching for the last node*/

temp->next=temp1;

head-temp1;/*new head*/

printf("\n The node is deleted");

}

}

else

{

while(temp->next!=head) /* if intermediate node is to be deleted*/

{

if((temp->next)->data==key)

{

temp1=temp->next;

temp->next-temp1->next;

temp1->next = NULL;

free(temp1);

printf("\n The node is deleted");

}

else

temp-temp->next;

}

}

return head;

}

Output

Program For Circular Linked List

1. Insertion of any node

2. Display of Circular List

3. Insertion of a node in Circular List

4. Deletion of any node

5. Searching a Particular Element in The List

6. Exit

Enter Your Choice 1

10

Enter The Element

Do you want to enter more nodes?mo nisi d'oe

Enter The Element

20

Do you want to enter more nodes?

Enter The Element

30

Do you want to enter more nodes? Enter The Element

40

Do you want to enter more nodes?

Do you want to go to Main Menu?

Program For Circular Linked List

1. Insertion of any node

2. Display of Circular List

3. Insertion of a node in Circular List

4. Deletion of any node

5. Searching a Particular Element in The List

6. Exit

Enter Your Choice 2

10 20 30 40

Do you want to go to Main Menu?

Program For Circular Linked List

1.Insertion of any node

2. Display of Circular List

3. Insertion of a node in Circular List

4. Deletion of any node

5. Searching a Particular Element in The List

 6.Exit

Enter Your Choice 3

1. Insert a node as a head node

2. Insert a node as a last node

3. Insert a node at intermediate position in the linked list

Enter your choice for insertion of node 3

Enter The element which you want to insert 33

Enter The element after which you want to insert

the node 30

The node is inserted

Do you want to go to Main Menu?

Program For Circular Linked List

1. Insertion of any node

2. Display of Circular List

3. Insertion of a node in Circular List

4. Deletion of any node

5. Searching a Particular Element in The List

6. Exit

Enter Your Choice 2

10 20 30 33 40

Program For Circular Linked List

1. Insertion of any node

2. Display of Circular List

3. Insertion of a node in Circular List

4. Deletion of any node

5. Searching a Particular Element in The List

6. Exit

Enter Your Choice 4

Enter the element which is to be deleted 20

The node is deleted

Do you want to go to Main Menu?

Program For Circular Linked List

1. Insertion of any node

2. Display of Circular List

3. Insertion of a node in Circular List

4. Deletion of any node

5. Searching a Particular Element in The List of

6. Exit

Enter Your Choice 2

10 30 33 40

Do you want to go to Main Menu?

Program For Circular Linked List

1. Insertion of any node

2. Display of Circular List

3. Insertion of a node in Circular List

4. Deletion of any node

5. Searching a Particular Element in The List

6. Exit

Enter Your Choice 5

Enter The Element Which Is To Be Searched 30

The node is present

Do you want to go to Main Menu?

Program For Circular Linked List

1. Insertion of any node

2. Display of Circular List

3. Insertion of a node in Circular List

4. Deletion of any node

5. Searching a Particular Element in The List

6. Exit

Enter Your Choice 5

Enter The Element Which Is To Be Searched 101

The node is not present

Do you want to go to Main Menu?

Program For Circular Linked List

1. Insertion of any node

2. Display of Circular List

3. Insertion of a node in Circular List

4. Deletion of any node

5. Searching a Particular Element in The List

 6. Exit

Enter Your Choice 6

Advantages of Circular Linked List over Singly Linked List

In circular linked list the next pointer of last node points to the head node. Hence we can move from last node to the head node of the list very efficiently. Hence accessing of any node is much faster than singly linked list.

Applications of circular list :

1) The circular list is used to create the linked lists in which the last node points to the first node.

2) In round robin method the circular linked list is used.

3) The circular linked list is used in solving Josephus problem. 4) For representing the polynomial the circular linked list.

Review Question

1. Write a procedure to deleting the last node from a circular linked list.

Data Structure: Unit I: Lists : Tag: : Definition, Operations, Advantages, Applications | Data Structure - Circularly Linked List