6. Circular Linked List
6.1 Structure
In a circular linked list, the last node points back to the first node (or head).
struct Node {
int data;
struct Node *next;
};
Visual Representation:
┌───────────────────────────┐
↓ │
HEAD → [10|●] → [20|●] → [30|●] ──┘
6.2 Operations
6.2.1 Insert at Beginning
void insertAtBeginning(struct Node **head, int value) {
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
printf("Memory allocation failed!\n");
return;
}
newNode->data = value;
// If list is empty
if (*head == NULL) {
newNode->next = newNode; // Points to itself
*head = newNode;
return;
}
// Find last node
struct Node *temp = *head;
while (temp->next != *head) {
temp = temp->next;
}
// Insert at beginning
newNode->next = *head;
temp->next = newNode;
*head = newNode;
}
6.2.2 Display Circular List
void displayCircular(struct Node *head) {
if (head == NULL) {
printf("List is empty!\n");
return;
}
struct Node *temp = head;
printf("List: ");
do {
printf("%d", temp->data);
temp = temp->next;
if (temp != head) {
printf(" → ");
}
} while (temp != head);
printf(" → (back to %d)\n", head->data);
}
6.2.3 Delete Node
void deleteNode(struct Node **head, int value) {
if (*head == NULL) {
printf("List is empty!\n");
return;
}
struct Node *temp = *head;
struct Node *prev = NULL;
// If head node contains the value
if (temp->data == value) {
// If only one node
if (temp->next == *head) {
free(temp);
*head = NULL;
return;
}
// Find last node
while (temp->next != *head) {
temp = temp->next;
}
// Delete head
temp->next = (*head)->next;
free(*head);
*head = temp->next;
return;
}
// Search for the node
prev = *head;
temp = (*head)->next;
while (temp != *head && temp->data != value) {
prev = temp;
temp = temp->next;
}
// If value not found
if (temp == *head) {
printf("Value %d not found!\n", value);
return;
}
// Delete node
prev->next = temp->next;
free(temp);
}
6.2.4 Count Nodes
int countNodes(struct Node *head) {
if (head == NULL) {
return 0;
}
int count = 1;
struct Node *temp = head->next;
while (temp != head) {
count++;
temp = temp->next;
}
return count;
}
No comments to display
No comments to display