用C语言:采用树表示一个家谱关系,采用链表(孩子表示法)作为存储结构,实现家谱关系的相关运算。每个节点信息包含有:姓名、性别、配偶姓名、身份证号、年龄、出生日期等。 功能要求: 1)输入家族信息(要求自己设计文件存储格式,存放当前所有家族信息)2)输出家族信息(要求界面输出格式直观明了) 3)查找某人的所有儿子 4)查找某人的双亲 输出形式要有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构: 学生自己根据系统功能要求自己设计,但是要求家谱系统的相关数据要存储在数据文件中。
时间: 2023-12-14 08:39:11 浏览: 101
以下是一个基于链表(孩子表示法)的家谱关系管理系统的 C 语言代码示例。实现了输入家族信息、输出家族信息、查找某人的所有儿子、查找某人的双亲等功能。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_ID_LEN 20
#define MAX_CHILDREN_NUM 5
// 家族成员结构体
typedef struct member {
char name[MAX_NAME_LEN]; // 姓名
char sex; // 性别,M 表示男性,F 表示女性
char spouse[MAX_NAME_LEN]; // 配偶姓名
char id[MAX_ID_LEN]; // 身份证号
int age; // 年龄
char birthdate[MAX_ID_LEN]; // 出生日期
struct member *children[MAX_CHILDREN_NUM]; // 孩子列表
} Member;
// 根据姓名查找家族成员
Member *find_member_by_name(Member *root, char *name) {
if (root == NULL) {
return NULL;
}
if (strcmp(root->name, name) == 0) {
return root;
}
for (int i = 0; i < MAX_CHILDREN_NUM; i++) {
Member *child = root->children[i];
if (child != NULL) {
Member *match = find_member_by_name(child, name);
if (match != NULL) {
return match;
}
}
}
return NULL;
}
// 添加家族成员
void add_member(Member *root) {
// 创建新成员
Member *new_member = (Member *)malloc(sizeof(Member));
printf("请输入新成员的信息(格式:姓名 性别 配偶姓名 身份证号 年龄 出生日期):\n");
scanf("%s %c %s %s %d %s", new_member->name, &new_member->sex, new_member->spouse, new_member->id, &new_member->age, new_member->birthdate);
for (int i = 0; i < MAX_CHILDREN_NUM; i++) {
new_member->children[i] = NULL;
}
// 查找父亲或母亲
char parent_name[MAX_NAME_LEN];
printf("请输入该成员的父亲或母亲姓名:\n");
scanf("%s", parent_name);
Member *parent = find_member_by_name(root, parent_name);
// 添加到父亲或母亲的孩子列表中
if (parent != NULL) {
for (int i = 0; i < MAX_CHILDREN_NUM; i++) {
if (parent->children[i] == NULL) {
parent->children[i] = new_member;
printf("已添加 %s 的孩子 %s\n", parent->name, new_member->name);
break;
}
}
} else {
printf("未找到 %s 的父亲或母亲\n", new_member->name);
}
}
// 输出家族成员信息
void print_member_info(Member *member) {
printf("姓名:%s\n", member->name);
printf("性别:%c\n", member->sex);
printf("配偶姓名:%s\n", member->spouse);
printf("身份证号:%s\n", member->id);
printf("年龄:%d\n", member->age);
printf("出生日期:%s\n", member->birthdate);
}
// 输出家族信息
void print_family_info(Member *root) {
if (root == NULL) {
return;
}
printf("家族成员:%s\n", root->name);
printf("孩子列表:");
int children_count = 0;
for (int i = 0; i < MAX_CHILDREN_NUM; i++) {
Member *child = root->children[i];
if (child != NULL) {
printf("%s ", child->name);
children_count++;
}
}
if (children_count == 0) {
printf("无");
}
printf("\n\n");
for (int i = 0; i < MAX_CHILDREN_NUM; i++) {
print_family_info(root->children[i]);
}
}
// 查找某人的所有儿子
void find_sons(Member *root, char *name) {
Member *member = find_member_by_name(root, name);
if (member == NULL) {
printf("未找到 %s\n", name);
return;
}
printf("%s 的儿子:", member->name);
int children_count = 0;
for (int i = 0; i < MAX_CHILDREN_NUM; i++) {
Member *child = member->children[i];
if (child != NULL && child->sex == 'M') {
printf("%s ", child->name);
children_count++;
}
}
if (children_count == 0) {
printf("无");
}
printf("\n");
}
// 查找某人的双亲
void find_parents(Member *root, char *name) {
Member *member = find_member_by_name(root, name);
if (member == NULL) {
printf("未找到 %s\n", name);
return;
}
printf("%s 的双亲:", member->name);
Member *parent = find_member_by_name(root, member->spouse);
if (parent != NULL) {
printf("%s ", parent->name);
}
for (int i = 0; i < MAX_CHILDREN_NUM; i++) {
Member *child = root->children[i];
if (child != NULL && strcmp(child->name, name) == 0) {
printf("%s ", child->spouse);
break;
}
}
printf("\n");
}
int main() {
// 从文件读取家族信息
FILE *fp = fopen("family.dat", "rb");
Member *root = NULL;
if (fp != NULL) {
root = (Member *)malloc(sizeof(Member));
fread(root, sizeof(Member), 1, fp);
fclose(fp);
} else {
printf("未找到家族数据文件,将创建新的家族记录\n");
root = (Member *)malloc(sizeof(Member));
strcpy(root->name, "祖先");
root->sex = 'M';
strcpy(root->spouse, "");
strcpy(root->id, "");
root->age = 0;
strcpy(root->birthdate, "");
for (int i = 0; i < MAX_CHILDREN_NUM; i++) {
root->children[i] = NULL;
}
}
// 主菜单
int option;
do {
printf("家谱关系管理系统\n");
printf("1. 添加家族成员\n");
printf("2. 输出家族信息\n");
printf("3. 查找某人的所有儿子\n");
printf("4. 查找某人的双亲\n");
printf("0. 退出程序\n");
printf("请选择操作:\n");
scanf("%d", &option);
switch (option) {
case 1:
add_member(root);
break;
case 2:
print_family_info(root);
break;
case 3:
printf("请输入要查找儿子的人的姓名:\n");
char name[MAX_NAME_LEN];
scanf("%s", name);
find_sons(root, name);
break;
case 4:
printf("请输入要查找双亲的人的姓名:\n");
scanf("%s", name);
find_parents(root, name);
break;
case 0:
printf("正在保存家族信息...\n");
fp = fopen("family.dat", "wb");
fwrite(root, sizeof(Member), 1, fp);
fclose(fp);
printf("已退出程序\n");
break;
default:
printf("无效的选项\n");
break;
}
} while (option != 0);
return 0;
}
```
阅读全文