用C语言写采用树表示一个家谱关系,采用链表(孩子表示法)作为存储结构,实现家谱关系的相关运算。每个节点信息包含有:姓名、性别、配偶姓名、身份证号、年龄、出生日期等。 功能要求: 1)输入家族信息(要求自己设计文件存储格式,存放当前所有家族信息)2)输出家族信息(要求界面输出格式直观明了) 3)查找某人的所有儿子 )查找某人的双亲选做 输 每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 学生自己根据系统功能要求自己设计,但是要求家谱系统的相关数据要存储在数据文件中。
时间: 2023-12-10 20:42:10 浏览: 179
C语言实现一个家谱系统
3星 · 编辑精心推荐
下面是一个简单的家谱关系系统的C语言实现,采用了孩子表示法作为存储结构,数据存储在文件中。具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_ID_LEN 18
#define MAX_DATE_LEN 10
#define MAX_NUM 100
typedef struct _person {
char name[MAX_NAME_LEN]; // 姓名
char gender; // 性别(M/F)
char spouse_name[MAX_NAME_LEN]; // 配偶姓名
char id[MAX_ID_LEN]; // 身份证号
int age; // 年龄
char birth_date[MAX_DATE_LEN]; // 出生日期
struct _person *child; // 孩子节点
struct _person *sibling; // 兄弟节点
} Person;
// 家族树根节点
Person *root = NULL;
// 打印家族树
void print_tree(Person *p, int depth) {
if (!p) {
return;
}
int i;
for (i = 0; i < depth; i++) {
printf(" ");
}
printf("%s(%c) %d岁\n", p->name, p->gender, p->age);
print_tree(p->child, depth + 1);
print_tree(p->sibling, depth);
}
// 添加孩子节点
void add_child(Person *parent, Person *child) {
if (!parent->child) {
parent->child = child;
} else {
Person *p = parent->child;
while (p->sibling) {
p = p->sibling;
}
p->sibling = child;
}
}
// 加载家族信息
void load_data() {
FILE *fp = fopen("family.dat", "rb");
if (!fp) {
printf("无法读取家族数据文件!\n");
return;
}
Person p;
while (fread(&p, sizeof(Person), 1, fp)) {
if (!root) {
root = (Person *)malloc(sizeof(Person));
memcpy(root, &p, sizeof(Person));
} else {
Person *parent = root;
while (strcmp(parent->name, p.spouse_name) && strcmp(parent->name, p.name)) {
if (parent->sibling) {
parent = parent->sibling;
} else {
parent->sibling = (Person *)malloc(sizeof(Person));
parent = parent->sibling;
break;
}
}
if (!strcmp(parent->name, p.spouse_name)) {
add_child(parent, (Person *)malloc(sizeof(Person)));
memcpy(parent->child, &p, sizeof(Person));
} else {
memcpy(parent, &p, sizeof(Person));
}
}
}
fclose(fp);
}
// 保存家族信息
void save_data() {
FILE *fp = fopen("family.dat", "wb");
if (!fp) {
printf("无法保存家族数据文件!\n");
return;
}
Person *stack[MAX_NUM];
int top = -1;
stack[++top] = root;
while (top >= 0) {
Person *p = stack[top--];
fwrite(p, sizeof(Person), 1, fp);
if (p->sibling) {
stack[++top] = p->sibling;
}
if (p->child) {
stack[++top] = p->child;
}
}
fclose(fp);
}
// 添加家庭成员
void add_member() {
Person p;
printf("请输入姓名:");
scanf("%s", p.name);
printf("请输入性别(M/F):");
scanf(" %c", &p.gender);
printf("请输入配偶姓名:");
scanf("%s", p.spouse_name);
printf("请输入身份证号:");
scanf("%s", p.id);
printf("请输入年龄:");
scanf("%d", &p.age);
printf("请输入出生日期(YYYY-MM-DD):");
scanf("%s", p.birth_date);
if (!root) {
root = (Person *)malloc(sizeof(Person));
memcpy(root, &p, sizeof(Person));
} else {
Person *parent = root;
while (strcmp(parent->name, p.spouse_name) && strcmp(parent->name, p.name)) {
if (parent->sibling) {
parent = parent->sibling;
} else {
parent->sibling = (Person *)malloc(sizeof(Person));
parent = parent->sibling;
break;
}
}
if (!strcmp(parent->name, p.spouse_name)) {
add_child(parent, (Person *)malloc(sizeof(Person)));
memcpy(parent->child, &p, sizeof(Person));
} else {
memcpy(parent, &p, sizeof(Person));
}
}
save_data();
}
// 查找某人的孩子
void find_children() {
char name[MAX_NAME_LEN];
printf("请输入要查找的人的姓名:");
scanf("%s", name);
Person *p = root;
while (p && strcmp(p->name, name)) {
p = p->sibling;
}
if (p) {
printf("%s的孩子有:\n", name);
p = p->child;
while (p) {
printf("%s(%c) %d岁\n", p->name, p->gender, p->age);
p = p->sibling;
}
} else {
printf("未找到该人!\n");
}
}
// 查找某人的双亲
void find_parents() {
char name[MAX_NAME_LEN];
printf("请输入要查找的人的姓名:");
scanf("%s", name);
Person *p = root;
while (p && strcmp(p->name, name) && strcmp(p->spouse_name, name)) {
p = p->sibling;
}
if (p) {
if (!strcmp(p->name, name)) {
printf("%s的父母是:%s(%c)和%s(%c)\n", name, p->spouse_name, p->gender == 'M' ? 'F' : 'M', p->name, p->gender);
} else {
printf("%s的父母是:%s(%c)和%s(%c)\n", name, p->name, p->gender == 'M' ? 'F' : 'M', p->spouse_name, p->gender);
}
} else {
printf("未找到该人!\n");
}
}
// 主函数
int main() {
load_data();
while (1) {
printf("**********家族关系系统**********\n");
printf("1. 添加家庭成员\n");
printf("2. 输出家族信息\n");
printf("3. 查找某人的所有儿子\n");
printf("4. 查找某人的双亲\n");
printf("5. 退出程序\n");
printf("请输入选项:");
int opt;
scanf("%d", &opt);
switch (opt) {
case 1:
add_member();
break;
case 2:
print_tree(root, 0);
break;
case 3:
find_children();
break;
case 4:
find_parents();
break;
case 5:
save_data();
printf("谢谢使用家族关系系统!\n");
exit(0);
default:
printf("无效选项!\n");
}
}
return 0;
}
```
该程序将家族信息存储在名为"family.dat"的二进制文件中,使用时会先加载文件中的家族信息,用户可以选择添加家庭成员、输出家族信息、查找某人的孩子和查找某人的双亲等功能。每次操作完成后,程序会将更新后的家族信息保存到文件中。
阅读全文