#include <stdio.h>
#include <stdlib.h>
// Node structure for linked list
typedef struct Node {
int data;
struct Node* next;
struct Node* prev;
} Node;
// Dequeue structure with front and back pointers
typedef struct Dequeue {
Node* front;
Node* back;
} Dequeue;
// Create a new empty dequeue
Dequeue* createDequeue() {
Dequeue* dq = (Dequeue*)malloc(sizeof(Dequeue));
dq->front = NULL;
dq->back = NULL;
return dq;
}
// Create a new node
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
newNode->prev = NULL;
return newNode;
}
// Add element at front
void enqueueFront(Dequeue* dq, int data) {
Node* newNode = createNode(data);
if (dq->front == NULL) {
dq->front = newNode;
dq->back = newNode;
} else {
newNode->next = dq->front;
dq->front->prev = newNode;
dq->front = newNode;
}
}
// Add element at back
void enqueueBack(Dequeue* dq, int data) {
Node* newNode = createNode(data);
if (dq->back == NULL) {
dq->front = newNode;
dq->back = newNode;
} else {
dq->back->next = newNode;
newNode->prev = dq->back;
dq->back = newNode;
}
}
// Remove element from front
int dequeueFront(Dequeue* dq) {
if (dq->front == NULL) {
return -1; // empty dequeue
}
int val = dq->front->data;
Node* temp = dq->front;
dq->front = dq->front->next;
if (dq->front != NULL) {
dq->front->prev = NULL;
} else {
dq->back = NULL;
}
free(temp);
return val;
}
// Remove element from back
int dequeueBack(Dequeue* dq) {
if (dq->back == NULL) {
return -1; // empty dequeue
}
int val = dq->back->data;
Node* temp = dq->back;
dq->back = dq->back->prev;
if (dq->back != NULL) {
dq->back->next = NULL;
} else {
dq->front = NULL;
}
free(temp);
return val;
}
// Print dequeue from front to back
void printDequeue(Dequeue* dq) {
Node* curr = dq->front;
while (curr != NULL) {
printf("%d -> ", curr->data);
curr = curr->next;
}
printf("null\n");
}
int main() {
Dequeue* dq = createDequeue();
enqueueFront(dq, 10);
printDequeue(dq); // 10 -> null
enqueueBack(dq, 20);
printDequeue(dq); // 10 -> 20 -> null
int val1 = dequeueFront(dq);
printf("Dequeued from front: %d\n", val1);
printDequeue(dq); // 20 -> null
int val2 = dequeueBack(dq);
printf("Dequeued from back: %d\n", val2);
printDequeue(dq); // null
return 0;
}
if (dq->front == NULL) { dq->front = newNode; dq->back = newNode; } else { newNode->next = dq->front; dq->front->prev = newNode; dq->front = newNode; }
add new node at front, update front pointer and link previous front
if (dq->back == NULL) { dq->front = newNode; dq->back = newNode; } else { dq->back->next = newNode; newNode->prev = dq->back; dq->back = newNode; }
add new node at back, update back pointer and link previous back
if (dq->front == NULL) { return -1; } int val = dq->front->data; Node* temp = dq->front; dq->front = dq->front->next; if (dq->front != NULL) { dq->front->prev = NULL; } else { dq->back = NULL; } free(temp); return val;
remove node from front, update front pointer and fix links, handle empty dequeue
if (dq->back == NULL) { return -1; } int val = dq->back->data; Node* temp = dq->back; dq->back = dq->back->prev; if (dq->back != NULL) { dq->back->next = NULL; } else { dq->front = NULL; } free(temp); return val;
remove node from back, update back pointer and fix links, handle empty dequeue
10 -> null
10 -> 20 -> null
Dequeued from front: 10
20 -> null
Dequeued from back: 20
null