Untitled

 avatar
unknown
plain_text
2 months ago
8.2 kB
4
Indexable
#include <stdio.h>
#include <stdlib.h>

// Node structure
struct Node {
    int data;
    struct Node* next;
};

// LinkedList structure
struct LinkedList {
    struct Node* head;
};

// Function prototypes
void addAtBeginning(struct LinkedList* list, int data);
void addAtPosition(struct LinkedList* list, int data, int position);
void addAtEnd(struct LinkedList* list, int data);
void deleteAtBeginning(struct LinkedList* list);
void deleteAtPosition(struct LinkedList* list, int position);
void deleteAtEnd(struct LinkedList* list);
void display(struct LinkedList* list);
int isDuplicate(struct LinkedList* list, int data);

// Function to create a new Node
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = newNode;  // Points to itself (circular)
    return newNode;
}

// Function to initialize an empty LinkedList
void initLinkedList(struct LinkedList* list) {
    list->head = NULL;
}

// Function to free the memory of the linked list
void destroyLinkedList(struct LinkedList* list) {
    if (list->head == NULL) return;

    struct Node* current = list->head;
    struct Node* nextNode;
    do {
        nextNode = current->next;
        free(current);
        current = nextNode;
    } while (current != list->head);
    list->head = NULL;
}

// Function to check if the data already exists in the circular linked list
int isDuplicate(struct LinkedList* list, int data) {
    if (list->head == NULL) return 0;

    struct Node* current = list->head;
    do {
        if (current->data == data) {
            return 1;  // Duplicate found
        }
        current = current->next;
    } while (current != list->head);

    return 0;  // No duplicate found
}

// Function to add a new node at the beginning of the linked list
void addAtBeginning(struct LinkedList* list, int data) {
    if (isDuplicate(list, data)) {
        printf("Duplicate value %d not inserted.\n", data);
        return;
    }

    struct Node* newNode = createNode(data);
    if (list->head == NULL) {
        list->head = newNode;
    } else {
        struct Node* temp = list->head;
        while (temp->next != list->head) {
            temp = temp->next;
        }
        temp->next = newNode;
        newNode->next = list->head;
        list->head = newNode;
    }
}

// Function to add a new node at a specific position in the linked list
void addAtPosition(struct LinkedList* list, int data, int position) {
    if (isDuplicate(list, data)) {
        printf("Duplicate value %d not inserted.\n", data);
        return;
    }

    struct Node* newNode = createNode(data);
    if (position == 1) {
        newNode->next = list->head;
        if (list->head != NULL) {
            struct Node* temp = list->head;
            while (temp->next != list->head) {
                temp = temp->next;
            }
            temp->next = newNode;
        }
        list->head = newNode;
        return;
    }

    struct Node* current = list->head;
    int count = 1;
    while (current != NULL && count < position - 1) {
        current = current->next;
        count++;
    }

    if (current == NULL) {
        printf("\nInvalid position.\n");
        free(newNode);
        return;
    }

    newNode->next = current->next;
    current->next = newNode;
}

// Function to add a new node at the end of the linked list
void addAtEnd(struct LinkedList* list, int data) {
    if (isDuplicate(list, data)) {
        printf("Duplicate value %d not inserted.\n", data);
        return;
    }

    struct Node* newNode = createNode(data);
    if (list->head == NULL) {
        list->head = newNode;
    } else {
        struct Node* current = list->head;
        while (current->next != list->head) {
            current = current->next;
        }
        current->next = newNode;
        newNode->next = list->head;
    }
}

// Function to delete the node at the beginning of the linked list
void deleteAtBeginning(struct LinkedList* list) {
    if (list->head == NULL) {
        printf("\nList is empty.\n");
        return;
    }

    struct Node* temp = list->head;
    if (list->head->next == list->head) {
        free(temp);
        list->head = NULL;
    } else {
        struct Node* current = list->head;
        while (current->next != list->head) {
            current = current->next;
        }
        current->next = list->head->next;
        list->head = list->head->next;
        free(temp);
    }
}

// Function to delete the node at a specific position in the linked list
void deleteAtPosition(struct LinkedList* list, int position) {
    if (list->head == NULL) {
        printf("\nList is empty.\n");
        return;
    }

    if (position == 1) {
        deleteAtBeginning(list);
        return;
    }

    struct Node* current = list->head;
    int count = 1;
    while (current != NULL && count < position - 1) {
        current = current->next;
        count++;
    }

    if (current == NULL || current->next == list->head) {
        printf("\nInvalid position.\n");
        return;
    }

    struct Node* temp = current->next;
    current->next = current->next->next;
    free(temp);
}

// Function to delete the node at the end of the linked list
void deleteAtEnd(struct LinkedList* list) {
    if (list->head == NULL) {
        printf("\nList is empty.\n");
        return;
    }

    if (list->head->next == list->head) {
        free(list->head);
        list->head = NULL;
        return;
    }

    struct Node* current = list->head;
    while (current->next != list->head) {
        current = current->next;
    }
    current->next = list->head;
    free(current->next);
}

// Function to display the circular linked list
void display(struct LinkedList* list) {
    if (list->head == NULL) {
        printf("\nList is empty.\n");
        return;
    }

    struct Node* current = list->head;
    printf("\nCircular Linked List: ");
    do {
        printf("%d -> ", current->data);
        current = current->next;
    } while (current != list->head);  // Loop back to the head
    printf("%d\n", list->head->data);  // Print the head again at the end
}

// Main function
int main() {
    struct LinkedList list;
    int choice, data, position;

    initLinkedList(&list);

    do {
        printf("\nMenu:\n");
        printf("1. Add at beginning\n");
        printf("2. Add at any position\n");
        printf("3. Add at end\n");
        printf("4. Delete at beginning\n");
        printf("5. Delete at any position\n");
        printf("6. Delete at end\n");
        printf("0. Quit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
        case 1:
            printf("\nEnter data: ");
            scanf("%d", &data);
            addAtBeginning(&list, data);
            display(&list);
            break;
        case 2:
            printf("\nEnter data: ");
            scanf("%d", &data);
            printf("\nEnter position: ");
            scanf("%d", &position);
            addAtPosition(&list, data, position);
            display(&list);
            break;
        case 3:
            printf("\nEnter data: ");
            scanf("%d", &data);
            addAtEnd(&list, data);
            display(&list);
            break;
        case 4:
            deleteAtBeginning(&list);
            display(&list);
            break;
        case 5:
            printf("\nEnter position: ");
            scanf("%d", &position);
            deleteAtPosition(&list, position);
            display(&list);
            break;
        case 6:
            deleteAtEnd(&list);
            display(&list);
            break;
        case 0:
            printf("\nExiting program.\n");
            destroyLinkedList(&list);
            break;
        default:
            printf("\nInvalid choice. Please try again.\n");
        }
    } while (choice != 0);

    return 0;
}
Editor is loading...
Leave a Comment