用C语言写:采用树表示一个家谱关系,采用链表(孩子表示法)作为存储结构,实现家谱关系的相关运算。每个节点信息包含有:姓名、性别、配偶姓名、身份证号、年龄、出生日期等。 功能要求: 1)输入家族信息(要求自己设计文件存储格式,存放当前所有家族信息)2)输出家族信息(要求界面输出格式直观明了) 3)查找某人的所有儿子 4)查找某人的双亲 输出形式要有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构: 学生自己根据系统功能要求自己设计,但是要求家谱系统的相关数据要存储在数据文件中。

时间: 2024-02-19 16:00:20 浏览: 32
好的,以下是一个简单的实现。在这个实现中,我们使用了链表(孩子表示法)作为存储结构,同时利用了文件来存储家族信息。请注意,这个实现可能有一些限制,比如每个人只能有一个配偶,每个人的身份证号码必须唯一等等,您可以根据自己的需求进行修改。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 20 #define MAX_ID_LEN 20 typedef struct _Node { char name[MAX_NAME_LEN]; char sex; char spouse[MAX_NAME_LEN]; char id[MAX_ID_LEN]; int age; char birth[20]; struct _Node *child; struct _Node *sibling; } Node; void save(Node *root, FILE *fp) { if (root == NULL) { return; } fwrite(root, sizeof(Node), 1, fp); save(root->child, fp); save(root->sibling, fp); } Node *load(FILE *fp) { Node *root = NULL; Node *prev = NULL; Node *curr = NULL; while (!feof(fp)) { curr = (Node *) malloc(sizeof(Node)); if (fread(curr, sizeof(Node), 1, fp) != 1) { free(curr); break; } if (root == NULL) { root = curr; } else if (prev->child == NULL) { prev->child = curr; } else { prev->sibling = curr; } prev = curr; curr->child = NULL; curr->sibling = NULL; } return root; } void print_node(Node *node) { printf("Name: %s\n", node->name); printf("Sex: %c\n", node->sex); printf("Spouse: %s\n", node->spouse); printf("ID: %s\n", node->id); printf("Age: %d\n", node->age); printf("Birth: %s\n", node->birth); } void print_tree(Node *root, int level) { if (root == NULL) { return; } for (int i = 0; i < level; i++) { printf(" "); } print_node(root); print_tree(root->child, level + 1); print_tree(root->sibling, level); } Node *find_node(Node *root, char *name) { if (root == NULL) { return NULL; } if (strcmp(root->name, name) == 0) { return root; } Node *child = find_node(root->child, name); if (child != NULL) { return child; } return find_node(root->sibling, name); } void find_sons(Node *node) { if (node == NULL) { printf("Not found.\n"); return; } if (node->child == NULL) { printf("No sons.\n"); return; } printf("Sons: "); Node *p = node->child; while (p != NULL) { printf("%s ", p->name); p = p->sibling; } printf("\n"); } void find_parents(Node *root, Node *node) { if (root == NULL || node == NULL) { printf("Not found.\n"); return; } if (root->child == node) { printf("Father: %s\n", root->name); printf("Mother: %s\n", root->spouse); return; } find_parents(root->child, node); find_parents(root->sibling, node); } int main() { FILE *fp = fopen("family.dat", "rb"); Node *root = NULL; if (fp != NULL) { root = load(fp); fclose(fp); } int choice = -1; char name[MAX_NAME_LEN]; Node *node = NULL; while (choice != 0) { printf("1. Add family member\n"); printf("2. Print family tree\n"); printf("3. Find sons\n"); printf("4. Find parents\n"); printf("0. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: node = (Node *) malloc(sizeof(Node)); printf("Name: "); scanf("%s", node->name); printf("Sex (M/F): "); scanf(" %c", &node->sex); printf("Spouse: "); scanf("%s", node->spouse); printf("ID: "); scanf("%s", node->id); printf("Age: "); scanf("%d", &node->age); printf("Birth (YYYY-MM-DD): "); scanf("%s", node->birth); node->child = NULL; node->sibling = NULL; if (root == NULL) { root = node; } else { printf("Parent's name: "); scanf("%s", name); Node *parent = find_node(root, name); if (parent == NULL) { printf("Parent not found.\n"); free(node); break; } if (parent->child == NULL) { parent->child = node; } else { Node *p = parent->child; while (p->sibling != NULL) { p = p->sibling; } p->sibling = node; } } fp = fopen("family.dat", "wb"); save(root, fp); fclose(fp); break; case 2: print_tree(root, 0); break; case 3: printf("Name: "); scanf("%s", name); node = find_node(root, name); find_sons(node); break; case 4: printf("Name: "); scanf("%s", name); node = find_node(root, name); find_parents(root, node); break; case 0: break; default: printf("Invalid choice.\n"); break; } } return 0; } ``` 在这个实现中,我们定义了一个名为`Node`的结构体,其中包含了家族成员的各项信息,以及指向其子节点和兄弟节点的指针。我们使用了`save`和`load`函数来将家族信息存储到文件中,并从文件中加载家族信息。`print_node`和`print_tree`函数用于打印家族信息和家族树。`find_node`函数用于查找某个家族成员节点。`find_sons`和`find_parents`函数用于查找某个家族成员的儿子和父母。 在主函数中,我们设置了一个菜单,可以进行添加家族成员、打印家族树、查找儿子和查找父母等操作。我们使用了`find_node`函数来查找某个家族成员节点,然后根据需要调用`find_sons`和`find_parents`函数来查找其儿子和父母。每当我们添加或修改家族成员信息时,都会将其保存到文件中。

相关推荐

最新推荐

recommend-type

C语言:一元多项式加减法运算(链表 附答案).docx

C语言链表的入门题,里面提供了两种思路供参考,用链表来实现一元多项式的加减法,并按照一定规律输出。也是练习链表和排序算法的一道小实验,初学链表的小伙伴可以参考参考噢
recommend-type

C语言数据结构实现链表逆序并输出

主要介绍了C语言数据结构实现链表逆序并输出的相关资料,需要的朋友可以参考下
recommend-type

树的孩子链表法实现(c语言)

树的孩子链表法实现(c语言) #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #define M 100 typedef char Etype; //定义树结点值的类型字符型 typedef struct CSNode /*树结点结构*/ {Etype data; struct CSNode *...
recommend-type

vb仓库管理系统(可执行程序+源码+ 开题报告+ 答辩稿)【VB】.zip

vb仓库管理系统(可执行程序+源码+ 开题报告+ 答辩稿)【VB】
recommend-type

甘胺酸市场 - 全球产业规模、份额、趋势、机会和预测,按类型、应用、地区和竞争细分,2019-2029F.docx

甘胺酸市场 - 全球产业规模、份额、趋势、机会和预测,按类型、应用、地区和竞争细分,2019-2029F
recommend-type

中文翻译Introduction to Linear Algebra, 5th Edition 2.1节

中文翻译Introduction to Linear Algebra, 5th Edition 2.1节 线性代数的核心问题是求解方程组。这些方程都是线性的,即未知数仅与数相乘——我们绝不会 遇见 x 乘以 y。我们的第一个线性方程组较小。接下来你来看看它引申出多远: 两个方程 两个未知数 x − 2y = 1 3x + 2y = 11 (1) 我们一次从一个行开始。第一个方程 x − 2y = 1 得出了 xy 平面的一条直线。由于点 x = 1, y = 0 解 出该方程,因此它在这条直线上。因为 3 − 2 = 1,所以点 x = 3, y = 1 也在这条直线上。若我们选择 x = 101,那我们求出 y = 50。 这条特定直线的斜率是 12,是因为当 x 变化 2 时 y 增加 1。斜率在微积分中很重要,然而这是线 性代数! 图 2.1 将展示第一条直线 x − 2y = 1。此“行图”中的第二条直线来自第二个方程 3x + 2y = 11。你 不能错过两条线的交点 x = 3, y = 1。点 (3, 1) 位于两条线上并且解出两个方程。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

识别MATLAB微分方程求解中的混沌行为:分析非线性方程混沌行为的实用技巧

![matlab求解微分方程](https://img-blog.csdnimg.cn/2021062810300367.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTQ3OTY3OA==,size_16,color_FFFFFF,t_70) # 1. MATLAB微分方程求解概述 微分方程是描述物理、工程和金融等领域中动态系统的数学模型。MATLAB提供了强大的工具来求解微分方程,包括内置求解器和自定义函数
recommend-type

physon如何做ERP系统

作为一个AI语言模型,我可以给您提供一些基本的建议和思路: 1.明确需求和目标:在开始开发ERP系统之前,需要明确您的业务需求和目标,了解您的业务流程、流程数据、员工角色和权限、财务管理等方面的要求,这样才能更好的设计和开发ERP系统。 2.选择技术框架和开发工具:选择合适的技术框架和开发工具是ERP系统开发的关键。选择一种流行的技术框架和工具可以提高开发效率和质量。 3.设计数据库:ERP系统需要一个功能强大的数据库来存储数据。设计数据库需要考虑数据的完整性、安全性和可扩展性。 4.设计系统架构:系统架构是ERP系统的骨架,需要考虑系统的可扩展性、可维护性和性能。 5.开发和测试:
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。