Bird
Raised Fist0
DSA Cprogramming

Enqueue Using Linked List in DSA C

Choose your learning style10 modes available
Mental Model
Add a new item to the end of a line by linking it to the last item.
Analogy: Imagine people standing in a queue; when a new person arrives, they join at the back, holding the hand of the last person.
front -> 1 -> 2 -> 3 -> null
rear ↑
Dry Run Walkthrough
Input: queue: 1 -> 2 -> 3 -> null, enqueue value 4
Goal: Add value 4 to the end of the queue
Step 1: Create new node with value 4
new_node: 4 -> null
Why: We need a new node to add to the queue
Step 2: Link current rear node (3) to new node (4)
front -> 1 -> 2 -> 3 -> [rear->4] -> null
Why: Attach new node at the end of the queue
Step 3: Update rear pointer to new node (4)
front -> 1 -> 2 -> 3 -> 4 -> null
rear ↑
Why: Rear must always point to the last node
Result:
front -> 1 -> 2 -> 3 -> 4 -> null
rear ↑
Annotated Code
DSA C
#include <stdio.h>
#include <stdlib.h>

// Node structure
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// Queue structure with front and rear pointers
typedef struct Queue {
    Node* front;
    Node* rear;
} Queue;

// Create a new node with given value
Node* createNode(int value) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = NULL;
    return newNode;
}

// Initialize an empty queue
Queue* createQueue() {
    Queue* q = (Queue*)malloc(sizeof(Queue));
    q->front = NULL;
    q->rear = NULL;
    return q;
}

// Enqueue operation: add value at the rear
void enqueue(Queue* q, int value) {
    Node* newNode = createNode(value); // create new node
    if (q->rear == NULL) { // queue empty
        q->front = newNode; // front and rear both point to new node
        q->rear = newNode;
        return;
    }
    q->rear->next = newNode; // link last node to new node
    q->rear = newNode;       // update rear to new node
}

// Print queue from front to rear
void printQueue(Queue* q) {
    Node* temp = q->front;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("null\n");
}

int main() {
    Queue* q = createQueue();
    enqueue(q, 1);
    enqueue(q, 2);
    enqueue(q, 3);
    printf("Queue before enqueue: ");
    printQueue(q);
    enqueue(q, 4);
    printf("Queue after enqueue 4: ");
    printQueue(q);
    return 0;
}
Node* newNode = createNode(value); // create new node
create a new node to add at the rear
if (q->rear == NULL) { // queue empty q->front = newNode; // front and rear both point to new node q->rear = newNode; return; }
handle empty queue by setting front and rear to new node
q->rear->next = newNode; // link last node to new node
attach new node after current rear
q->rear = newNode; // update rear to new node
move rear pointer to new last node
OutputSuccess
Queue before enqueue: 1 -> 2 -> 3 -> null Queue after enqueue 4: 1 -> 2 -> 3 -> 4 -> null
Complexity Analysis
Time: O(1) because we add the new node directly at the rear without traversal
Space: O(1) because we only create one new node for each enqueue
vs Alternative: Compared to using an array where adding at the end might require shifting or resizing, linked list enqueue is faster and uses constant time
Edge Cases
Empty queue
Front and rear both point to the new node after enqueue
DSA C
if (q->rear == NULL) { // queue empty
When to Use This Pattern
When you need to add items to the end of a queue efficiently, use the enqueue linked list pattern because it keeps track of the rear pointer for quick insertion.
Common Mistakes
Mistake: Not updating the rear pointer after adding the new node
Fix: Always set rear to the new node after linking it
Mistake: Not handling empty queue case separately
Fix: Check if rear is NULL and set both front and rear to new node
Summary
Adds a new element at the end of a linked list queue.
Use when you want to insert items in a queue efficiently without traversing.
Keep track of the rear pointer to add new nodes in constant time.

Practice

(1/5)
1. What does the enqueue operation do in a queue implemented using a linked list?
easy
A. Deletes the entire queue
B. Adds an element at the end (rear) of the queue
C. Checks if the queue is empty
D. Removes an element from the front of the queue

Solution

  1. Step 1: Understand enqueue operation

    Enqueue means adding a new element to the queue.
  2. Step 2: Identify position of insertion in linked list queue

    In a linked list queue, new elements are added at the rear (end) to maintain order.
  3. Final Answer:

    Adds an element at the end (rear) of the queue -> Option B
  4. Quick Check:

    Enqueue = Add at rear [OK]
Hint: Enqueue always adds at the rear in a queue [OK]
Common Mistakes:
  • Confusing enqueue with dequeue operation
  • Thinking enqueue adds at the front
  • Mixing queue with stack operations
2. Which of the following is the correct syntax to create a new node for enqueue in C linked list?
easy
A. newNode = malloc(sizeof(Node));
B. struct Node newNode = (struct Node*)malloc(sizeof(struct Node));
C. Node newNode = malloc(sizeof(Node));
D. struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

Solution

  1. Step 1: Allocate memory for new node

    In C, use malloc with sizeof(struct Node) to allocate memory.
  2. Step 2: Correct pointer declaration and casting

    Declare pointer as struct Node* and cast malloc result to (struct Node*).
  3. Final Answer:

    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); -> Option D
  4. Quick Check:

    Correct malloc syntax = struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); [OK]
Hint: Always cast malloc to (struct Node*) in C [OK]
Common Mistakes:
  • Missing struct keyword in declaration
  • Not casting malloc result
  • Using wrong variable types
3. What will be the state of the queue after executing the following code?
struct Node {
  int data;
  struct Node* next;
};

struct Node* front = NULL;
struct Node* rear = NULL;

// Enqueue 10
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = 10;
newNode->next = NULL;
if (rear == NULL) {
  front = rear = newNode;
} else {
  rear->next = newNode;
  rear = newNode;
}

// Enqueue 20
newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = 20;
newNode->next = NULL;
rear->next = newNode;
rear = newNode;
medium
A. 10 -> NULL
B. 20 -> 10 -> NULL
C. 10 -> 20 -> NULL
D. 20 -> NULL

Solution

  1. Step 1: Enqueue 10 when queue is empty

    Both front and rear point to new node with data 10.
  2. Step 2: Enqueue 20 when queue has one element

    rear->next points to new node with data 20, rear moves to this node.
  3. Final Answer:

    10 -> 20 -> NULL -> Option C
  4. Quick Check:

    Order of enqueue = 10 then 20 [OK]
Hint: New nodes link at rear, order stays FIFO [OK]
Common Mistakes:
  • Reversing order of nodes
  • Not updating rear pointer
  • Forgetting to set next to NULL
4. Identify the error in the following enqueue function for a linked list queue:
void enqueue(int value) {
  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
  newNode->data = value;
  newNode->next = NULL;
  if (front == NULL) {
    front = newNode;
  } else {
    rear->next = newNode;
    rear = newNode;
  }
}
medium
A. rear pointer is not updated when queue is empty
B. newNode->next should point to front
C. malloc size is incorrect
D. front pointer is updated incorrectly

Solution

  1. Step 1: Check rear pointer update when queue is empty

    When front is NULL, only front = newNode is executed, rear remains uninitialized.
  2. Step 2: No rear update in if branch

    The else block sets rear = newNode, but it is skipped when queue is empty.
  3. Final Answer:

    rear pointer is not updated when queue is empty -> Option A
  4. Quick Check:

    rear must be set when queue is empty [OK]
Hint: Always update rear when queue was empty [OK]
Common Mistakes:
  • Not setting rear when queue is empty
  • Incorrect next pointer assignment
  • Wrong malloc size or casting
5. Given a linked list queue with elements 5 -> 15 -> 25 -> NULL, what will be the queue after enqueueing 35 and then 45? Show the final linked list state.
hard
A. 5 -> 15 -> 25 -> 35 -> 45 -> NULL
B. 45 -> 35 -> 25 -> 15 -> 5 -> NULL
C. 5 -> 15 -> 25 -> NULL
D. 35 -> 45 -> 5 -> 15 -> 25 -> NULL

Solution

  1. Step 1: Understand enqueue adds at rear

    Enqueue adds new nodes at the end of the queue to maintain order.
  2. Step 2: Add 35 and then 45 at the rear

    After adding 35, queue becomes 5 -> 15 -> 25 -> 35 -> NULL. Then adding 45 results in 5 -> 15 -> 25 -> 35 -> 45 -> NULL.
  3. Final Answer:

    5 -> 15 -> 25 -> 35 -> 45 -> NULL -> Option A
  4. Quick Check:

    Enqueue order preserved at rear [OK]
Hint: Enqueue appends at rear, order stays same [OK]
Common Mistakes:
  • Adding new nodes at front instead of rear
  • Reversing the order of elements
  • Not updating rear pointer after enqueue
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard