منسلک فہرست

آزاد دائرۃ المعارف، ویکیپیڈیا سے
ایک منسلک فہرست جس کے نوڈس کے دو حصے ہیں: ایک عددی قدر اور ایک لنک یا اگلے نوڈ کا حوالہ۔ آخری نوڈ ایک ٹرمینیٹر یا null قدر سے منسلک ہے، جو فہرست کے اختتام کی نشان دہی کرتا ہے۔

منسلک فہرست ایک لکیری ڈیٹا ڈھانچہ ہے جہاں عناصر، جنہیں نوڈز کہا جاتا ہے، متصل میموری والے مقامات پر محفوظ نہیں کیا جاتا ہے۔ اس کی بجائے، ہر نوڈ میں ترتیب میں اگلے نوڈ کا ڈیٹا اور ایک حوالہ یا پوائنٹر ہوتا ہے۔ یہ متحرک میموری مختص کرنے کی اجازت دیتا ہے، یعنی فہرست کا سائز پروگرام کے عمل کے دوران ضرورت کے مطابق بڑھ سکتا ہے یا سکڑ سکتا ہے۔ اس کا بنیادی فائدہ یہ ہے کہ کسی فہرست میں ڈیٹا شامل کرنا یا ہٹانا بہت آسان ہے، کیونکہ اس کے لیے میموری میں پورے ڈھانچے کو ایک ہی ترتیب میں ترتیب دینے کی ضرورت نہیں ہے۔ کیونکہ منسلک فہرست میں نوڈس میموری میں متصل ہونے کی بجائے لڑکھڑا رہے ہیں۔ متحرک ہونے کی وجہ سے، فہرست کو ضرورت کے مطابق بڑھایا یا گھٹایا جا سکتا ہے۔

تاریخ[ترمیم]

1955-1956 کے آس پاس، ایلن نیویل، کلف شا اور ہربرٹ شمون نے رینڈ کارپوریشن میں معلوماتی زبان کی پروسیسنگ کی ضروریات کے لیے بنیادی ڈیٹا ڈھانچہ تیار کیا۔ اس کے علاوہ، 1953 میں IBM کو لکھے گئے خط میں، ہنس پیٹر لن نے ہیش ٹیبلز میں منسلک فہرستوں کے استعمال کا مشورہ دیا۔

بنیادی تصور[ترمیم]

فہرست میں ہر ریکارڈ کو نوڈ کہا جاتا ہے۔ نوڈ کے پہلے حصے میں ڈیٹا ہوتا ہے اور دوسرے حصے میں اگلے نوڈ کا پتہ ہوتا ہے جسے 'اگلا پوائنٹر' کہا جاتا ہے۔ پہلے نوڈ کو فہرست کا سربراہ کہا جاتا ہے اور آخری نوڈ کو دم کہا جاتا ہے۔

واحد فہرست[ترمیم]

ہر نوڈ میں ڈیٹا فیلڈ اور اگلا پوائنٹر فیلڈ ہوتا ہے۔ اس میں عام طور پر انسرٹ (نوڈ یا ڈیٹا کا اضافہ)، ڈیلیٹ (نوڈ یا ڈیٹا کو ہٹانا) اور ٹراورس (پوری فہرست کی گردش) آپریشنز شامل ہوتے ہیں۔ درج ذیل کوڈ سے پتہ چلتا ہے کہ فہرست کے آخر میں 'ویلیو' نام کا نوڈ کیسے داخل کیا جائے:

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

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;    // ہیڈ نوڈ پوائنٹر واپس کریں۔
}

حوالہ جات[ترمیم]

بیرونی روابط[ترمیم]