Last active
September 22, 2019 02:50
-
-
Save Ajay-Raj-S/3b502acdb6e741361527225bbea23851 to your computer and use it in GitHub Desktop.
Circular Linked List Implementation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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