Skip to content

Miliprogramador/Circular-link-list

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 

Repository files navigation

#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;

}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published