Skip to content

Experiment 6:

Question:

  • Write a C program to implement linear queue using I.Arrays II. Linked Lists

I. Arrays:

Program:

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

int *queue;
int front = -1, rear = -1, size = 0;

// Enqueue function
void enqueue(int data) {
    if (rear == size - 1) {
        printf("Queue is full (Overflow).\n");
        return;
    }
    if (front == -1) front = 0;
    queue[++rear] = data;
    printf("Enqueued element: %d\n", data);
}

// Dequeue function
void dequeue() {
    if (front == -1 || front > rear) {
        printf("Queue is empty (Underflow).\n");
        return;
    }
    printf("Dequeued element: %d\n", queue[front++]);
    if (front > rear) front = rear = -1; // Reset
}

// Display front element
void showFront() {
    if (front == -1 || front > rear) {
        printf("Queue is empty.\n");
    } else {
        printf("Front element: %d\n", queue[front]);
    }
}

// Display rear element
void showRear() {
    if (rear == -1 || front > rear) {
        printf("Queue is empty.\n");
    } else {
        printf("Rear element: %d\n", queue[rear]);
    }
}

// Display entire queue
void displayQueue() {
    if (front == -1 || front > rear) {
        printf("Queue is empty.\n");
        return;
    }

    printf("Queue elements: ");
    for (int i = front; i <= rear; i++) {
        printf("%d ", queue[i]);
    }
    printf("\n");
}

int main() {
    int choice, data;

    printf("Enter the size of the queue: ");
    scanf("%d", &size);

    // Dynamically allocate memory for queue
    queue = (int *)malloc(size * sizeof(int));
    if (queue == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    while (1) {
        printf("\nMenu:\n");
        printf("1. Enqueue\n");
        printf("2. Dequeue\n");
        printf("3. Front\n");
        printf("4. Rear\n");
        printf("5. Display Queue\n");
        printf("6. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("Enter data: ");
                scanf("%d", &data);
                enqueue(data);
                break;
            case 2:
                dequeue();
                break;
            case 3:
                showFront();
                break;
            case 4:
                showRear();
                break;
            case 5:
                displayQueue();
                break;
            case 6:
                printf("Exiting program.\n");
                free(queue); // Free allocated memory
                return 0;
            default:
                printf("Invalid choice! Try again.\n");
        }
    }
    return 0;
}

Output:

II. Linked Lists

Program:

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

struct node {
    int data;
    struct node *link;
};

// Global front and rear pointers
struct node *front = NULL, *rear = NULL;

// Create a new node
struct node* createNode(int data) {
    struct node* newNode = (struct node*)malloc(sizeof(struct node));
    newNode->data = data;
    newNode->link = NULL;
    return newNode;
}

// Enqueue: Insert at rear
void enqueue(int data) {
    struct node* newNode = createNode(data);
    if (rear == NULL) {
        front = rear = newNode;
    } else {
        rear->link = newNode;
        rear = newNode;
    }
    printf("Enqueued element: %d\n", data);
}

// Dequeue: Remove from front
void dequeue() {
    if (front == NULL) {
        printf("Queue is empty.\n");
        return;
    }

    struct node* temp = front;
    front = front->link;

    if (front == NULL)
        rear = NULL;

    printf("Dequeued element: %d\n", temp->data);
    free(temp);
}

// Display front element
void showFront() {
    if (front == NULL) {
        printf("Queue is empty.\n");
    } else {
        printf("Front element: %d\n", front->data);
    }
}

// Display rear element
void showRear() {
    if (rear == NULL) {
        printf("Queue is empty.\n");
    } else {
        printf("Rear element: %d\n", rear->data);
    }
}

// Display all elements in the queue
void displayQueue() {
    if (front == NULL) {
        printf("Queue is empty.\n");
        return;
    }

    printf("Queue elements: ");
    struct node* temp = front;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->link;
    }
    printf("\n");
}

int main() {
    int choice, data;

    while (1) {
        printf("\nMenu:\n");
        printf("1. Enqueue\n");
        printf("2. Dequeue\n");
        printf("3. Front\n");
        printf("4. Rear\n");
        printf("5. Display Queue\n");
        printf("6. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("Enter data: ");
                scanf("%d", &data);
                enqueue(data);
                break;
            case 2:
                dequeue();
                break;
            case 3:
                showFront();
                break;
            case 4:
                showRear();
                break;
            case 5:
                displayQueue();
                break;
            case 6:
                printf("Exiting program.\n");
                return 0;
            default:
                printf("Invalid choice! Try again.\n");
        }
    }
    return 0;
}

Output: