#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
Post a Comment