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<<"The flattened Linked List is ";
   while (head != NULL){
      cout << head->data << " ";
      head = head->next;
   }
   return 0;
}

आउटपुट

The flattened Linked List is 1 9 8 4 6 7 3 2 5

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

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

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

    मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें इसे जगह में लिंक्ड सूची में समतल करना होगा। तो अगर पेड़ जैसा है - आउटपुट ट्री होगा - इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - सेवा पिछला:=शून्य एक पुनरावर्ती फ़ंक्शन हल () को परिभाषित करें, जो इनपुट के रूप में रूट लेगा। यदि रूट

  1. सर्कुलर सिंगल लिंक्ड लिस्ट को लागू करने के लिए C++ प्रोग्राम

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