Queue using Linked List
Linked-list queue क्यों?
Queue FIFO मानता है — First In, First Out। इसे array से बना सकते हैं (देखें C में queue), पर सामान्य array queue की दो कमज़ोरियाँ हैं: fixed size, और कई dequeue के बाद बर्बाद slots। Linked-list queue हर item के लिए node allocate करके और हटने पर free करके दोनों ठीक करता है।
अगर linked lists नई हैं तो पहले C में linked list पढ़ें — यह lesson सीधे nodes पर बनता है।
front और rear pointers
Node श्रृंखला में हम queue को दो pointers से track करते हैं:
| Pointer | किस ओर |
|---|---|
front | पहला node — अगला हटने वाला |
rear | आख़िरी node — जहाँ जोड़ते हैं |
खाली queue के लिए दोनों NULL से शुरू।
Rear पर enqueue
Node बनाएँ, rear के बाद जोड़ें, और rear आगे बढ़ाएँ।
void enqueue(int x) {
struct Node *n = malloc(sizeof(struct Node));
n->data = x; n->next = NULL;
if (rear == NULL) { front = rear = n; return; } // khaali
rear->next = n; // rear ke baad link
rear = n; // naya rear
}Front पर dequeue
Front node लें, front आगे बढ़ाएँ, और पुराना node free करें।
int dequeue() {
if (front == NULL) { printf("Queue empty\n"); return -1; }
struct Node *temp = front;
int x = temp->data;
front = front->next;
if (front == NULL) rear = NULL; // yahi aakhri node tha!
free(temp);
return x;
}जब आप आख़िरी node dequeue करते हैं, front NULL हो जाता है। आपको rear को भी NULL करना होगा, वरना वह free हुई memory पर लटका रहेगा।
पूरा program
#include <stdio.h>
#include <stdlib.h>
struct Node { int data; struct Node *next; };
struct Node *front = NULL, *rear = NULL;
void enqueue(int x) {
struct Node *n = malloc(sizeof(struct Node));
n->data = x; n->next = NULL;
if (rear == NULL) { front = rear = n; return; }
rear->next = n; rear = n;
}
int dequeue() {
if (front == NULL) { printf("Empty\n"); return -1; }
struct Node *temp = front;
int x = temp->data;
front = front->next;
if (front == NULL) rear = NULL;
free(temp);
return x;
}
int main() {
enqueue(10); enqueue(20); enqueue(30);
printf("Removed: %d\n", dequeue()); // 10
printf("Removed: %d\n", dequeue()); // 20
return 0;
}Removed: 10
Removed: 20
Dry run
| क्रिया | front | rear | Queue |
|---|---|---|---|
| enqueue 10 | 10 | 10 | 10 |
| enqueue 20 | 10 | 20 | 10, 20 |
| enqueue 30 | 10 | 30 | 10, 20, 30 |
| dequeue → 10 | 20 | 30 | 20, 30 |
आम गलतियाँ
- आख़िरी node dequeue होने पर
rear = NULLset करना भूलना। - Enqueue में empty case न संभालना (दोनों pointers NULL से शुरू)।
- Dequeue किए node को
freeकरना भूलना, जिससे memory leak होता है। - Front पर जोड़ना या rear पर हटाना — यह FIFO क्रम तोड़ता है।
एक display() function जोड़ें जो front से अंत तक चलकर हर value print करे, और हर operation के बाद उसे call करके queue बदलते देखें।
सारांश
- Linked-list queue
frontऔरrearnode pointers इस्तेमाल करता है। - Enqueue rear पर node जोड़ता है; dequeue front से हटाता है।
- यह run time पर बढ़ता-घटता है — न fixed size, न बर्बाद slots।
- आख़िरी node जाने पर
rearकोNULLकरें। - Leaks से बचने के लिए हटाए node को हमेशा
freeकरें।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में linked list से queue कैसे implement करते हैं?
front और rear। Enqueue के लिए एक नया node बनाकर rear के बाद जोड़ते हैं, फिर rear उस पर ले जाते हैं। Dequeue के लिए front वाला node लेते हैं, front अगले node पर ले जाते हैं, और पुराना free करते हैं। इससे queue run time पर बढ़ती-घटती है।Queue के लिए array के बजाय linked list क्यों?
Linked-list queue में front और rear किस ओर इशारा करते हैं?
front पहले node की ओर — अगले हटने वाले item — और rear आख़िरी node की ओर, जहाँ नए items जुड़ते हैं। Queue खाली होने पर दोनों NULL होते हैं।आख़िरी element dequeue करने पर क्या होता है?
front NULL हो जाता है। आपको rear को भी NULL करना होगा, वरना rear free हुई memory की ओर इशारा करेगा और अगला enqueue गड़बड़ करेगा। इस स्थिति को संभालना आम bug स्रोत है।