> # ♻️ 资源
> **大小:** 8.21KB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010501**](https://www.yuque.com/sxbn/ks/100010501)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87400268**](https://download.csdn.net/download/s1t16/87400268)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 一、分析
## 1.1 项目简介
家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世袭繁衍和重要任务事迹的特殊图书体裁。家谱是中国特有的文化遗产,是中华民族的三大文献(国史,地志,族谱)之一,属于珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有其不可替代的独特功能。本项目兑对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息,插入家族成员,删除家族成员的功能。
## 1.2 功能要求
本项目的实质是完成兑家谱成员信息的建立,查找,插入,修改,删除等功能,可以首先定义家族成员数据结构,然后将每个功能作为一个成员函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得到运行结果。
# 二、设计
## 2.1 Node 类设计
Node 类是一个模板类,存储一个 T 类型的值和两个指针,分别是代表指向兄弟节点的 next 指针和指向自己子节点的 link 指针。
## 2.2 LinkedList 类设计
首先,LinkedList 依旧是模板类,它存储了两个成员变量,分别是代表家谱祖先的 root 节点,以及将来用于代表所操作的人物的 curFind。主要有六个 public 函数,分别是:
- add(T familyRoot) 传入的是祖先名字,创建家谱中第一个元素。
- void add(T familyName,T childName) 给家谱中的某个人添加子女。
- void deleteFromTree(T fatherName) 删除家谱中的某个人,连带子女一起从家谱中删除。
- void update(T fatherName,T updateName)更改家谱中某个人的姓名
- void show(T familyName)展示家谱中某个人的子女
- bool findFromTree(T familyName)找出在家谱中这个人是否存在
还有一个 private 函数:
```c
void findFromTree(Node<T> * x,T familyName) 从家谱中找到某个人,并将它存在curFind中,供其他函数使用
```
## 2.3 主程序设计
首先需要打印出提示信息,让用户知道如何建立家谱树。接着,首先让用户输入家谱中祖先的姓名并展示。之后让用户通过指令自由选择对家谱的操作,完成增删改查等对家谱的基本操作,并且操作完能妥善退出。
# 三、实现
## 3.1 Node 类实现
其实就是在以前的 Node 类基础上添加了一个指向自己子类的指针 link。
```c
template <class T> class Node
{
public:
T value;
Node<T> *next;
Node<T> *link;
Node(T value) : value(value), next(nullptr), link(nullptr) {}
};
```
## 3.2 LinkedList 类实现
### 3.2.1 findFromTree(Node * x,T familyName)
因为该私有函数是其他函数的基础,所以先说它的实现。
这是一个递归类型的函数,首先,其他函数调用它的时候,基本都会传入家谱的根节点 root 和要查找人的姓名 familyName。然后,该函数的终止条件有两个,一个是在家谱中找到了那个人,那么令 curFind 指向这个人,并且返回。另一个是整个家谱树中都找不到这个人,即直接返回。(因为每一次调用这个函数时 curFind 都重置为 nullptr,所以这个函数之后,如果没有找到,相当于就是 curFind 为 nullptr,所以之后有一些也可以用这个作为判断依据)。
而该函数的查找流程是,对于传入的 x,先查询它本身是否为这个人,然后再它所有子节点中递归查找,最后再在他之后的兄弟节点中递归查找。
```c
void findFromTree(Node<T> * x,T familyName)
{
if(x== nullptr)
{
return;
}
if(x->value==familyName)
{
curFind = x;
return;
}
findFromTree(x->link,familyName);
for (Node<T> * temp=x->next; temp!= nullptr; temp=temp->next)
{
findFromTree(temp,familyName);
}
}
```
### 3.2.2 add(T familyRoot)
该函数往家谱中添加第一个节点,即祖先。
```c
void add(T familyRoot)
{
root = new Node<T>(familyRoot);
}
```
### 3.2.3 add(T familyName,T childName)
先把 curFind 置为 nullptr,然后调用之前所说的 findFromTree 函数,把 curFind 节点指向 familyName 这个人。如果 curFind 为 nullptr,或者值为-1,(删除函数中会说明)说明查无此人,提示并返回。否则,往这人的 link 节点(即代表他的子女)后面插入一个名为 childName 的节点,代表他的孩子。(这里要分一下,如果本来 curFind 没子节点,就直接增加一个。如果本来有,则要走到 curFind 子节点的末尾,再在末尾加入该子女 childName)。
```c
void add(T familyName,T childName)
{
curFind = nullptr;//每次都要重新开始
findFromTree(root,familyName);//找到了父节点
if(curFind== nullptr || curFind->value=="-1")
{
return;
}
Node<T> *curChild = curFind->link;//父节点的子节点,不一定存在
if(curChild== nullptr)
{
curChild = new Node<T>(childName);
curFind->link = curChild;
}
else
{
//平行节点
Node<T> *x = curChild;
while(x->next!= nullptr)
{
x = x->next;
}
x->next = new Node<T>(childName);
}
}
```
### 3.2.4 deleteFromTree(T fatherName)
该函数作用是将给定人物和他子女都删除。
首先还是将 curFind 置为找到的那个人,如果没有找到就提示返回。然后将这个人的值置为“-1”(由于没有前驱指针,所以找不到该人的上一个兄弟,所以采用这种延时删除的操作,当查询或者是其他的,看到了“-1”,就代表了这个人不存在),代表该人已经被删除了。并且将指向他子女的节点置为 nullptr,并且将他的子女一一删除。
```c
void deleteFromTree(T fatherName)
{
curFind = nullptr;//每次都要重新开始
findFromTree(root,fatherName);
if(curFind== nullptr || curFind->value=="-1")
{
return;
}
curFind->value = "-1";//延时实现删除操作
Node<T> *x=curFind->link;
curFind->link = nullptr;//子代没了
}
```
### 3.2.5 update(T fatherName,T updateName)
该函数主要更新家谱中那个人的姓名。和前面的操作差不多,都是先查找到那个人,找不到就提示并且返回,找到就把找到那个人的名字改了。
```c
void update(T fatherName,T updateName)
{
curFind = nullptr;//每次都要重新开始
findFromTree(root,fatherName);
if(curFind== nullptr || curFind->value=="-1")
{
return;
}
Node<T> *cur = curFind;
cur->value = updateName;
}
```
### 3.2.6 show(T familyName)
同样是先找到那个人,找不到就提示并且返回,然后对他的所有子女节点进行遍历,如果他的子女节点值不是-1 的话,就打印他的值,这样之前所说的延时删除才有了意义。
同时,用一个变量 N 记录子女的个数,如果子女个数为 0,就打印一条提示信息 null,代表该节点没有子女,以免用户在操作时产生困惑。
```c
void show(T familyName)
{
int N = 0;//子女个数,为了在为空的时候输出一条信�
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++实现(控制台)家谱管理系统【100010501】
共6个文件
h:2个
txt:1个
cpp:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 11 浏览量
2023-01-28
10:17:37
上传
评论 2
收藏 10KB ZIP 举报
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010501 本项目的实质是完成兑家谱成员信息的建立,查找,插入,修改,删除等功能,可以首先定义家族成员数据结构,然后将每个功能作为一个成员函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得到运行结果。
资源推荐
资源详情
资源评论
收起资源包目录
100010501-基于C++实现(控制台)家谱管理系统.zip (6个子文件)
genogram
LICENSE 1KB
genogram
input.txt 190B
LinkedList.h 3KB
Node.h 214B
Test.cpp 4KB
README.md 17KB
共 6 条
- 1
资源评论
- xl_obsever2023-07-06这个资源值得下载,资源内容详细全面,与描述一致,受益匪浅。
- 玛卡巴卡小饼干2023-05-03非常有用的资源,有一定的参考价值,受益匪浅,值得下载。
- 玉面小飞龙l2023-06-26资源内容总结的很到位,内容详实,很受用,学到了~
神仙别闹
- 粉丝: 2669
- 资源: 7640
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功