用c语言写:采用树表示一个家谱关系 采用链表(孩子表示法)作为存储结构,实现家谱关系的相关运算。每个节点信息包含有:姓名、性别、配偶姓名、身份证号、年龄、出生日期等。 功能要求: 1)输入家族信息(要求自己设计文件存储格式,存放当前所有家族信息)2)输出家族信息(要求界面输出格式直观明了) 3)查找某人的所有儿子 4)查找某人的双亲
时间: 2023-11-22 07:55:33 浏览: 84
基于C语言实现的采用双亲表存储结构实现树的抽象数据类型【100013035】
以下是一个简单的实现,包含了基本的功能要求。
```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;
}
```
注意,这只是一个简单的实现,有很多方面可以进行优化和改进。例如,可以添加更多的家谱节点信息,支持更多的操作,增加错误处理等。
阅读全文