একটি লিঙ্কযুক্ত তালিকা হল একটি রৈখিক ডেটা কাঠামো যেখানে উপাদানগুলি পয়েন্টারের মাধ্যমে লিঙ্ক করা হয়। লিঙ্ক করা তালিকার প্রতিটি উপাদান বা নোডের একটি ডেটা অংশ এবং লিঙ্ক রয়েছে, বা আমরা ক্রমানুসারে পরবর্তী উপাদানটির পয়েন্টার বলতে পারি। উপাদানগুলি মেমরিতে অসংলগ্ন অবস্থান নিতে পারে৷
আমাদের একটি এককভাবে লিঙ্ক করা তালিকা দেওয়া হয়েছে যেখানে একটি ডেটা অংশ এবং পরবর্তী উপাদানের লিঙ্ক রয়েছে। অন্য ইনপুট হল একটি সংখ্যা K। টাস্ক হল একটি লিঙ্ক করা তালিকার সর্বোচ্চ এবং সর্বনিম্ন উপাদান খুঁজে বের করা যা K সংখ্যা দ্বারা বিভাজ্য। রৈখিক লিঙ্কযুক্ত তালিকাটি শুধুমাত্র একটি দিক দিয়ে অতিক্রম করা যেতে পারে। প্রতিটি নোডে আমরা K দিয়ে এর ডেটা অংশের বিভাজ্যতা পরীক্ষা করব। যদি এই সংখ্যাটি সর্বাধিক বা সর্বনিম্ন পাওয়া যায় তাহলে আমরা MaxD এবং MinD-এর মান আপডেট করব।
ইনপুট
SList : 5-->2-->10-->12-->3-->20-->7, K=5
আউটপুট
Maximum element which is divisible by K : 20 Maximum element which is divisible by K : 5
ব্যাখ্যা − হেড নোড থেকে ট্র্যাভার্সিং করে, ডেটা অংশটিকে K দিয়ে ভাগ করতে থাকুন এবং এটি সম্পূর্ণরূপে বিভাজ্য কিনা তা পরীক্ষা করুন, যা অবশিষ্টাংশ 0 আসে৷
শুধুমাত্র 5, 10 এবং 20 5 দ্বারা বিভাজ্য যার মধ্যে 5টি সর্বনিম্ন এবং 20 সর্বাধিক৷
ইনপুট
SList : 12-->2-->5-->18-->3-->144-->7, K=4
আউটপুট
Maximum element which is divisible by K : 144 Maximum element which is divisible by K : 12
ব্যাখ্যা − হেড নোড থেকে ট্র্যাভার্সিং করে, ডেটা অংশটিকে K দিয়ে ভাগ করতে থাকুন এবং এটি সম্পূর্ণরূপে বিভাজ্য কিনা তা পরীক্ষা করুন, যা অবশিষ্টাংশ 0 আসে৷
শুধুমাত্র 12, এবং 144 4 দ্বারা বিভাজ্য যার মধ্যে 12টি সর্বনিম্ন এবং 144টি সর্বাধিক৷
নিম্নলিখিত প্রোগ্রামে ব্যবহৃত পদ্ধতি
-
একটি লিঙ্ক তালিকা নোড তৈরি করুন. এখানে আমরা একটি ক্লাস SLLnode তৈরি করেছি, যার তথ্য অংশ এবং পরবর্তী পয়েন্টার রয়েছে।
-
একটি লিঙ্ক তালিকা তৈরি করুন. এখানে আমরা SLLnode অবজেক্টের সদস্য হিসাবে একটি ক্লাস SLList তৈরি করেছি। তাই SLLlist SLLnodes নিয়ে গঠিত।
-
ফাংশন addtohead(int) এই তালিকায় নোড যোগ করছে।
-
SLList এ উপাদান যোগ করতে আমরা LIST নামের SLList অবজেক্ট ব্যবহার করে addtohead(int) কল করছি।
-
একবার SLList তৈরি হয়ে গেলে আমরা ফাংশনকে বিভাজ্য (SLLnode,int) বলি যা দুটি ইনপুট প্যারামিটারের হেড অফ লিস্ট এবং পূর্ণসংখ্যা K.
-
এখন বিভাজ্যের ভিতরে আমরা একটি লিঙ্ক করা তালিকার সর্বাধিক এবং সর্বনিম্ন উপাদান সংরক্ষণ করতে দুটি ভেরিয়েবল maxD এবং minD নিই যা একটি প্রদত্ত সংখ্যা K দ্বারা বিভাজ্য৷
-
maxD -1 দিয়ে আরম্ভ করা হয়েছে এবং minD 9999 সূচনা করা হয়েছে। এটিকে পরিসর হিসেবে ধরা হয় যেখানে ইনপুট থাকে।
-
লুপের ভিতরে আমরা হেড থেকে শুরু করে লিঙ্ক করা তালিকাটি অতিক্রম করি। এই ভেরিয়েবলের জন্য শুরু হচ্ছে মাথার দিকে নির্দেশ করে।
-
প্রতিটি নোডের তথ্য অংশকে maxD এবং minD এর সাথে তুলনা করুন এবং এটি K এর সাথে বিভাজ্যতা। বর্তমান নোডের তথ্য যদি বিভাজ্য হয় এবং বর্তমান তথ্য অংশের সাথে minD আপডেট minD থেকে কম হয়।
-
যদি বর্তমান নোডের তথ্য K দ্বারা বিভাজ্য এবং maxD এর থেকে বড় হয়, তাহলে বর্তমান তথ্য অংশের সাথে maxD আপডেট করুন।
-
প্রাপ্ত ফলাফলটি minD এবং maxD এ প্রিন্ট করুন।
উদাহরণ
#include<iostream.h> #include<process.h> #include<conio.h> class SLLnode{ public: int info; SLLnode *next; SLLnode(int e1,SLLnode *ptr=0){ info=e1; next=ptr; } }; class SLList{ public: SLLnode *head; SLList() { head=0; } void addtohead(int); }; void SLList::addtohead(int el) { head=new SLLnode(el,head); } void Divisible(SLLnode* head, int K){ int minD=9999; int maxD=-1; SLLnode* start=head; for(start;start->next!=NULL;start=start->next){ if ((start->info < minD) && (start->info % K == 0)) minD = start->info; if ((start->info > maxD) && (start->info % K == 0)) maxD = start->info; } cout << "Max Element divisible by K: " << maxD << endl; cout << "Min Element divisible by K: " << minD; } // Driver Code int main(){ clrscr(); // Start with empty list SLList LIST; LIST.addtohead(50); LIST.addtohead(21); LIST.addtohead(32); LIST.addtohead(45); LIST.addtohead(11); LIST.addtohead(23); LIST.addtohead(90); LIST.addtohead(56); int K = 5; Divisible(LIST.head, K); getch(); return 0; }
আউটপুট
যদি আমরা উপরের কোডটি চালাই তবে এটি নিম্নলিখিত আউটপুট −
উৎপন্ন করবেMax Element divisible by K: 90 Min Element divisible by K: 45