Implement a double-ended queue (deque) with essential operations in C



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

// Structure for a node in the doubly linked list
struct Node {
    int data;
    struct Node* prev;
    struct Node* next;
};

// Structure for the deque
struct Deque {
    struct Node* front;
    struct Node* rear;
};

// Function to create a new node
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    if (newNode == NULL) {
        printf("Memory allocation failed!\n");
        exit(1);
    }
    newNode->data = data;
    newNode->prev = NULL;
    newNode->next = NULL;
    return newNode;
}

// Function to initialize an empty deque
struct Deque* createDeque() {
    struct Deque* deque = (struct Deque*)malloc(sizeof(struct Deque));
    if (deque == NULL) {
        printf("Memory allocation failed!\n");
        exit(1);
    }
    deque->front = NULL;
    deque->rear = NULL;
    return deque;
}

// Function to check if the deque is empty
bool isEmpty(struct Deque* deque) {
    return deque->front == NULL;
}

// Function to insert an element at the front
void insertFront(struct Deque* deque, int data) {
    struct Node* newNode = createNode(data);
    if (isEmpty(deque)) {
        deque->front = deque->rear = newNode;
    } else {
        newNode->next = deque->front;
        deque->front->prev = newNode;
        deque->front = newNode;
    }
    printf("Inserted %d at front\n", data);
}

// Function to insert an element at the rear
void insertRear(struct Deque* deque, int data) {
    struct Node* newNode = createNode(data);
    if (isEmpty(deque)) {
        deque->front = deque->rear = newNode;
    } else {
        newNode->prev = deque->rear;
        deque->rear->next = newNode;
        deque->rear = newNode;
    }
    printf("Inserted %d at rear\n", data);
}

// Function to delete an element from the front
int deleteFront(struct Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty, cannot delete from front\n");
        return -1; // Indicate error
    }
    struct Node* temp = deque->front;
    int data = temp->data;
    deque->front = deque->front->next;
    if (deque->front == NULL) {
        deque->rear = NULL; // Deque is now empty
    } else {
        deque->front->prev = NULL;
    }
    free(temp);
    printf("Deleted %d from front\n", data);
    return data;
}

// Function to delete an element from the rear
int deleteRear(struct Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty, cannot delete from rear\n");
        return -1; // Indicate error
    }
    struct Node* temp = deque->rear;
    int data = temp->data;
    deque->rear = deque->rear->prev;
    if (deque->rear == NULL) {
        deque->front = NULL; // Deque is now empty
    } else {
        deque->rear->next = NULL;
    }
    free(temp);
    printf("Deleted %d from rear\n", data);
    return data;
}

// Function to get the front element
int getFront(struct Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty, no front element\n");
        return -1; // Indicate error
    }
    return deque->front->data;
}

// Function to get the rear element
int getRear(struct Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty, no rear element\n");
        return -1; // Indicate error
    }
    return deque->rear->data;
}

// Function to display the deque
void displayDeque(struct Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty\n");
        return;
    }
    printf("Deque: ");
    struct Node* temp = deque->front;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

// Main function to test the deque operations
int main() {
    struct Deque* deque = createDeque();

    // Test insertion operations
    insertFront(deque, 10); // 10
    insertRear(deque, 20); // 10 20
    insertFront(deque, 5); // 5 10 20
    insertRear(deque, 30); // 5 10 20 30
    displayDeque(deque);

    // Test get operations
    printf("Front element: %d\n", getFront(deque)); // 5
    printf("Rear element: %d\n", getRear(deque)); // 30

    // Test deletion operations
    deleteFront(deque); // Remove 5, deque: 10 20 30
    deleteRear(deque); // Remove 30, deque: 10 20
    displayDeque(deque);

    // Test empty deque
    deleteFront(deque); // Remove 10, deque: 20
    deleteRear(deque); // Remove 20, deque: empty
    displayDeque(deque);

    // Test operations on empty deque
    deleteFront(deque); // Should print error
    printf("Front element: %d\n", getFront(deque)); // Should print error

    // Add more elements to test further
    insertFront(deque, 40); // 40
    insertRear(deque, 50); // 40 50
    displayDeque(deque);

    return 0;
}

Output:


Comments