منسلک فہرست

Left|تصغیر|ایک منسلک فہرست جس کے نوڈس کے دو حصے ہیں: ایک عددی قدر اور ایک لنک یا اگلے نوڈ کا حوالہ۔ آخری نوڈ ایک ٹرمینیٹر یا null قدر سے منسلک ہے، جو فہرست کے اختتام کی نشان دہی کرتا ہے۔
**منسلک فہرست** ایک لکیری ڈیٹا ڈھانچہ ہے جہاں عناصر، جنھیں نوڈز کہا جاتا ہے، متصل میموری والے مقامات پر محفوظ نہیں کیا جاتا ہے۔ اس کی بجائے، ہر نوڈ میں ترتیب میں اگلے نوڈ کا ڈیٹا اور ایک حوالہ یا پوائنٹر ہوتا ہے۔ یہ متحرک میموری مختص کرنے کی اجازت دیتا ہے، یعنی فہرست کا سائز پروگرام کے عمل کے دوران ضرورت کے مطابق بڑھ سکتا ہے یا سکڑ سکتا ہے۔
اس کا بنیادی فائدہ یہ ہے کہ کسی فہرست میں ڈیٹا شامل کرنا یا ہٹانا بہت آسان ہے، کیونکہ اس کے لیے میموری میں پورے ڈھانچے کو ایک ہی ترتیب میں ترتیب دینے کی ضرورت نہیں ہے۔ کیونکہ منسلک فہرست میں نوڈس میموری میں متصل ہونے کی بجائے لڑکھڑا رہے ہیں۔ متحرک ہونے کی وجہ سے، فہرست کو ضرورت کے مطابق بڑھایا یا گھٹایا جا سکتا ہے۔
## تاریخ
1955-1956 کے آس پاس، ایلن نیویل، کلف شا اور ہربرٹ شمون نے رینڈ کارپوریشن میں معلوماتی زبان کی پروسیسنگ کی ضروریات کے لیے بنیادی ڈیٹا ڈھانچہ تیار کیا۔ اس کے علاوہ، 1953 میں IBM کو لکھے گئے خط میں، ہنس پیٹر لن نے ہیش ٹیبلز میں منسلک فہرستوں کے استعمال کا مشورہ دیا۔
## بنیادی تصور
فہرست میں ہر ریکارڈ کو نوڈ کہا جاتا ہے۔ نوڈ کے پہلے حصے میں ڈیٹا ہوتا ہے اور دوسرے حصے میں اگلے نوڈ کا پتہ ہوتا ہے جسے 'اگلا پوائنٹر' کہا جاتا ہے۔ پہلے نوڈ کو فہرست کا سربراہ کہا جاتا ہے اور آخری نوڈ کو دم کہا جاتا ہے۔
### واحد فہرست
ہر نوڈ میں ڈیٹا فیلڈ اور اگلا پوائنٹر فیلڈ ہوتا ہے۔ اس میں عام طور پر انسرٹ (نوڈ یا ڈیٹا کا اضافہ)، ڈیلیٹ (نوڈ یا ڈیٹا کو ہٹانا) اور ٹراورس (پوری فہرست کی گردش) آپریشنز شامل ہوتے ہیں۔ درج ذیل کوڈ سے پتہ چلتا ہے کہ فہرست کے آخر میں 'ویلیو' نام کا نوڈ کیسے داخل کیا جائے:

```c
// منسلک فہرست میں ہر نوڈ ایک اسٹرکچر ہے۔ ہیڈ نوڈ فہرست میں پہلے نوڈ کا پتہ/ایڈریس رکھتا ہے۔

Node *addNodeToTail(Node *head, int value) {
    // نوڈ پوائنٹر کا اعلان کریں اور نئے نوڈ کی طرف اشارہ کرنے کے لئے شروع کریں (یعنی اس کے پاس نئے نوڈ کا میموری ایڈریس ہوگا) جو فہرست میں شامل ہوگا۔
    Node *temp  = malloc(sizeof *temp); /// 'malloc' in stdlib.
    temp->value = value; // نئے نوڈ کے ویلیو فیلڈ میں ڈیٹا شامل کریں۔
    temp->next  = NULL; // nil پر غلط لنکس شروع کریں۔
    
    if (head == NULL) {
        head = temp;     // اگر لنک کردہ فہرست خالی ہے (یعنی، ہیڈ نوڈ پوائنٹر ایک کالعدم پوائنٹر ہے)، تو ہیڈ نوڈ پوائنٹر کو نئے نوڈ کی طرف رکھیں
    }
    else {
        Node *p = head;   // ہیڈ نوڈ پوائنٹر کو نوڈ پوائنٹر 'p' کو تفویض کریں۔
        while (p->next != NULL) {
            p = p->next;    // فہرست کو عبور کریں جب تک کہ p آخری نوڈ نہ ہو۔ آخری نوڈ ہمیشہ NUL کی طرف اشارہ کرتا ہے۔
        }
        p->next = temp; // پہلے آخری نوڈ کو نئے نوڈ کی طرف پوائنٹ بنائیں۔
    }
    
    return head;    // ہیڈ نوڈ پوائنٹر واپس کریں۔
}
```


## حوالہ جات

## بیرونی روابط
* Description from the Dictionary of Algorithms and Data Structures
* Introduction to Linked Lists, Stanford University Computer Science Library
* Linked List Problems, Stanford University Computer Science Library
* Open Data Structures - Chapter 3 - Linked Lists, Pat Morin
* Patent for the idea of having nodes which are in several linked lists simultaneously (note that this technique was widely used for many decades before the patent was granted)
* Implementation of a singly linked list in C
* Implementation of a singly linked list in C++
* Implementation of a doubly linked list in C
* Implementation of a doubly linked list in C++

زمرہ:کمپیوٹر ڈیٹا