#include <stdio.h>
#include <stdlib.h>
// Definición de un nodo
typedef struct Node {
int data;
struct Node* next;
struct Node* prev;
} Node;
// Definición de la cola doble
typedef struct Deque {
Node* front;
Node* rear;
} Deque;
// Función para crear un nuevo nodo
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
newNode->prev = NULL;
return newNode;
}
// Función para inicializar la cola doble
Deque* createDeque() {
Deque* deque = (Deque*)malloc(sizeof(Deque));
deque->front = NULL;
deque->rear = NULL;
return deque;
}
// Función para agregar un elemento al frente
void addFront(Deque* deque, int data) {
Node* newNode = createNode(data);
if (deque->front == NULL) {
deque->front = newNode;
deque->rear = newNode;
} else {
newNode->next = deque->front;
deque->front->prev = newNode;
deque->front = newNode;
}
}
// Función para agregar un elemento al final
void addRear(Deque* deque, int data) {
Node* newNode = createNode(data);
if (deque->rear == NULL) {
deque->front = newNode;
deque->rear = newNode;
} else {
newNode->prev = deque->rear;
deque->rear->next = newNode;
deque->rear = newNode;
}
}
// Función para eliminar un elemento del frente
int removeFront(Deque* deque) {
if (deque->front == NULL) {
printf("Deque is empty\n");
return -1; // Indica que la cola está vacía
}
Node* temp = deque->front;
int data = temp->data;
deque->front = deque->front->next;
if (deque->front != NULL) {
deque->front->prev = NULL;
} else {
deque->rear = NULL; // Si la cola queda vacía
}
free(temp);
return data;
}
// Función para eliminar un elemento del final
int removeRear(Deque* deque) {
if (deque->rear == NULL) {
printf("Deque is empty\n");
return -1; // Indica que la cola está vacía
}
Node* temp = deque->rear;
int data = temp->data;
deque->rear = deque->rear->prev;
if (deque->rear != NULL) {
deque->rear->next = NULL;
} else {
deque->front = NULL; // Si la cola queda vacía
}
free(temp);
return data;
}
// Función para liberar la memoria de la cola
void freeDeque(Deque* deque) {
while (deque->front != NULL) {
removeFront(deque);
}
free(deque);
}
// Función principal para probar la implementación
int main() {
Deque* deque = createDeque();
addRear(deque, 10);
addRear(deque, 20);
addFront(deque, 5);
printf("Removed from front: %d\n", removeFront(deque));
printf("Removed from rear: %d\n", removeRear(deque));
freeDeque(deque);
return 0;
}