Queue (Linked List)
#include <stdio.h>
#include <stdlib.h>
#define EMPTY -1
typedef struct node {
int data;
struct node *next;
} node;
typedef struct queue {
int size;
struct node *head, *tail;
} queue;
// Function prototypes
queue *createQueue();
node *createNode(int num);
int isEmpty(queue *q);
int enqueue(queue *q, int num);
int dequeue(queue *q);
int peek(queue *q);
void printQueue(queue *q);
void printVal(int val);
void printOptions();
// Return an instantiated queue *
queue *createQueue() {
queue *q = (queue *)malloc(sizeof(queue));
q->size = 0;
q->head = NULL;
q->tail = NULL;
return q;
}
// Return an instantiated node *
node *createNode(int num) {
node *n = (node *)malloc(sizeof(node));
n->data = num;
n->next = NULL;
return n;
}
// Return 1 if queue exists and queue is empty
// Otherwise return 0
int isEmpty(queue *q) { return (!q || q->size == 0) ? 1 : 0; }
// Adds integer to queue to tail of queue
// Returns 1 if added succesfully, otherwise returns 0
int enqueue(queue *q, int num) {
if (!q)
return 0;
node *n = createNode(num);
if (q->size == 0) {
q->head = n;
q->tail = n;
} else {
q->tail->next = n;
q->tail = n;
}
q->size++;
return 1;
}
// Removes and returns integer from front of queue
// If queue is empty, returns EMPTY
int dequeue(queue *q) {
if (isEmpty(q))
return EMPTY;
int data = q->head->data;
node *tmp = q->head;
if (q->size == 1) {
q->tail = NULL;
q->head = NULL;
} else {
q->head = q->head->next;
}
free(tmp);
q->size--;
return data;
}
// Returns - WITHOUT removing - integer from front of queue
// If queue is empty, returns EMPTY
int peek(queue *q) {
if (isEmpty(q))
return EMPTY;
return q->head->data;
}
// Prints queue to screen
void printQueue(queue *q) {
if (isEmpty(q)) {
printf("Queue is empty\n");
return;
}
printf("(front) ");
node *walker = q->head;
while (walker) {
printf("%d ", walker->data);
walker = walker->next;
}
printf("(back)\n");
}
// Print value of integer
void printVal(int val) {
if (val == EMPTY) {
printf("EMPTY\n");
} else {
printf("%d\n", val);
}
}
// Print options menu
void printOptions() {
printf("1) Enqueue\n");
printf("2) Dequeue\n");
printf("3) Peek\n");
printf("4) Print Queue\n");
printf("5) Quit\n");
printf("\n:");
}
int main(void) {
queue *q = createQueue();
int choice = 0;
int num;
while (choice != 5) {
printOptions();
scanf("%d", &choice);
switch (choice) {
case 1: // Enqueue
printf("Type a positive integer to add to queue:\n");
scanf("%d", &num);
if (enqueue(q, num))
printf("%d added to queue\n", num);
else
printf("Failed to add %d to queue\n", num);
break;
case 2: // Dequeue
num = dequeue(q);
printf("Dequeued: ");
printVal(num);
break;
case 3: // Peek
num = peek(q);
printf("Peeked: ");
printVal(num);
break;
case 4: // Print Queue
printQueue(q);
break;
default:
break;
}
printf("\n");
}
// Free Memory
while (!isEmpty(q))
dequeue(q);
free(q);
return 0;
}
Academic Notice: The code shown here is provided solely as a learning reference. Copying and pasting is intentionally disabled to encourage independent practice. Students should implement solutions on their own to demonstrate understanding. This material is not intended for direct submission in assignments.
Additionally: This code was written by a former CS1 student and may not reflect your professor’s intended solution or instructional approach. For coursework, students are expected to follow examples, conventions, and requirements presented in class and in professor-assigned materials.