使用c++三叉链表建立家族关系查询系统
时间: 2023-12-24 09:03:42 浏览: 90
好的,我会尽力回答你的问题。
首先,三叉链表是一种特殊的链表结构,它除了存储节点的数据和指向下一个节点的指针外,还有一个指向该节点的父节点的指针和一个指向该节点的第一个子节点的指针。这种结构在家族关系中非常适用,因为每个人都有一个父亲和多个子女。
接下来,我们可以使用一个Person类来表示每个人,其中包含姓名、性别、出生日期等信息,以及指向父节点和子节点的指针。然后,我们可以使用一个三叉链表来存储所有的人,并用一个指向根节点的指针来表示整个家族。
为了方便查询,我们可以为每个Person对象添加一个ID属性,并使用一个哈希表来将ID与Person对象相互映射。这样,我们就可以根据ID快速找到对应的Person对象,进行家族关系的查询。
下面是部分C++代码示例:
```cpp
class Person {
public:
string name;
string gender;
string birthdate;
int id;
Person* parent;
Person* firstChild;
Person* nextSibling;
// 构造函数
Person(string name, string gender, string birthdate, int id):
name(name), gender(gender), birthdate(birthdate), id(id),
parent(nullptr), firstChild(nullptr), nextSibling(nullptr){}
};
class FamilyTree {
private:
Person* root;
unordered_map<int, Person*> idToPerson; // ID到Person对象的映射
public:
// 构造函数
FamilyTree(): root(nullptr){}
// 添加新成员
void addPerson(string name, string gender, string birthdate, int id, int parentId);
// 根据ID查询成员
Person* findPerson(int id);
// 查询某人的所有子女
vector<Person*> findChildren(int id);
// 查询某人的兄弟姐妹
vector<Person*> findSiblings(int id);
// 查询某人的父亲
Person* findFather(int id);
// 查询某人的母亲
Person* findMother(int id);
};
void FamilyTree::addPerson(string name, string gender, string birthdate, int id, int parentId) {
Person* person = new Person(name, gender, birthdate, id);
idToPerson[id] = person;
if(parentId == -1) { // 根节点
root = person;
} else {
Person* parent = idToPerson[parentId];
person->parent = parent;
if(parent->firstChild == nullptr) {
parent->firstChild = person;
} else {
Person* sibling = parent->firstChild;
while(sibling->nextSibling != nullptr) {
sibling = sibling->nextSibling;
}
sibling->nextSibling = person;
}
}
}
Person* FamilyTree::findPerson(int id) {
if(idToPerson.find(id) != idToPerson.end()) {
return idToPerson[id];
} else {
return nullptr;
}
}
vector<Person*> FamilyTree::findChildren(int id) {
vector<Person*> children;
Person* person = findPerson(id);
if(person != nullptr && person->firstChild != nullptr) {
Person* child = person->firstChild;
while(child != nullptr) {
children.push_back(child);
child = child->nextSibling;
}
}
return children;
}
vector<Person*> FamilyTree::findSiblings(int id) {
vector<Person*> siblings;
Person* person = findPerson(id);
if(person != nullptr && person->parent != nullptr && person->parent->firstChild != nullptr) {
Person* sibling = person->parent->firstChild;
while(sibling != nullptr) {
if(sibling->id != person->id) { // 排除自己
siblings.push_back(sibling);
}
sibling = sibling->nextSibling;
}
}
return siblings;
}
Person* FamilyTree::findFather(int id) {
Person* person = findPerson(id);
if(person != nullptr && person->parent != nullptr && person->parent->gender == "M") {
return person->parent;
} else {
return nullptr;
}
}
Person* FamilyTree::findMother(int id) {
Person* person = findPerson(id);
if(person != nullptr && person->parent != nullptr && person->parent->gender == "F") {
return person->parent;
} else {
return nullptr;
}
}
```
以上是一个简单的家族关系查询系统的实现,你可以根据自己的需求进行修改和扩展。
阅读全文