2/10/2015

লিংক লিস্ট (দ্বিতীয় পর্ব)

By : Unknown
On : 12:56 am


গত পর্বে আমরা দেখেছি কি ভাবে একটা লিস্ট তৈরি করতে হয়,এবং লিস্টে কি ভাবে ডেটা সংযুক্ত করতে হয়।তো লিস্টে বিভিন্ন ভাবে,এবং বিভিন্ন প্রয়োজনে ডেটা সংযুক্ত করা হয়ে থাকে।তো আজকে আমরা মূলত জানার চেষ্টা করবো কি ভাবে লিস্টের প্রথমে,লিস্টের মাঝে, এবং লিস্টের শেষে... ডেটা সংসুক্ত করা যায় ।

লিস্টের প্রথমে ডেটা সংযুক্ত করা:

ধরুন আমাদের একটা লিস্ট তৈরি করা আছে,তো এখন যদি ঐ লিস্টের প্রথমেই আমাদেরকে কোন ডেটা সংযুক্ত করতে হয় তখন আমরা নিম্নোক্ত উপায়ে সেই কাজটি করবো…..
void insertbeg(int n)
{
    list *temp=(list *)malloc(sizeof(list));
    temp->data=n;
    temp->next=head;
    head=temp;
}
প্রথমে insertbeg() নামে একটা ফাংশন তৈরি করে নিবো…. আর যখন এই ফাংশনের মধ্যে আমরা ডেটা পাঠাবো তখন তা কি ভাবে লিস্টের প্রথমে গিয়ে যুক্ত হবে তা আমরা এখন দেখবো…
    
 insertbeg() এই ফাংশনে ডেটা পাঠানোর সাথে সাথে যে কাজ গুলো এখনে হচ্ছে.. প্রথমে  
list *temp=(list *)malloc(sizeof(list)); এখানে malloc ফাংশন structure এর সমান করে একটি নোড সে তৈরি করে নিলো… তো এখন এই নোডে একটা ডেটা পার্ট এবং একটি অ্যাড্রেস পার্ট আছে।
temp->data=n;
এই লাইনে আসার পর আমরা যে value এই ফাংশনে পাঠিয়েছি তা temp নোডের ডেটা পার্টে যুক্ত হবে.
temp->next=head;
আমরা head কে নাল করে রেথেছি তাই temp নোডের অ্যাড্রেস পার্টে নাল থাকবে।আর আগে থেকে যদি কোন লিস্ট তৈরি করা থাকে তাহলে *head ঐ লিস্টকে যে অ্যাড্রেসের মাধ্যমে পয়েন্ট করে ছিলো সেই অ্যাড্রেস এইখানে বসবে।।।
head=temp;
এই লাইনের মাধ্যমে আমরা বলে দিচ্ছি যে *head, temp কে পয়েন্ট করে থাকবে।


এখন আমরা দেখবো আমরা যে ভেলু গুলো ইনসার্ট করবো তা কি ভাবে লিস্টের প্রথমে আসবে…..
ধরূন আমাদের একটা লিস্ট তৈরি করা আছে, তো এখন আমরা ১০,৯,৮,৭,৬,৫,৪,৩,২,১ এই নম্বর গুলো ইনসার্ট করবো.. তো আমরা এখন যদি ১০ ইনসার্ট করি তাহলে এখন লিস্টের প্রথমে ১০ আছে, আবার এখন যদি ৯ ইনসার্ট করি ৯ এখন লিস্টের প্রথমে চলে যাবে.. মানে লিস্টটা হবে এমন ১,২,৩,৪,৫,৬,৭,৮,৯,১০ যাকে সবার শেষে ইনসার্ট করবো সে লিস্টের প্রথমে চলে যাবে…
আমরা এখন আমাদের একটা তৈরি করা লিস্টে নতুন value সংযুক্ত করবো।



আমরা এখন ওই ফাংশনে 10 insert করলাম,এখন temp->data=n; এখানে আমরা নোডের ভেতরে 10 দিলাম,আর ঐ নোডের next পার্টে -*head এর অ্যাড্রেসটি দিয়ে দিলাম..



এখন head=temp; এই লাইনের মাধ্যমে বোঝানে হেচ্ছে যে *head, temp নোডটিকে পয়েন্ট করে থাকবে,,আর temp->next=head;



এইখানে *head এর অ্যাড্রেসটি আছে… এখানে এসে নতুন নোডের সাথে পূর্বের নোডের লিংক তৈরি হলো।





বিষয়টি আরো ভালো ভাবে বোঝার জন্য আমরা আরো কিছু ভেলু সংযোজন করি…. এবার আমরা লিস্টে ৯ দিবো..




Head=temp; এই লাইনে আসার পর..




এখন আমাদের লিস্টটি দেখতে এই রকম হবে।।।




এভাবে লিংক লিস্টের প্রথমে কোন ডেটা সংযুক্ত করা হয়ে থাকে।।।

লিংক লিস্টে ডেটা প্রিন্ট করা:

আমরা তো লিস্টে ডেটা সংযুক্ত করতে পারি…কিন্তু আমাদেরকে ওই ডেটা গুলো তো প্রিন্ট কি ভাবে করতে হয় সেটাও জানতে হবে,, তা ছারা আমাদের প্রোগ্রাম ঠিক মত কাজ করছে কি করছে না তা আমরা বুজতে পারবোনা..।
তো আমরা আমাদের তৈরি করা লিস্ট প্রিন্ট করার জন্য একটা ফাংশন তৈরি করবো.. যা নিম্নে দেখানো হলো:

void display()
{
    list *ptr=head;
    if(ptr==NULL)
    {
        printf("List is Empty\n");
        return;
    }
    printf("list is : ");
    while(ptr!=NULL)
    {
        printf("%d ",ptr->data);
        ptr=ptr->next;
    }
    printf("\n");
}
আমরা যখন display ফাংশন কল করবো তখন প্রথমে *ptr নামে একটি ভেরিয়েবল নিয়েছি যা head কে পয়েন্ট করে
if(ptr==NULL)
    {
        printf("List is Empty\n");
        return;
    }
আছে,এখন যদি *Ptr নাল হয় মানে লিস্টে যদি কোন ডেটা না থাকে তাহলে আমাদেরকে প্রিন্ট করে দেখাবে যে  List is Empty.
আর লিস্ট যদি Empty না হয় তাহলে???
    while(ptr!=NULL)
    {
        printf("%d ",ptr->data);
        ptr=ptr->next;
    }
যদি Empty না হয় তাহলে আমরা চেক করবো যতক্ষন পর্যন্ত *ptr নাল না হয় ততক্ষন পর্যন্ত লুপটি চলবে এবং লিস্টের ডেটা গুলো প্রিন্ট করতে থাকবো।।।।।

লিংক লিস্টে ডেটা সার্চ করা:

আমরা তো লিস্ট তৈরি করলাম তাই না?? এখন যদি আমাদেরকে অনেক বড় একটি লিস্ট থেকে কোন তথ্য বের করতে বলা হয় তখন আমাদেরকে লিস্টে সার্চ করে সে তথ্য বের করতে হবে।।
এই কাজটি করার জন্য আমরা একটি ফাংশন তৈরি করবো…

void search(int n)
{
    list *ptr=head;
    int count=0;
    while(ptr!=NULL)
    {
        if(ptr->data==n)
        {
            count=1;
        }
        ptr=ptr->next;
    }
    if(count==1)
    {
        printf("Data found\n");
    }
    else
        printf("Not found\n");
}

আমরা যে ভেলু সার্চ করবো সেটি আমাদের লিস্টে আছে কিনা???তা দেখার জন্য  আমার নিম্নোক্ত কাজ গুলো করবো ।

while(ptr!=NULL)
    {
        if(ptr->data==n)
        {
            count=1;
        }
        ptr=ptr->next;
    }

এখানে আমরা একটা লুপ চালাইলাম…যেখানে বলে দিলাম যে ptr যতক্ষন পর্যন্ত NULL না হবে ততক্ষ পর্যন্ত আমাদের দেওয়া ভেলুর সাথে লিস্টের মাঝে যে সব  ভেলূ আছে সে ভেলুর সাথে চেক করবে। আর যদি  আমাদের দেওয়া ভেলুর সাথে লিস্টের ভেলুর মান মিলে যায় তাহলে count নামে একটা ভেরিয়েবল নিয়েছি ঐ ভেরিয়েবলের মান ১ হয়ে যাবে।।

if(count==1)
    {
        printf("Data found\n");
    }
    else
        printf("Not found\n");
}

আর যদি count==1 হয় তার মানে আমাদের দেওয়া ডেটা পাওয়া গেছে… আর না হলে পাওয়া যায় নাই।

      !!▬▬▬▬▬সম্পূর্ণ কোড নিম্নে দেওয়া হলো▬▬▬▬▬▬!!


#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *next;
}*head;
typedef struct node list;
void insert(int n)
{
    list *temp=(list *)malloc(sizeof(list));
    temp->data=n;
    temp->next=NULL;
    if(head==NULL)
    {
        head=temp;
        return;
    }
    list *temp1=head;
    while(temp1->next!=NULL)
    {
        temp1=temp1->next;
    }
    temp1->next=temp;
}
void display()
{
    list *ptr=head;
    if(ptr==NULL)
    {
        printf("List is Empty\n");
        return;
    }
    printf("list is : ");
    while(ptr!=NULL)
    {
        printf("%d ",ptr->data);
        ptr=ptr->next;
    }
    printf("\n");
}
void insertbeg(int n)
{
    list *temp=(list *)malloc(sizeof(list));
    temp->data=n;
    temp->next=head;
    head=temp;
}
void insert_last(int n)
{
    list *temp=(list *)malloc(sizeof(list));
    temp->data=n;
    temp->next=NULL;
    list *temtemp1=head;
    while(temp1->next!=NULL)
    {
        temp1=temp1->next;
    }
    temp1->next=temp;
}
void del(int n)
{
    list *temp=head;
    if(temp==NULL)
    {
        printf("List is empty\n");
        return;
    }
    if(n==1) /// delete first node
    {
        head=head->next;
        free(temp);
        return;
    }
    else if(n==2) /// delete 2nd node
    {
    list *temp1=temp->next;
    temp->next=temp1->next;
    free(temp1);

    }
    else /// delete last node
    {
        list *temp1;
        list *temp2;
        temp1=head;
        while(temp1->next->next!=NULL)
        {
            temp1=temp1->next;
        }
        temp2=temp1->next;
        temp1->next=NULL;
        free(temp2);
    }
}
void search(int n)
{
    list *ptr=head;
    int count=0;
    while(ptr!=NULL)
    {
        if(ptr->data==n)
        {
            count=1;
        }
        ptr=ptr->next;
    }
    if(count==1)
    {
        printf("Data found\n");
    }
    else
        printf("Not found\n");
}
void reverse()
{
    list *current,*pre,*next;
    current=head;
    pre=NULL;
    while(current!=NULL)
    {
        next=current->next;
        current->next=pre;
        pre=current;
        current=next;
    }
    head=pre;
}
int main()
{
    int m,s,k;
    while(1)
    {
        int n,i,j;
        printf("How many numbers do you want to insert?\n");
        scanf("%d",&n);
        system("cls");
        printf("Enter Number\n");
        for(i=0; i<n; i++)
        {
            printf("Number %d = ",i+1);
            scanf("%d",&j);
            insert(j);
        }
        while(1)
        {
            int j;
            printf("\n1=display\n");
            printf("2=Insert at begining\n");
            printf("3=Insert at last\n");
            printf("4=Delete data\n");
            printf("5=Reverse link list\n");
            printf("6=Search number\n");
            printf("7=Insert again\n");
            scanf("%d",&m);
            system("cls");
            if(m==1)
            {
                display();
            }
            else if(m==2)
            {
                printf("Insert number\n");
                scanf("%d",&j);
                insertbeg(j);
            }
            else if(m==3)
            {
                printf("Insert number\n");
                scanf("%d",&j);
                insert_last(j);
            }
            else if(m==4)
            {
                scanf("%d",&j);
                del(j);
                display();
            }
            else if(m==5)
            {
                reverse();
                display();
            }
            else if(m==6)
            {
                int s;
                printf("Enter number for search\n");
                scanf("%d",&s);
                search(s);
            }
            else if(m==7)
            {
                main();
            }
        }
    }
    return 0;
}

   ««▬▬▬▬ সোর্সকোডটি নিচ থেকে ডাউনলোড করেনিন ▬▬▬▬««

                                                                      DOWNLOAD NOW

নিজে নিজে বেশি  বেশি করে প্রোগ্রামিং চর্চা করূন এবং অপরকে উৎসাহিত করূন... মানুষকে ভালোবাসুন,সর্বদা ভালো কিছু করার চিন্তা করুন..... তো আজকে এখানেই শেষ করছি ধন্যবাদ  সবাইকে।।।

0 মন্তব্য সমূহ:

Post a Comment