#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TASK_LEN 20
typedef struct Node {
char task[MAX_TASK_LEN];
struct Node* next;
} Node;
typedef struct Queue {
Node* front;
Node* rear;
} Queue;
Queue* createQueue() {
Queue* q = (Queue*)malloc(sizeof(Queue));
q->front = NULL;
q->rear = NULL;
return q;
}
int isEmpty(Queue* q) {
return q->front == NULL;
}
void enqueue(Queue* q, const char* task) {
Node* newNode = (Node*)malloc(sizeof(Node));
strncpy(newNode->task, task, MAX_TASK_LEN - 1);
newNode->task[MAX_TASK_LEN - 1] = '\0';
newNode->next = NULL;
if (q->rear == NULL) {
q->front = newNode;
q->rear = newNode;
return;
}
q->rear->next = newNode; // link new node at end
q->rear = newNode; // update rear pointer
}
void dequeue(Queue* q) {
if (isEmpty(q)) {
printf("Queue is empty, nothing to process\n");
return;
}
Node* temp = q->front;
printf("Processing %s\n", temp->task);
q->front = q->front->next; // move front forward
if (q->front == NULL) {
q->rear = NULL; // queue empty now
}
free(temp);
}
void printQueue(Queue* q) {
Node* curr = q->front;
printf("Queue state: front -> ");
while (curr != NULL) {
printf("[%s] -> ", curr->task);
curr = curr->next;
}
printf("null ← rear\n");
}
int main() {
Queue* q = createQueue();
enqueue(q, "Task1");
printQueue(q);
enqueue(q, "Task2");
printQueue(q);
enqueue(q, "Task3");
printQueue(q);
dequeue(q);
printQueue(q);
dequeue(q);
printQueue(q);
dequeue(q);
printQueue(q);
return 0;
}
q->rear->next = newNode; // link new node at end
attach new task at the end of the queue
q->rear = newNode; // update rear pointer
move rear pointer to new last task
q->front = q->front->next; // move front forward
remove the first task by moving front pointer forward
if (q->front == NULL) {
q->rear = NULL; // queue empty now
}
if queue is empty after removal, reset rear pointer
Queue state: front -> [Task1] -> null ← rear
Queue state: front -> [Task1] -> [Task2] -> null ← rear
Queue state: front -> [Task1] -> [Task2] -> [Task3] -> null ← rear
Processing Task1
Queue state: front -> [Task2] -> [Task3] -> null ← rear
Processing Task2
Queue state: front -> [Task3] -> null ← rear
Processing Task3
Queue state: front -> null ← rear