C语言编写的家谱代码
根据给定的信息,本文将对"C语言编写的家谱代码"进行详细解析,重点解读代码结构、关键函数功能以及整体程序逻辑。 ### C语言编写的家谱代码 #### 概述 该段代码主要实现了一个基于C语言的家庭成员关系树(家谱)的构建与查询功能。它使用了结构体来定义节点信息,并通过递归的方式实现了家庭成员关系的存储与检索。下面将分别介绍代码中的数据结构、关键函数及主函数的工作原理。 #### 数据结构 在本程序中,定义了两种结构体类型:`node` 和 `ft`。 - **node** 结构体用于表示单个家庭成员的信息: - `char name`: 成员名字 - `char sex`: 成员性别 - `int age`: 成员年龄 - `int flag`: 标记位,用于指示该成员是否已经被设置 - **ft** 结构体则用于构建家谱树: - `struct node l`: 表示左子女节点 - `struct node m`: 表示右子女节点 - `struct ft *lchild`: 指向左子树的指针 - `struct ft *rchild`: 指向右子树的指针 这种设计使得每个家庭成员都可以有两个子节点,从而形成了一个二叉树结构。 #### 关键函数 - **search** 函数:该函数用于在树中查找指定的名字。 - 参数: - `ft *p`: 当前遍历到的节点指针 - `char ch`: 需要查找的名字 - 返回值: - 如果找到了对应的节点,则返回该节点的指针;否则返回 `NULL`。 - 实现方式: - 首先检查当前节点是否为空,如果为空则返回 `NULL`。 - 然后比较当前节点的左右成员的名字是否为所要查找的名字。 - 接着递归地在左右子树中进行查找。 - **done** 和 **done1** 函数:这两个函数用于初始化或更新节点的信息。 - 参数: - `ft *p`: 节点指针 - `char b`: 名字 - `char c`: 性别 - `int a`: 年龄 - 功能: - `done` 函数负责设置或更新节点的左成员信息。 - `done1` 函数负责设置或更新节点的右成员信息。 #### 主函数详解 - **初始化**: - 创建根节点,并读取输入信息初始化其信息。 - 根节点的左右子树均初始化为空。 - **循环处理用户命令**: - 用户可以输入不同的选项来进行操作: - `1`:添加新的家庭成员 - `2`:删除家庭成员 - 添加成员时: - 首先让用户输入待查找的名字。 - 使用 `search` 函数查找该成员。 - 如果找到,则让用户选择是添加左子女还是右子女。 - 如果添加左子女,则使用 `done1` 函数进行设置。 - 如果添加右子女,则先检查当前节点的右子树是否为空,若为空则创建一个新的节点并用 `done` 函数进行设置;否则继续向左子树深入查找直至找到空闲位置。 - 删除成员时: - 用户输入待删除成员的名字。 - 使用 `search` 函数查找该成员。 - 目前代码中只给出了查找的部分,删除部分尚未实现。 这段代码提供了一个基础框架,用于构建和管理一个简单的家谱系统。通过不断地添加成员及其关系,可以逐步构建出一个完整的家庭成员关系树。不过需要注意的是,该程序还有很多可以改进的地方,例如错误处理机制、界面友好性等。
#include "stdio.h"
#include "stdlib.h"
typedef struct node{
char name;
char sex;
int age;
int flag;
}node;
typedef struct ft{
struct node l;
struct node m;
struct ft *lchild;
struct ft *rchild;
}ft;
ft *search(ft *p,char ch)//输入头指针,姓名
{
ft *q;
if(p==NULL) return NULL;//没有家谱,头指针下为空
if(p->l.name==ch) return p;//家谱不为空,头指针下有这个人
if(p->m.name==ch) return p;//家谱不为空,头指针下有这个人
if(p->lchild)
{
q=search(p->lchild,ch);//在做孩子中找
if(q) return q;//找到
if(p->rchild)
{
q=search(p->rchild,ch);//在右孩子中找
if(q!=NULL) return q;
}
return NULL;//没有找到
}
void done(ft *p,char b,char c,int a)//建立家谱孩子结点
{
p->l.name=b;
p->l.sex=c;
p->l.age=a;
p->l.flag=1;//标志设置
}
void done1(ft *p,char b,char c,int a)//建立家谱配偶节点
{
p->m.name=b;
p->m.sex=c;
p->m.age=a;
p->m.flag=1;
}
void main()
{
ft *root,*n,*h,*t=NULL;
int i,j=1,a,flag=0;
char b,c,d;
剩余6页未读,继续阅读
- 粉丝: 14
- 资源: 59
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
前往页