Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में मल्टीलेवल लिंक्ड सूची को समतल करना


इस समस्या में, हमें एक मल्टीलेवल लिंक्ड सूची दी गई है। हमारा कार्य मल्टीलेवल लिंक्ड सूची को समतल करने के लिए एक प्रोग्राम बनाना है।

समतल करने का ऑपरेशन इस तरह से किया जाता है कि पहले स्तर के नोड्स पहले लिंक्ड सूची में आएंगे और फिर दूसरे स्तर के नोड्स आएंगे।

मल्टीलेवल लिंक्ड सूची एक बहुआयामी डेटा संरचना है जिसमें लिंक्ड सूची का प्रत्येक नोड दो लिंक पॉइंटर्स रखता है, एक अगले नोड का लिंक और एक चाइल्ड सूची का लिंक जिसमें एक या अधिक नोड्स होते हैं। यह चाइल्ड पॉइंटर अन्य सूची नोड्स को इंगित कर भी सकता है और नहीं भी।

उदाहरण

C++ में मल्टीलेवल लिंक्ड सूची को समतल करना

समस्या को समझने के लिए एक उदाहरण लेते हैं

इनपुट

C++ में मल्टीलेवल लिंक्ड सूची को समतल करना

आउटपुट

1-> 9-> 8 -> 4 -> 6-> 7-> 2-> 3-> 5

समाधान दृष्टिकोण

समस्या का एक सरल समाधान लेवल ऑर्डर ट्रैवर्सल प्रकार के एल्गोरिदम का उपयोग करके करना है। हम पहले नोड से शुरू करके लिंक्ड सूची को पार करेंगे और उसी स्तर के सभी नोड्स को पार करेंगे। यदि किसी नोड के लिए कोई चाइल्ड पॉइंटर मौजूद है, तो टेल पॉइंटर का उपयोग करके इसे वर्तमान लिंक्ड सूची के अंत में ले जाएं। फिर लिंक्ड सूची के प्रत्येक चाइल्ड नोड के लिए समान ट्रैवर्सल को पुनरावर्ती रूप से करें। नीचे दिया गया प्रोग्राम तर्क को बेहतर ढंग से विस्तृत करेगा।

उदाहरण

हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम

#include <bits/stdc++.h> using namespace std; #define SIZE(arr) (sizeof(arr)/sizeof(arr[0])) class Node{    public:    int data;    Node *next;    Node *child; }; Node *createList(int *arr, int n){    Node *head = NULL;    Node *p;    int i;    for (i = 0; i < n; ++i){       if (head == NULL)          head = p = new Node();       else{          p->next = new Node();          p = p->next;       }       p->data = arr[i];       p->next = p->child = NULL;    }    return head; } Node *createList(void){    int arr1[] = {1, 9, 8, 4, 6};    int arr2[] = {7, 3, 2};    int arr3[] = {5};    Node *head1 = createList(arr1, (sizeof(arr1)/sizeof(arr1[0])));    Node *head2 = createList(arr2, (sizeof(arr2)/sizeof(arr2[0])));    Node *head3 = createList(arr3, (sizeof(arr3)/sizeof(arr3[0])));    head1->child = head2;    head1->next->child = head3;    return head1; } void flattenLinkedList(Node *head){    if (head == NULL)    return;    Node *tmp;    Node *tail = head;    while (tail->next != NULL)    tail = tail->next;    Node *cur = head;    while (cur != tail){       if (cur->child){          tail->next = cur->child;          tmp = cur->child;          while (tmp->next)          tmp = tmp->next;          tail = tmp;       }       cur = cur->next;    } } int main(void){    Node *head = NULL;    head = createList();    flattenLinkedList(head);    cout<<"समतल लिंक्ड सूची है ";    while (head != NULL){       cout << head->data << " ";       head = head->next;    }    return 0; }

आउटपुट

समतल लिंक्ड सूची है 1 9 8 4 6 7 3 2 5

  1. C++ में लिंक्ड सूची को समतल करना C++ में लिंक्ड सूची को समतल करना

    इस समस्या में, हमें दो पॉइंटर नोड्स, राइट और डाउन से युक्त एक लिंक्ड सूची दी गई है। राइट नोड मुख्य लिंक्ड सूची पॉइंटर है। डाउन नोड उस नोड से शुरू होने वाली द्वितीयक लिंक्ड सूची के लिए है। सभी लिंक्ड सूचियाँ सॉर्टेड हैं। हमारा कार्य एक प्रोग्राम बनाना है जो लिंक्ड सूची को समतल करे और परिणामी सूची स

  1. C++ में बाइनरी ट्री को लिंक्ड लिस्ट में फ्लैट करना C++ में बाइनरी ट्री को लिंक्ड लिस्ट में फ्लैट करना

    मान लीजिए हमारे पास एक बाइनरी ट्री है। हमें इसे स्थानांतरित (in-place) करके लिंक्ड लिस्ट में बदलना है (दायाँ पॉइंटर अगले नोड को इंगित करे, बायाँ पॉइंटर null हो)। उदाहरण: ट्री [1,2,5,3,4] → फ्लैट लिस्ट: 1→2→3→4→5 (प्रीऑर्डर ट्रैवर्सल क्रम)। रिवर्स प्रीऑर्डर ट्रैवर्सल ग्लोबल prev = null रखें। रिकर

  1. - C++ प्रोग्राम: सर्कुलर सिंगली लिंक्ड लिस्ट कार्यान्वयन

    सर्कुलर सिंगली लिंक्ड लिस्ट अंतिम नोड पहले नोड (head) को इंगित करता है, जिससे एक वृत्त बनता है। केवल head संदर्भ से पूरी सूची एक्सेस की जा सकती है। C++ प्रोग्राम उदाहरण next; } while (ptr != head); } int main() { insert(3); insert(1); insert(7); insert(2); insert(9); c