Skip to content

Instantly share code, notes, and snippets.

@Ajay-Raj-S
Last active September 22, 2019 02:50
Show Gist options
  • Save Ajay-Raj-S/3b502acdb6e741361527225bbea23851 to your computer and use it in GitHub Desktop.
Save Ajay-Raj-S/3b502acdb6e741361527225bbea23851 to your computer and use it in GitHub Desktop.
Circular Linked List Implementation
#include<stdio.h>
#include<stdlib.h>
// circular linked list using Singly Linked list
struct circular {
int value;
struct circular* next;
};
typedef struct circular* node;
node ROOT = NULL;
node lastNodeAddr = NULL;
node nodeCreation(int value) {
node temp = (node) malloc(sizeof(struct circular));
temp->value = value;
temp->next = temp;
return temp;
}
void insertInTheList(node temp) {
if(ROOT == NULL) {
ROOT = temp;
lastNodeAddr = temp;
} else {
lastNodeAddr->next = temp; // Temp address is given to current lastNode->next
lastNodeAddr = temp; // LastNode is the Temp Now.
temp->next = ROOT; // To make it circular.
}
}
void showTheList(node temp) {
if(ROOT == NULL) {
printf("List is empty!\n");
return;
}
do {
printf("->%d\n", temp->value);
temp = temp->next;
if(temp == ROOT) {
break;
}
} while(1);
}
void destroyTheList(node temp) {
if(ROOT == NULL) {
printf("List is empty!\n");
}
do {
node tempDeletionHolder = temp;
temp = temp->next;
free(tempDeletionHolder);
if(temp == ROOT) {
break;
}
} while(1);
ROOT = NULL;
}
void deleteTheNode(int value) {
node temp = ROOT;
do {
if(temp->value == value) {
// if only one element is in the list
if(temp->next == ROOT && ROOT == temp) {
free(temp);
ROOT = NULL;
lastNodeAddr = NULL;
return;
}
// to delete last element in the list
if(temp->next == ROOT && ROOT != temp) {
// 1. find previous node
node temporaryHolder = ROOT;
node previousNode = NULL;
do {
previousNode = temporaryHolder;
temporaryHolder = temporaryHolder->next;
if(temporaryHolder->next == ROOT) {
break;
}
} while(1);
// 2. Make previousNode->next as ROOT
previousNode->next = ROOT;
// 3. Delete the temp node, without freeing the temp variable
temporaryHolder = temp;
lastNodeAddr = previousNode;
free(temporaryHolder);
// removed these bcz, we reached the end of the list, so return back to main.
// temp = previousNode->next;
// continue;
return;
}
// To delete 1st element in the list, when the list has many elements
// 1. check 2nd Node is not pointing to ROOT
if(temp == ROOT && temp->next != ROOT) {
// 2. Make the ROOT pointing to second element using first element.
ROOT = temp->next;
node temporaryHolder = temp;
temp = temporaryHolder->next;
lastNodeAddr->next = ROOT;
free(temporaryHolder);
continue;
}
// To Delete an element in between the nodes
if(temp->next != ROOT) {
// 1. find previous node
node temporaryHolder = ROOT;
node previousNode = NULL;
do {
previousNode = temporaryHolder;
temporaryHolder = temporaryHolder->next;
if(temporaryHolder->value == value) {
break;
}
} while(1);
previousNode->next = temp->next;
temporaryHolder = temp;
temp = temp->next;
free(temporaryHolder);
continue;
}
}
temp = temp->next;
if(temp == ROOT) {
break;
}
} while(1);
}
int main() {
int choice;
int localVal = 0;
int deleteChoice = -1;
int deleteNode = 0;
// int printChoice = 0;
while(1) {
printf("1.Insert a Node\n2.show the list\n3.Deletion\n >>> ");
scanf("%d",&choice);
switch(choice) {
case 1:
printf("Enter the Number >>");
scanf("%d", &localVal);
insertInTheList(nodeCreation(localVal));
break;
case 2:
showTheList(ROOT);
/*printf("Print the List or Reverse the List ? 1 : 0");
scanf("%d", &printChoice);
if(printChoice) {
showTheList(ROOT);
} else {
reverseTheList(ROOT);
} */
break;
case 3:
printf("Do you want to delete the entire List or a Node ? 1 : 0 >> ");
scanf("%d", &deleteChoice);
if(deleteChoice) {
if(ROOT == NULL)
printf("List is empty!\n");
else
destroyTheList(ROOT);
} else {
if(ROOT == NULL) {
printf("List is empty!\n");
break;
}
printf("Enter the Number in the Node >> ");
scanf("%d", &deleteNode);
deleteTheNode(deleteNode);
}
break;
default:
printf("wrong choice\n");
destroyTheList(ROOT);
printf("Destroyed The list");
exit(0);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment