কম্পিউটার টিউটোরিয়াল

ডাবলি লিংকড লিস্ট দিয়ে প্রায়োরিটি কিউ বাস্তবায়ন C++-তে


ডেটা এবং প্রায়োরিটি (ইন্টিজার ভ্যালু) দেওয়া আছে এবং কাজ হলো প্রায়োরিটি অনুযায়ী ডাবলি লিংকড লিস্ট তৈরি করে ফলাফল দেখানো।

কিউ হলো একটি FIFO ডেটা স্ট্রাকচার যেখানে প্রথমে ইনসার্ট করা এলিমেন্ট প্রথমে রিমুভ হয়। প্রায়োরিটি কিউ হলো কিউর এক ধরন যেখানে এলিমেন্ট প্রায়োরিটি অনুযায়ী ইনসার্ট বা ডিলিট হয়। এটি কিউ, স্ট্যাক বা লিংকড লিস্ট দিয়ে বাস্তবায়ন করা যায়। প্রায়োরিটি কিউ নিচের নিয়মগুলো মেনে চলে:

  • সর্বোচ্চ প্রায়োরিটivit वाले ডেটা বা এলিমেন্ট প্রথমে এক্সিকিউট হবে।
  • দুই এলিমেন্টের প্রায়োরিটি সমান হলে সেগুলো যোগ হওয়ার ক্রমে এক্সিকিউট হবে।

প্রায়োরিটি কিউ বাস্তবায়নের জন্য ডাবলি লিংকড লিস্টের একটি নোডে তিনটি অংশ থাকবে:

  • Data - ইন্টিজার ভ্যালু সংরক্ষণ করবে।
  • Next Address - পরের নোডের ঠিকানা সংরক্ষণ করবে।
  • Previous Address - আগের নোডের ঠিকানা সংরক্ষণ করবে।
  • Priority - প্রায়োরিটি সংরক্ষণ করবে (ইন্টিজার ভ্যালু)। এটি ০-১০ পর্যন্ত হতে পারে, যেখানে ০ সর্বোচ্চ প্রায়োরিটি এবং ১০ ন্যূনতম।

উদাহরণ

ইনপুট -

ডাবলি লিংকড লিস্ট দিয়ে প্রায়োরিটি কিউ বাস্তবায়ন C++-তে

আউটপুট -

ডাবলি লিংকড লিস্ট দিয়ে প্রায়োরিটি কিউ বাস্তবায়ন C++-তে

অ্যালগরিদম

শুরু
ধাপ ১ -> struct Node ঘোষণা
    info, priority ঘোষণা
    struct Node *prev, *next ঘোষণা
ধাপ ২ -> push(Node** fr, Node** rr, int n, int p) ফাংশনে
    Node* news = (Node*)malloc(sizeof(Node)) সেট
    news->info = n সেট
    news->priority = p সেট
    যদি *fr == NULL হয়, তবে
        *fr = news সেট
        *rr = news সেট
        news->next = NULL সেট
    অন্যথায় যদি p <= (*fr)->priority হয়, তবে
        news->next = *fr সেট
        (*fr)->prev = news->next সেট
        *fr = news সেট
    অন্যথায় যদি p > (*rr)->priority হয়, তবে
        news->next = NULL সেট
        (*rr)->next = news সেট
        news->prev = (*rr)->next সেট
        *rr = news সেট
    অন্যথায়
        Node* start = (*fr)->next সেট
        লুপ যতক্ষণ start->priority > p
            start = start->next সেট
        (start->prev)->next = news সেট
        news->next = start->prev সেট
        news->prev = (start->prev)->next সেট
        start->prev = news->next সেট
ধাপ ৩ -> int peek(Node *fr) ফাংশনে
    fr->info রিটার্ন
ধাপ ৪ -> bool isEmpty(Node *fr) ফাংশনে
    (fr == NULL) রিটার্ন
ধাপ ৫ -> int pop(Node** fr, Node** rr) ফাংশনে
    Node* temp = *fr সেট
    res = temp->info সেট
    (*fr) = (*fr)->next সেট
    free(temp)
    যদি *fr == NULL হয়, তবে
        *rr = NULL সেট
    res রিটার্ন
ধাপ ৬ -> int main() ফাংশনে
    Node *front = NULL, *rear = NULL ঘোষণা এবং অ্যাসাইন
    push(&front, &rear, 4, 3) কল
    push(&front, &rear, 3, 2) কল
    push(&front, &rear, 5, 2) কল
    push(&front, &rear, 5, 7) কল
    push(&front, &rear, 2, 6) কল
    push(&front, &rear, 1, 4) কল
    pop(&front, &rear) কল করে ফলাফল প্রিন্ট
    peek(front) কল করে ফলাফল প্রিন্ট
শেষ

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
// ডাবলি লিংকড লিস্ট নোড
struct Node {
    int info;
    int priority;
    struct Node *prev, *next;
};
// নতুন নোড ইনসার্ট
void push(Node** fr, Node** rr, int n, int p) {
    Node* news = (Node*)malloc(sizeof(Node));
    news->info = n;
    news->priority = p;
    // যদি লিংকড লিস্ট খালি হয়
    if (*fr == NULL) {
        *fr = news;
        *rr = news;
        news->next = NULL;
    } else {
        // যদি p ফ্রন্ট নোডের প্রায়োরিটির চেয়ে কম বা সমান হয়, তবে ফ্রন্টে ইনসার্ট
        if (p <= (*fr)->priority) {
            news->next = *fr;
            (*fr)->prev = news->next;
            *fr = news;
        } else if (p > (*rr)->priority) {
            news->next = NULL;
            (*rr)->next = news;
            news->prev = (*rr)->next;
            *rr = news;
        } else {
            // নতুন নোড ইনসার্ট করার পজিশন খুঁজে বের করা
            Node* start = (*fr)->next;
            while (start->priority > p)
                start = start->next;
            (start->prev)->next = news;
            news->next = start->prev;
            news->prev = (start->prev)->next;
            start->prev = news->next;
        }
    }
}
// শেষ ভ্যালু
int peek(Node *fr) {
    return fr->info;
}
bool isEmpty(Node *fr) {
    return (fr == NULL);
}
int pop(Node** fr, Node** rr) {
    Node* temp = *fr;
    int res = temp->info;
    (*fr) = (*fr)->next;
    free(temp);
    if (*fr == NULL)
        *rr = NULL;
    return res;
}
// মেইন ফাংশন
int main() {
    Node *front = NULL, *rear = NULL;
    push(&front, &rear, 4, 3);
    push(&front, &rear, 3, 2);
    push(&front, &rear, 5, 2);
    push(&front, &rear, 5, 7);
    push(&front, &rear, 2, 6);
    push(&front, &rear, 1, 4);
    printf("%d\n", pop(&front, &rear));
    printf("%d\n", peek(front));
    return 0;
}

আউটপুট

5 3

  1. লিংকড লিস্ট ফ্ল্যাটেন করা (C++)

  2. C++-এ ডাবলি লিংকড লিস্টের আকার (Size) বের করার প্রোগ্রাম

  3. লিংকড লিস্ট ব্যবহার করে C++-এ দুটি পলিনোমিয়াল যোগ করা

  4. C++ প্রোগ্রাম: লিংকড লিস্ট ব্যবহার করে গ্রাফ রিপ্রেজেন্টেশন