Как обнаружить и предотвратить циклы в генеалогическом дереве на C++?
```html
ترجمة HTML
مرحباً بالجميع! أقوم بكتابة برنامج لبناء شجرة عائلة بلغة 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 (حلقة!)
عند محاولة الاجتياز التكراري للبحث عن الأجداد، يدخل البرنامج في حلقة لا نهائية.
```