用C语言采用树表示一个家谱关系,采用链表(孩子表示法)作为存储结构,实现家谱关系的相关运算。每个节点信息包含有:姓名、性别、配偶姓名、身份证号、年龄、出生日期等。 功能要求: 1)输入家族信息(要求自己设计文件存储格式,存放当前所有家族信息)2)输出家族信息(要求界面输出格式直观明了) 3)查找某人的所有儿子 4)查找某人的双亲选做功能: 1)查找某人的所有祖先 2)查找某人的所有兄弟界面要求: 输出形式要有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 储结构: 学生自己根据系统功能要求自己设计,但是要求家谱系 的相关数据要存储在数据文件中。
时间: 2023-11-22 08:55:56 浏览: 68
由于您需要实现一个家谱关系管理系统,我们可以考虑使用链表(孩子表示法)来存储家族关系。每个节点可以包含以下信息:
```
typedef struct Node {
char name[MAX_NAME_LENGTH]; //姓名
char gender[MAX_GENDER_LENGTH]; //性别
char spouse[MAX_NAME_LENGTH]; //配偶姓名
char id[MAX_ID_LENGTH]; //身份证号
int age; //年龄
char birthdate[MAX_BIRTHDATE_LENGTH]; //出生日期
struct Node *child; //指向第一个孩子节点
struct Node *sibling; //指向下一个兄弟节点
} Node;
```
其中,`MAX_NAME_LENGTH`、`MAX_GENDER_LENGTH`、`MAX_ID_LENGTH`和`MAX_BIRTHDATE_LENGTH`均为预定义的常量,用于存储相应字段的最大长度。
然后,我们可以按照以下步骤来实现家谱关系管理系统:
1. 设计并实现文件存储格式,将当前所有家族信息存储到文件中。可以考虑使用文本文件,每个节点的信息占用一行,不同字段之间使用逗号或者空格进行分隔。
2. 读取文件中的家族信息,并构建链表来存储家族关系。
3. 设计并实现菜单,根据用户的选择执行相应的功能。可以考虑使用`switch`语句来实现菜单功能。
4. 实现相应的功能函数,包括输出家族信息、查找某人的所有儿子、查找某人的双亲、查找某人的所有祖先、查找某人的所有兄弟等。
下面是一个可能的实现示例,仅供参考:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LENGTH 50
#define MAX_GENDER_LENGTH 10
#define MAX_ID_LENGTH 20
#define MAX_BIRTHDATE_LENGTH 20
typedef struct Node {
char name[MAX_NAME_LENGTH];
char gender[MAX_GENDER_LENGTH];
char spouse[MAX_NAME_LENGTH];
char id[MAX_ID_LENGTH];
int age;
char birthdate[MAX_BIRTHDATE_LENGTH];
struct Node *child;
struct Node *sibling;
} Node;
Node *root = NULL; //根节点指针
void load_data() {
FILE *fp = fopen("family.txt", "r");
if (fp == NULL) {
printf("无法打开文件!\n");
return;
}
char line[1024];
while (fgets(line, sizeof(line), fp) != NULL) {
Node *new_node = (Node *)malloc(sizeof(Node));
sscanf(line, "%[^,],%[^,],%[^,],%[^,],%d,%[^,\n]",
new_node->name, new_node->gender, new_node->spouse,
new_node->id, &new_node->age, new_node->birthdate);
new_node->child = NULL;
new_node->sibling = NULL;
if (root == NULL) {
root = new_node;
} else {
Node *parent = root;
while (parent != NULL) {
if (strcmp(parent->name, new_node->spouse) == 0) {
Node *sibling = parent->child;
if (sibling == NULL) {
parent->child = new_node;
} else {
while (sibling->sibling != NULL) {
sibling = sibling->sibling;
}
sibling->sibling = new_node;
}
break;
} else {
Node *sibling = parent->sibling;
if (sibling == NULL) {
printf("无法找到配偶:%s\n", new_node->spouse);
break;
}
parent = sibling->child;
}
}
}
}
fclose(fp);
}
void save_data() {
FILE *fp = fopen("family.txt", "w");
if (fp == NULL) {
printf("无法打开文件!\n");
return;
}
Node *parent = root;
while (parent != NULL) {
Node *child = parent->child;
while (child != NULL) {
fprintf(fp, "%s,%s,%s,%s,%d,%s\n",
child->name, child->gender, parent->name,
child->id, child->age, child->birthdate);
child = child->sibling;
}
parent = parent->sibling;
}
fclose(fp);
}
void print_node(Node *node, int depth) {
for (int i = 0; i < depth; i++) {
printf(" ");
}
printf("%s(%s)\n", node->name, node->gender);
}
void print_family(Node *node, int depth) {
print_node(node, depth);
Node *child = node->child;
while (child != NULL) {
print_family(child, depth + 1);
child = child->sibling;
}
}
void list_family() {
printf("家族信息如下:\n");
print_family(root, 0);
}
void list_children() {
char name[MAX_NAME_LENGTH];
printf("请输入要查找儿子的人的姓名:");
scanf("%s", name);
Node *node = root;
while (node != NULL) {
if (strcmp(node->name, name) == 0) {
Node *child = node->child;
if (child == NULL) {
printf("%s没有儿子!\n", name);
} else {
printf("%s的儿子有:\n", name);
while (child != NULL) {
printf("%s\n", child->name);
child = child->sibling;
}
}
return;
} else {
node = node->sibling;
}
}
printf("未找到姓名为%s的人!\n", name);
}
void list_parents() {
char name[MAX_NAME_LENGTH];
printf("请输入要查找双亲的人的姓名:");
scanf("%s", name);
Node *node = root;
while (node != NULL) {
Node *child = node->child;
while (child != NULL) {
if (strcmp(child->name, name) == 0) {
printf("%s的父亲是:%s\n", name, node->name);
printf("%s的母亲是:%s\n", name, node->spouse);
return;
} else {
child = child->sibling;
}
}
node = node->sibling;
}
printf("未找到姓名为%s的人!\n", name);
}
void list_ancestors() {
char name[MAX_NAME_LENGTH];
printf("请输入要查找祖先的人的姓名:");
scanf("%s", name);
Node *node = root;
while (node != NULL) {
Node *child = node->child;
while (child != NULL) {
if (strcmp(child->name, name) == 0) {
printf("%s的祖先有:\n", name);
while (node != NULL) {
print_node(node, 0);
node = root;
while (node != NULL && strcmp(node->name, name) != 0) {
node = node->sibling;
}
if (node != NULL) {
name = node->spouse;
}
}
return;
} else {
child = child->sibling;
}
}
node = node->sibling;
}
printf("未找到姓名为%s的人!\n", name);
}
void list_siblings() {
char name[MAX_NAME_LENGTH];
printf("请输入要查找兄弟的人的姓名:");
scanf("%s", name);
Node *node = root;
while (node != NULL) {
Node *child = node->child;
while (child != NULL) {
if (strcmp(child->name, name) == 0) {
Node *sibling = node->child;
if (sibling == NULL) {
printf("%s没有兄弟!\n", name);
} else {
printf("%s的兄弟有:\n", name);
while (sibling != NULL) {
if (strcmp(sibling->name, name) != 0) {
printf("%s\n", sibling->name);
}
sibling = sibling->sibling;
}
}
return;
} else {
child = child->sibling;
}
}
node = node->sibling;
}
printf("未找到姓名为%s的人!\n", name);
}
void menu() {
printf("=================================\n");
printf("1. 输出家族信息\n");
printf("2. 查找某人的所有儿子\n");
printf("3. 查找某人的双亲\n");
printf("4. 查找某人的所有祖先\n");
printf("5. 查找某人的所有兄弟\n");
printf("6. 退出程序\n");
printf("=================================\n");
}
int main() {
load_data();
while (1) {
menu();
int choice;
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
list_family();
break;
case 2:
list_children();
break;
case 3:
list_parents();
break;
case 4:
list_ancestors();
break;
case 5:
list_siblings();
break;
case 6:
save_data();
printf("感谢使用本程序!\n");
return 0;
default:
printf("无效的选择!\n");
break;
}
}
}
```
在这个示例中,我们使用了一个`load_data()`函数来读取家族信息文件并构建链表,使用了一个`save_data()`函数来将链表中的家族信息写入文件。我们还实现了一些功能函数,例如`list_family()`函数用于输出家族信息,`list_children()`函数用于查找某人的所有儿子,`list_parents()`函数用于查找某人的双亲等。在主函数中,我们使用一个`while`循环来提供菜单,并根据用户的选择执行相应的功能函数。
阅读全文