C++ में वंशावली वृक्ष में चक्रों का पता कैसे लगाएं और उन्हें कैसे रोकें?
सभी को नमस्कार! मैं C++ में वंशावली वृक्ष बनाने के लिए एक प्रोग्राम लिख रहा हूँ। मुझे एक गंभीर समस्या का सामना करना पड़ा: रिश्ते जोड़ते समय उपयोगकर्ता गलती से एक चक्र बना सकता है। उदाहरण के लिए, यह निर्दिष्ट करना कि दादा अपने ही पोते के पोते हैं। वृक्ष को ट्रैवर्स करने का प्रयास करने पर प्रोग्राम हैंग हो जाता है या segmentation fault के साथ क्रैश हो जाता है।
मेरी डेटा संरचना इस प्रकार है:
```cpp
struct Person {
string name;
vector parents;
vector children;
};
```
मैं "माता-पिता-बच्चा" संबंध लगभग इस प्रकार जोड़ता हूँ:
```cpp
void addParentChild(Person* parent, Person* child) {
parent->children.push_back(child);
child->parents.push_back(parent);
}
```
उपयोगकर्ता डेटा किसी भी क्रम में दर्ज करता है, और मैं गारंटी नहीं दे सकता कि कोई चक्र नहीं बनेगा। उदाहरण के लिए, कई ऑपरेशनों के बाद यह हो सकता है:
- A — B का माता-पिता
- B — C का माता-पिता
- C — A का माता-पिता (चक्र!)
पूर्वजों की खोज के लिए रिकर्सिव ट्रैवर्सल के प्रयास पर प्रोग्राम अनंत में चला जाता है।