📖 Scenario: Imagine a line at a ticket counter where people join at the end and get served from the front. This is how a queue works. We will build a queue using a linked list in C to manage this line efficiently.
🎯 Goal: Create a queue using a linked list in C. You will add elements to the end and remove elements from the front, then print the queue to see the order of people waiting.
📋 What You'll Learn
Define a Node struct with an integer data and a pointer to the next node called next.
Create a Queue struct with pointers front and rear to track the start and end of the queue.
Write a function enqueue to add a new node with given data at the rear of the queue.
Write a function dequeue to remove the node from the front of the queue.
Write a function printQueue to display all elements from front to rear.
Demonstrate the queue by enqueuing and dequeuing elements and printing the queue.
💡 Why This Matters
🌍 Real World
Queues are used in real life for managing lines, like customers waiting for service or tasks waiting to be processed.
💼 Career
Understanding queue implementation helps in software development roles where managing ordered data efficiently is important, such as in operating systems, network programming, and event handling.
Progress0 / 4 steps
1
Define Node and Queue Structures
Define a struct Node with an int data and a struct Node* next. Then define a struct Queue with two pointers: front and rear, both of type struct Node*.
DSA C
Hint
Think of Node as a box holding a number and a pointer to the next box. The Queue keeps track of the first and last boxes.
2
Initialize Queue and Write Enqueue Function
Create a function initQueue that returns a pointer to a new Queue with front and rear set to NULL. Then write a function enqueue that takes a pointer to Queue and an int data, creates a new Node with this data, and adds it to the rear of the queue.
DSA C
Hint
When the queue is empty, both front and rear point to the new node. Otherwise, add the new node after rear and update rear.
3
Write Dequeue and Print Functions
Write a function dequeue that removes the node from the front of the queue and frees its memory. If the queue becomes empty, set rear to NULL. Also write a function printQueue that prints all elements from front to rear separated by arrows -> and ends with NULL.
DSA C
Hint
Remove the front node and update pointers. For printing, move from front to rear printing each data followed by an arrow.
4
Test Queue Operations and Print Final Queue
In main, create a queue using initQueue(). Enqueue the integers 10, 20, and 30 in that order. Then dequeue one element. Finally, call printQueue to display the current queue.
DSA C
Hint
Remember to enqueue 10, 20, 30 in order, then dequeue once, and finally print the queue.
Practice
(1/5)
1. What is the main advantage of implementing a queue using a linked list instead of an array?
easy
A. Uses less memory than arrays always
B. Faster access to elements by index
C. Simpler code with fewer pointers
D. Dynamic size allows efficient memory use without fixed limits
Solution
Step 1: Understand queue size constraints in arrays
Arrays have fixed size, so queues implemented with arrays have a maximum capacity.
Step 2: Analyze linked list flexibility
Linked lists can grow or shrink dynamically, so queues using linked lists can handle any number of elements limited only by memory.
Final Answer:
Dynamic size allows efficient memory use without fixed limits -> Option D
Quick Check:
Linked list queues grow dynamically = A [OK]
Hint: Linked list queues grow dynamically, arrays don't [OK]
Common Mistakes:
Thinking arrays always use less memory
Confusing access speed with size flexibility
Assuming linked lists have simpler code
2. Which of the following is the correct way to declare a node structure for a queue using a linked list in C?
easy
A. typedef struct Node { int data; Node* next; };
B. struct Node { int data; int next; };
C. typedef struct Node { int data; struct Node* next; } Node;
D. struct Node { int data; struct Node next; };
Solution
Step 1: Check pointer usage in struct
The next pointer must be a pointer to struct Node, so 'struct Node* next;' is correct.
Step 2: Validate typedef syntax
Using typedef with struct Node allows using 'Node' as type directly, which is correct in typedef struct Node { int data; struct Node* next; } Node;.
Final Answer:
typedef struct Node { int data; struct Node* next; } Node; -> Option C
Quick Check:
Pointer to struct Node with typedef = A [OK]
Hint: Use 'struct Node* next;' for pointer inside struct [OK]
Common Mistakes:
Using 'int next;' instead of pointer
Omitting 'struct' keyword before Node*
Declaring next as struct Node instead of pointer
3. Consider the following C code snippet implementing enqueue operation for a queue using linked list:
What will be the state of the queue after these operations?
enqueue(&front, &rear, 10); enqueue(&front, &rear, 20); enqueue(&front, &rear, 30);
medium
A. 10 -> 20 -> 30 -> NULL
B. 30 -> 20 -> 10 -> NULL
C. 10 -> 30 -> 20 -> NULL
D. 20 -> 10 -> 30 -> NULL
Solution
Step 1: Trace first enqueue call
Queue is empty, so front and rear point to new node with data 10.
Step 2: Trace second and third enqueue calls
New nodes with 20 and 30 are added at rear, linked in order: 10 -> 20 -> 30 -> NULL.
Final Answer:
10 -> 20 -> 30 -> NULL -> Option A
Quick Check:
Enqueue adds at rear, order preserved = C [OK]
Hint: Enqueue adds at rear, so order is insertion order [OK]
Common Mistakes:
Confusing enqueue with push (stack behavior)
Reversing order of nodes
Not updating rear pointer correctly
4. The following dequeue function for a queue using linked list has a bug. Identify the bug:
int dequeue(Node** front, Node** rear) {
if (*front == NULL) {
printf("Queue is empty\n");
return -1;
}
Node* temp = *front;
int value = temp->data;
*front = (*front)->next;
free(temp);
return value;
}
medium
A. Does not free memory of dequeued node
B. Does not update rear when queue becomes empty
C. Returns wrong value after dequeue
D. Does not check if front is NULL before dequeue
Solution
Step 1: Analyze dequeue steps
Function removes front node and updates front pointer correctly.
Step 2: Check rear pointer update
If after dequeue front becomes NULL (queue empty), rear should also be set to NULL but this is missing.
Final Answer:
Does not update rear when queue becomes empty -> Option B
Quick Check:
Rear must be NULL if queue empty = B [OK]
Hint: Set rear to NULL when front becomes NULL after dequeue [OK]
Common Mistakes:
Forgetting to update rear on empty queue
Not freeing dequeued node memory
Returning wrong data value
5. You want to implement a function reverseQueue that reverses the elements of a queue implemented using a linked list. Which approach is the most efficient and correct?
hard
A. Use a stack to push all elements, then enqueue them back to queue
B. Traverse the linked list and swap data of front and rear nodes repeatedly
C. Dequeue all elements and enqueue them back in the same order
D. Create a new linked list and copy elements in reverse order without modifying original
Solution
Step 1: Understand reversing queue with linked list
Reversing requires changing order of elements, which is not straightforward by swapping nodes in singly linked list.
Step 2: Evaluate stack approach
Using a stack to push all elements then enqueue back reverses order efficiently and correctly.
Step 3: Check other options
Swapping data repeatedly is complex and error-prone; copying to new list wastes memory; re-enqueueing same order does nothing.
Final Answer:
Use a stack to push all elements, then enqueue them back to queue -> Option A
Quick Check:
Stack reverses order efficiently = D [OK]
Hint: Use stack to reverse queue elements easily [OK]
Common Mistakes:
Trying to swap nodes in singly linked list
Re-enqueueing without changing order
Copying to new list wastes memory
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.