#include <stdio.h> #include <stdlib.h>
typedef struct node { int data; struct node* next; } Node;
Node* head = NULL;
Node* createNode(int value) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = value; newNode->next = NULL; return newNode; }
int isEmpty() { return head == NULL; }
int size() { if (isEmpty()) return 0; int count = 0; Node* temp = head; do { count++; temp = temp->next; } while (temp != head); return count; }
void display() { if (isEmpty()) { printf("List is empty!\n"); return; } Node* temp = head; printf("Circular List: "); do { printf("%d -> ", temp->data); temp = temp->next; } while (temp != head); printf("(back to head)\n"); }
void insertAtBeginning(int value) { Node* newNode = createNode(value); if (head == NULL) { head = newNode; newNode->next = head; return; } Node* tail = head; while (tail->next != head) tail = tail->next; newNode->next = head; tail->next = newNode; head = newNode; }
void insertAtEnd(int value) { Node* newNode = createNode(value); if (head == NULL) { head = newNode; newNode->next = head; return; } Node* tail = head; while (tail->next != head) tail = tail->next; tail->next = newNode; newNode->next = head; }
void insertAtPosition(int pos, int value) { int n = size(); if (pos < 1 || pos > n + 1) { printf(" out of range!\n"); return; } if (pos == 1) { insertAtBeginning(value); return; } Node* newNode = createNode(value); Node* temp = head; for (int i = 1; i < pos - 1; i++) { temp = temp->next; } newNode->next = temp->next; temp->next = newNode; }
void deleteAtBeginning() { if (isEmpty()) { printf("List is empty!\n"); return; } if (head->next == head) { free(head); head = NULL; return; } Node* tail = head; while (tail->next != head) tail = tail->next; Node* temp = head; head = head->next; tail->next = head; free(temp); }
void deleteAtEnd() { if (isEmpty()) { printf("List is empty!\n"); return; } if (head->next == head) { free(head); head = NULL; return; } Node* temp = head; while (temp->next->next != head) temp = temp->next; free(temp->next); temp->next = head; }
void deleteAtPosition(int pos) { int n = size(); if (pos < 1 || pos > n) { printf(" out of range!\n"); return; } if (pos == 1) { deleteAtBeginning(); return; } Node* temp = head; for (int i = 1; i < pos - 1; i++) { temp = temp->next; }
Node* delNode = temp->next;
temp->next = delNode->next;
free(delNode);
}
int search(int value) { if (isEmpty()) return -1; int index = 1; Node* temp = head; do { if (temp->data == value) return index; temp = temp->next; index++; } while (temp != head); return -1; }
void clear() { if (isEmpty()) return; Node* temp = head->next; while (temp != head) { Node* next = temp->next; free(temp); temp = next; } free(head); head = NULL; }
int getHead() { if (isEmpty()) { printf("List is empty!\n"); return -1; } return head->data; }
int getTail() { if (isEmpty()) { printf("List is empty!\n"); return -1; } Node* temp = head; while (temp->next != head) temp = temp->next; return temp->data; }
int main() { int choice, value, pos;
do {
printf("\nCircular Linked List Menu\n");
printf("1. Insert at Beginning\n");
printf("2. Insert at End\n");
printf("3. Insert at Position\n");
printf("4. Delete at Beginning\n");
printf("5. Delete at End\n");
printf("6. Delete at Position\n");
printf("7. Search\n");
printf("8. Display\n");
printf("9. Size\n");
printf("10. Is Empty\n");
printf("11. Get Head\n");
printf("12. Get Tail\n");
printf("13. Clear\n");
printf("0. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter value: ");
scanf("%d", &value);
insertAtBeginning(value);
break;
case 2:
printf("Enter value: ");
scanf("%d", &value);
insertAtEnd(value);
break;
case 3:
printf("Enter position: ");
scanf("%d", &pos);
printf("Enter value: ");
scanf("%d", &value);
insertAtPosition(pos, value);
break;
case 4:
deleteAtBeginning();
break;
case 5:
deleteAtEnd();
break;
case 6:
printf("Enter position: ");
scanf("%d", &pos);
deleteAtPosition(pos);
break;
case 7:
printf("Enter value to search: ");
scanf("%d", &value);
pos = search(value);
if (pos == -1) printf("Value not found!\n");
else printf("Value found at position %d\n", pos);
break;
case 8:
display();
break;
case 9:
printf("Size: %d\n", size());
break;
case 10:
printf(isEmpty() ? "List is empty.\n" : "List is not empty.\n");
break;
case 11:
value = getHead();
if (value != -1) printf("Head: %d\n", value);
break;
case 12:
value = getTail();
if (value != -1) printf("Tail: %d\n", value);
break;
case 13:
clear();
printf("List cleared!\n");
break;
case 0:
clear();
printf("Exiting...\n");
break;
default:
printf("Invalid choice!\n");
}
} while (choice != 0);
return 0;
}