ट्रैक
/
Lean
Lean
/
अभ्यास
/
लिंक्ड लिस्ट
लिंक्ड लिस्ट

लिंक्ड लिस्ट

कठिन

परिचय

आप एक व्यस्त रेल नेटवर्क के लिए ट्रेन शेड्यूलिंग सिस्टम बनाने की परियोजना पर काम कर रहे हैं।

आपको शेड्यूलिंग सिस्टम के ट्रेन मार्गों के लिए एक प्रोटोटाइप बनाने के लिए कहा गया है। हर मार्ग ट्रेन स्टेशनों के एक ऐसे क्रम से बना होता है जहाँ एक निश्चित ट्रेन रुकती है।

निर्देश

आपकी टीम ने तय किया है कि समय-सारणी के हर ट्रेन मार्ग को दर्शाने के लिए डबली लिंक्ड लिस्ट का उपयोग किया जाएगा। ट्रेन के मार्ग पर पड़ने वाले हर स्टेशन को लिंक्ड लिस्ट में एक नोड से दर्शाया जाएगा।

आपको स्टेशनों पर पहुँचने और रवाना होने के समय की चिंता करने की ज़रूरत नहीं है। हर स्टेशन को बस एक संख्या से दर्शाया जाएगा।

मार्गों को बढ़ाया जा सकता है, यानी मार्ग के शुरू या अंत में स्टेशन जोड़े जा सकते हैं। मार्गों को छोटा भी किया जा सकता है, यानी मार्ग के शुरू या अंत से स्टेशन हटाए जा सकते हैं।

कभी-कभी कोई स्टेशन बंद हो जाता है, और ऐसी स्थिति में उस स्टेशन को मार्ग से हटाना पड़ता है, भले ही वह मार्ग के शुरू या अंत में न हो।

किसी मार्ग का आकार इस बात से नहीं नापा जाता कि ट्रेन कितनी दूर चलती है, बल्कि इस बात से कि वह कितने स्टेशनों पर रुकती है।

Note

लिंक्ड लिस्ट कंप्यूटर विज्ञान की एक बुनियादी डेटा स्ट्रक्चर है, जिसका उपयोग अक्सर दूसरी डेटा स्ट्रक्चर बनाने में होता है। जैसा कि नाम से पता चलता है, यह उन नोड की सूची है जो आपस में जुड़े होते हैं। यह "नोड" की सूची है, जहाँ हर नोड अपने पड़ोसी या पड़ोसियों से जुड़ा होता है। एक सिंगली लिंक्ड लिस्ट में हर नोड सिर्फ अपने बाद वाले नोड से जुड़ा होता है। एक डबली लिंक्ड लिस्ट में हर नोड अपने से पहले वाले नोड के साथ-साथ बाद वाले नोड से भी जुड़ा होता है।

अगर आप लिंक्ड लिस्ट के बारे में और गहराई से जानना चाहते हैं, तो यह लेख देखिए, जिसमें अच्छे चित्रों की मदद से इसे समझाया गया है।

स्थिति वाले डेटा स्ट्रक्चर

Lean जैसी फंक्शनल भाषाओं में ज़्यादातर वैल्यू डिज़ाइन से ही अपरिवर्तनीय होती हैं। इसका मतलब है कि अपडेट आम तौर पर एक नई वैल्यू बनाकर किए जाते हैं। पुरानी और नई, दोनों वैल्यू साथ-साथ रहती हैं, और दोनों को इस्तेमाल किया जा सकता है।

हालाँकि, ऐसे कई मौके आते हैं जब स्थिति वाली वैल्यू चाहिए होती है, या ज़रूरी ही हो जाती है। स्थिति वाली वैल्यू को म्यूटेशन के ज़रिए अपडेट किया जाता है, यानी पुरानी वैल्यू को बदल दिया जाता है, नई बनाई नहीं जाती। म्यूटेशन के बाद सिर्फ अपडेट की गई वैल्यू ही इस्तेमाल की जा सकती है।

ध्यान रखिए कि म्यूटेशन भाषा की कुछ गारंटियाँ तोड़ सकते हैं। एक प्योर फंक्शन को इनपुट के एक ही सेट के लिए हमेशा एक ही परिणाम लौटाना चाहिए, लेकिन अगर कोई इनपुट समय के साथ बदल सकता है, तो वही आर्गुमेंट देकर कॉल करने पर भी फंक्शन अलग-अलग परिणाम लौटा सकता है। इसी तरह, अगर कोई फंक्शन परिणाम लौटाने के अलावा बाहरी बदलाव भी कर सकता है, या अपने पैरामीटर के अलावा दूसरे स्रोतों से पढ़ सकता है, तो एक ही फंक्शन को दो बार कॉल करने पर अलग-अलग परिणाम मिल सकते हैं, और कभी-कभी ऐसे परिणाम जिनका अनुमान लगाना मुश्किल होता है।

ऐसे स्थिति वाले व्यवहार को संभालने के लिए, Lean दूसरी फंक्शनल भाषाओं की तरह चाहता है कि इफेक्ट वाले फंक्शन एक खास तरह के स्ट्रक्चर में लपेटे जाएँ, जो उन्हें प्योर फंक्शन से अलग करता हो। ऐसे स्ट्रक्चर को मोनैड कहा जाता है।

ध्यान देना ज़रूरी है कि हर स्थिति वाली वैल्यू भले ही किसी इफेक्ट वाले मोनैड के अंदर रहती हो, हर मोनैड बदलने योग्य स्थिति नहीं दर्शाता। "प्योर" मोनैड के कुछ खास उदाहरण Option, Except और Id हैं।

इस अभ्यास में आप LinkedList नाम का एक स्थिति वाला डेटा स्ट्रक्चर बनाने जा रहे हैं। इस डेटा स्ट्रक्चर के इंस्टेंस म्यूटेशन से अपडेट किए जाते हैं।

इसे संभालने के लिए सारे फंक्शन ST मोनैड के अंदर लपेटे गए हैं। इस मोनैड में बदलने योग्य स्थिति ही एकमात्र साइड इफेक्ट है, और बदलने योग्य रेफ़रेंस बाहर नहीं निकल सकते। ज़्यादा जानकारी के लिए आप रेफ़रेंस देख सकते हैं।


स्रोत

कंप्यूटर विज्ञान का एक क्लासिक विषय
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Lean Exercism

लिंक्ड लिस्ट शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Lean को 100 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।