লিঙ্ক লিস্ট দ্বিতীয় পর্বে সবাইকে স্বাগতম। এ পর্বে আমরা কিভাবে লিস্টের শেষে নোড যুক্ত করা যায় সে ব্যাপারে আলোচনা করবো। এর আগে লিঙ্ক লিস্ট নিয়ে আরেকটি পর্ব প্রকাশ করা হয়েছে। তা দেখা যাবে এখান থেকে । তো শুরু করা যাক!
প্রথমেই আমরা নিজেদের মত করে একটি ডাটা টাইপ তৈরী করবো যা একই সাথে ভেলু, এবং পয়েন্টার নিতে পারবে। আমরা বোঝা সুবিধার্থে একটা একটা ভেলু নিয়েই কাজ করবো। তার মানে আমাদের নতুন সৃষ্ট ডাটা টাইপ এমন হবে যা শুধুমাত্র একটি ভেলু এবং একটি পয়েন্টার নিতে পারবে।
struct Node{
int data;
struct Node *next;
}
এখন আমাদের নতুন একটি ডাটা টাইপ তৈরী হলো, যার নাম struct Node ! এটি একই সাথে একটি ইন্টেজার এবং একটি পয়েন্টার নিতে পারে। যেহেতু একে আমরা ভিবিন্ন যায়গায় ব্যাবহার করবো সেহেতু Tyepdef ব্যাবহার করে একে ছোট করে নিচ্ছি।
typedef struct Node node
আমরা typedef ব্যাবহার নতুন ডাটা টাইপ node তৈরী করে ফেললাম। এখন কোথাও ডিক্লেয়ার করতে হলে আমাদের জাস্ট node লিখলেই হবে। আবারও বলছি, এখানে node এমন একটি ভেরিয়েবল যা একই সাথে ইন্টেজার এবং পয়েন্টার নিতে পারবে।এইবার আমরা মুল আলোচনায় আসি! কিভাবে নোড কোন লিস্টের শেষে অ্যাড করা যায়। আমরা insert node এর কাজটি user defined function দিয়ে করবো! আর মেইন ফাংশন থেকে ডাটা পাঠাবো!
node *head,*tail;
int main()
{
insert(10);
insert(20);
insert(30);
insert(40);
insert(50);
display(tail);
return 0;
}
এখানে নোড টাইপের গ্লোবাল পয়েন্টার হিসেবে head এবং tail ডিক্লেয়ার করে নিলাম যাতে সকল ফাংশনে ব্যাবহার করা যায়। এই দুইটা পয়েন্টার যেকোন node টাইপের ভেরিয়েবলের অ্যাড্রেস রাখতে পারবে। এই মুহূর্তে head এবং tail কাউকে পয়েন্ট করছেনা। কারন তাকে আমরা এখনো কোন অ্যাড্রেস দেইনাই । অন্যভাবে বলতে গেলে পয়েন্টার দুটি NULL পয়েন্টার করে আছে আর নালকে পয়েন্ট করা মানে কাউকে পয়েন্ট করেনা।তারপর প্রথমে মেইন ফাংশনের কাজ করে ফেললাম। insert ফাংশনকে কল করবো এবং এক এক করে আমরা 10,20,30,40,50 আর্গুমেন্টগুলো পাঠাবো! আর প্রিন্টগুলো আমরা একত্রে display()ফাংশনের মাধ্যমে করবো!
যাইহোক, insert ফাংশন implement করে ফেলি!
1: void insert(int data)
2: {
3: if(head==NULL){ //first the head is null
4: head=(node*)malloc(sizeof(node)); //memory allocate for head
5: tail=head; //point head and tail at same place
6: head->data=data; //assign value at particular position
7: head->next=NULL;
8: }
9: else{
10: head->next=(node*)malloc(sizeof(node)); ///memory allocate for next node
11: head=head->next; //moving head
12: head->data=data; //assign value at next node
13: head->next=NULL;
14: }
15: }
এখানে আসলে কি ঘটছে?প্রথমে 10 নিয়ে insert ফাংশনের ভেতর আসবে। যেহেতু প্রথমে head==NULL সেহেতু if কন্ডিশনের মধ্যে প্রবেশ করবে। তারপর head এর জন্য মেমরি allocate করবে। memory allocate করা মানে প্রয়োজনীয় মেমরি তৈরী করা। malloc যেহেতু void pointer রিটার্ন করে সেহেতু টাইপকাস্ট করে আমরা তাকে node pointer করে নিলাম। তারপর tail=head করে দিলাম। এখন head এবং tail একই যায়গা পয়েন্ট করে আছে । তরপর আমরা head এর ডাটা অংশে ডাটা রাখবো , মানে প্রথমবার 10 রাখবে। তারপর পয়েন্টার অংশে NULL রাখবে। এই মুহূর্তে লিস্টের অবস্থা ঠিক এইরকমঃ
তারপর মেইন ফাংশ থেকে 10 নিয়ে আসবে। যেহেতু হেড এখন নাল কে পয়েন্ট করতেছেনা সেহেতু if কন্ডিশনে না গিয়ে else এ যাবে। তখন head->next এর জন্য মেমরি allocate করবে। তারপর হেডকে আমরা মুভ করে সেখানে নিয়ে গেলামম। এরপর আমরা সেখানে(head->data) তে সেই ভেলু 20 রেখে দিলাম এবং head->next হয়ে থাকবে কারন এখনো আমরা তার জন্য মেমরি allocate করিনি। এই মুহূর্তে লিস্টের অবস্থা এরকম হবেঃ
এরপর আবার 30 নিয়ে আসবে। তারপর তা else এর ভিতর প্রবেশ করবে এবং দশম লাইনে head->next এর জন্য মেমরি allocate করবে, লাইন ১১ তে head কে মুভ করে head->next এ নিয়ে আসবে তারপর ১২ তম লাইনে এসে head-data তে 30 রাখবে এবং 13 তম লাইনে এসে head->next এ NULL বসিয়ে দিবে। এভাবে চলতে থাকবে যতক্ষন পর্যন্ত মেইন ফাংশন থেকে ডাটা পাঠাতে থাকে। তবে ইচ্ছে করলে এই পুরো কাজটা লুপ দিয়েও করা যায়। যাইহোক সর্বশেষ ডাটা assign করার পর আমাদের লিস্টের অবস্থা এরকম হবেঃ
এখন আমাদের ডাটা নিয়ে একটি লিস্ট তৈরী হয়ে গেল। আমরা এখন এগুলোকে স্ক্রিনে প্রিন্ট করবো! এ জন্য আমাদের লিস্টের শুরু থেকে শেষ পর্যন্ত কোন পয়েন্টারকে ঘুরাতে বা পরিভ্রমন করতে হবে। এ পদ্ধতিকে Traversal বলা হয়। একটু লক্ষ করলে বুঝতে পারবেন আমাদের tail কিন্তু এখনো প্রথম নোডকে পয়েন্ট করে আছে। তার মানে আমরা যদি একে সেখান থেকে শেষ পর্যন্ত Traverse করাতে পারি তাহলে আমরা সমস্থ নোডকে প্রিন্ট করে ফেলতে পারি । তাহলে আমরা এখন Display function এর কাজ করে ফেলি। এখানে Display function দিয়ে আমরা আমাদের ডাটাগুলোকে প্রিন্ট করবো । যাইহোক বক বক না করে লিখে ফেলা যাকঃ
void display(node *list){
while(list!=NULL){
printf("%d\n",list->data);
list=list->next;
}
মেইন ফাংশ থেকে Display function কে কল করা হয়েছে। tail কে প্যারামিটার হিসেবে পাঠানো হয়েছে। যাদের user defined function সম্পর্কে ধারনা আছে তাদের সেটা বুঝে ফেলার কথা। তারপর লুপ ক্রমান্বয়ে NULL পর্যন্ত ঘুরবে এবং প্রতিটি ঘূর্ণনে data স্ক্রিনে প্রিন্ট করে দিবে। স্ক্রিনে ঠিক এভাবে দেখাবে
10
20
30
40
50
আজ এ পর্যন্তই। পরবর্তী পর্বে দেখবো কিভবে লিস্টের শুরুতে নোড যুক্ত করা যায়। ততক্ষন পর্যন্ত ভালো থাকুন । ধন্যবাদ ।