Circular Queue Simulation

    
#include <stdio.h>
#include <stdlib.h>

    
struct Circularqueue {
    int *data;
    int front;
    int rear;
    int maxsize;
};

struct Circularqueue* createqueue(int n) {
    struct Circularqueue* queue = (struct Circularqueue*)malloc(sizeof(struct Circularqueue));
    queue->data = (int*)malloc(n * sizeof(int));
    queue->maxsize = n;
    queue->rear = -1;
    queue->front = -1;
    return queue;
}

void insert(int value, struct Circularqueue* queue) {
    if ((queue->front == 0 && (queue->rear + 1) % queue->maxsize == 0) || ((queue->rear + 1) % queue->maxsize == queue->front)) {
        printf("Queue is full\n");
        return;
    }
    if (queue->front == -1) {
        queue->front = 0;
        queue->rear = 0;
    } else {
        queue->rear = (queue->rear + 1) % queue->maxsize;
    }
    queue->data[queue->rear] = value;
}

int delete(struct Circularqueue* queue) {
    int val;
    if (queue->front == -1) {
        // printf("Queue underflow\n");
        return INT_MIN;
    }
    val = queue->data[queue->front];
    if (queue->front == queue->rear) {
        queue->front = -1;
        queue->rear = -1;
    } else {
        queue->front = (queue->front + 1) % queue->maxsize;
    }
    return val;
}

void display(struct Circularqueue* queue) {
    struct Circularqueue temp =*queue;
    if (queue->front == -1)
    {
        printf("\nEmpty queue\n");
        return;
    }
    printf("\nFront = %d\nItems:\t", queue->front);
    do
    {
        printf(" %d",delete(&temp));
    }while(temp.rear-temp.front!=0);
    int val = delete(&temp);
    if(val==INT_MIN){}
    else
        printf(" %d",val);
    printf("\nRear = %d\n\n", queue->rear);
    // int i;
    // if (queue->front == -1)
    //     printf("\nEmpty queue\n");
    // else {
    //     printf("\nFront = %d\n", queue->front);
    //     printf("Items:\t");
    //     for (i = queue->front; i != (queue->rear + 1) % queue->maxsize; i = (i + 1) % queue->maxsize) {
    //         printf("%d ", queue->data[i]);
    //     }
    //     printf("\nRear = %d\n\n", queue->rear);
    // }
}

int main() {
    int n;
    printf("enter maxisze\n");
    scanf("%d", &n);
    struct Circularqueue* queue;
    queue = createqueue(n);
    int choice, value;
    while (1) {
        printf("\n1.Insert element\n2.Delete\n3.Display\n4.Quit\n\nenter choice:\t");
        scanf("%d", &choice);
        if (choice == 1) {
            printf("Enter value to insert\t");
            scanf("%d", &value);
            insert(value, queue);
        } else if (choice == 2) {
            value = delete(queue);
            if (value != INT_MIN)
                printf("\ndeleted value = %d\n", value);
            else
                printf("\nQueue Underflow\n");
        } else if (choice ==3) {
            display(queue);
        } else if (choice == 4) {
            free(queue->data);
            free(queue);
            exit(0);
        } else
            printf("Invalid choice\n");
    }
    return 0;
}