C语言:采用树表示一个家谱关系,采用链表(孩子表示法)作为存储结构,实现家谱关系的相关运算。每个节点信息包含有:姓名、性别、配偶姓名、身份证号、年龄、出生日期等。 功能要求: 1)输入家族信息(要求自己设计文件存储格式,存放当前所有家族信息)2)输出家族信息(要求界面输出格式直观明了) 3)查找某人的所有儿子 4)查找某人的双亲 输出形式要有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构: 学生自己根据系统功能要求自己设计,但是要求家谱系统的相关数据要存储在数据文件中。
时间: 2024-01-24 16:20:14 浏览: 25
实现思路:
1. 定义节点结构体,包含姓名、性别、配偶姓名、身份证号、年龄、出生日期等信息,以及指向孩子节点的指针和指向兄弟节点的指针。
2. 定义家谱树结构体,包含根节点指针和当前节点指针。
3. 实现创建节点、添加孩子节点、添加兄弟节点等基本操作。
4. 实现从文件读取家族信息、保存家族信息到文件、输出家族信息等操作。
5. 实现查找某人的所有儿子、查找某人的双亲等功能。
代码如下:
相关问题
C语言:采用树表示一个家谱关系,采用链表(孩子表示法)作为存储结构,实现家谱关系的相关运算。每个节点信息包含有:姓名、性别、配偶姓名、身份证号、年龄、出生日期等。 功能要求: 1)输入家族信息(要求自己设计文件存储格式,存放当前所有家族信息)2)输出家族信息(要求界面输出格式直观明了) 3)查找某人的所有儿子 4)查找某人的双亲 输出形式要有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构: 学生自己根据系统功能要求自己设计,但是要求家谱系统的相关数据要存储在数据文件中。
好的,这是一个关于家谱关系的编程问题。您需要使用树来表示家谱关系,并采用链表(孩子表示法)作为存储结构。节点信息包含姓名、性别、配偶姓名、身份证号、年龄、出生日期等。您需要自己设计文件存储格式,并存放当前所有家族信息。
此外,您需要实现以下功能:
1. 输入家族信息,并将其存储在文件中。
2. 输出家族信息,要求输出格式直观明了。
3. 查找某人的所有儿子。
4. 查找某人的双亲。
您需要为每个功能设置菜单,并在输出形式中提供合理的提示。
用c语言写:采用树表示一个家谱关系 采用链表(孩子表示法)作为存储结构,实现家谱关系的相关运算。每个节点信息包含有:姓名、性别、配偶姓名、身份证号、年龄、出生日期等。 功能要求: 1)输入家族信息(要求自己设计文件存储格式,存放当前所有家族信息)2)输出家族信息(要求界面输出格式直观明了) 3)查找某人的所有儿子 4)查找某人的双亲
以下是一个简单的实现,包含了基本的功能要求。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 家谱节点信息
typedef struct _familyTreeNode {
char name[20]; // 姓名
char sex[6]; // 性别
char spouseName[20]; // 配偶姓名
char id[20]; // 身份证号
int age; // 年龄
char birthDate[20]; // 出生日期
struct _familyTreeNode *parent; // 父节点
struct _familyTreeNode *children; // 子节点链表
} FamilyTreeNode;
// 创建家谱节点
FamilyTreeNode *createFamilyTreeNode(char *name, char *sex, char *spouseName, char *id, int age, char *birthDate) {
FamilyTreeNode *node = (FamilyTreeNode*) malloc(sizeof(FamilyTreeNode));
strcpy(node->name, name);
strcpy(node->sex, sex);
strcpy(node->spouseName, spouseName);
strcpy(node->id, id);
node->age = age;
strcpy(node->birthDate, birthDate);
node->parent = NULL;
node->children = NULL;
return node;
}
// 添加子节点
void addChild(FamilyTreeNode *parent, FamilyTreeNode *child) {
child->parent = parent;
child->children = parent->children;
parent->children = child;
}
// 根据姓名查找节点
FamilyTreeNode *findNodeByName(FamilyTreeNode *root, char *name) {
if (strcmp(root->name, name) == 0) {
return root;
} else {
FamilyTreeNode *p = root->children;
while (p != NULL) {
FamilyTreeNode *q = findNodeByName(p, name);
if (q != NULL) {
return q;
}
p = p->children;
}
return NULL;
}
}
// 查找某人的所有儿子
void findSons(FamilyTreeNode *node) {
FamilyTreeNode *p = node->children;
while (p != NULL) {
if (strcmp(p->sex, "男") == 0) {
printf("%s\n", p->name);
}
p = p->children;
}
}
// 查找某人的双亲
void findParents(FamilyTreeNode *node) {
if (node->parent != NULL) {
printf("父亲:%s\n", node->parent->name);
}
if (strcmp(node->sex, "女") == 0 && strlen(node->spouseName) > 0) {
FamilyTreeNode *spouse = findNodeByName(node, node->spouseName);
if (spouse != NULL) {
printf("丈夫:%s\n", spouse->name);
}
}
}
int main() {
// 初始化家谱
FamilyTreeNode *root = createFamilyTreeNode("张三", "男", "", "000000000000000000", 60, "1960-01-01");
FamilyTreeNode *node1 = createFamilyTreeNode("李四", "男", "王五", "111111111111111111", 35, "1985-01-01");
FamilyTreeNode *node2 = createFamilyTreeNode("王五", "女", "李四", "222222222222222222", 32, "1988-01-01");
FamilyTreeNode *node3 = createFamilyTreeNode("赵六", "女", "", "333333333333333333", 28, "1992-01-01");
addChild(root, node1);
addChild(node1, node2);
addChild(node1, node3);
// 输出家族信息
printf("家族信息:\n");
printf("姓名\t性别\t配偶姓名\t身份证号\t\t年龄\t出生日期\n");
printf("----------------------------------------------------------\n");
printf("%s\t%s\t%s\t\t%s\t%d\t%s\n", root->name, root->sex, root->spouseName, root->id, root->age, root->birthDate);
FamilyTreeNode *p = root->children;
while (p != NULL) {
printf("%s\t%s\t%s\t\t%s\t%d\t%s\n", p->name, p->sex, p->spouseName, p->id, p->age, p->birthDate);
p = p->children;
}
// 查找某人的所有儿子
printf("\n请输入要查找儿子的人的姓名:");
char name[20];
scanf("%s", name);
FamilyTreeNode *node = findNodeByName(root, name);
if (node == NULL) {
printf("未找到该人!\n");
} else {
printf("所有儿子:\n");
findSons(node);
}
// 查找某人的双亲
printf("\n请输入要查找双亲的人的姓名:");
scanf("%s", name);
node = findNodeByName(root, name);
if (node == NULL) {
printf("未找到该人!\n");
} else {
printf("双亲:\n");
findParents(node);
}
return 0;
}
```
注意,这只是一个简单的实现,有很多方面可以进行优化和改进。例如,可以添加更多的家谱节点信息,支持更多的操作,增加错误处理等。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)