请你用c语言和数据结构完整代码实现家族关系查询系统,要求:建立家族关系并能存储到文件中。实现家族成员的添加。可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信,查找家族成员的祖先路径、确定成员是家族中的第几代。
时间: 2024-10-09 18:15:05 浏览: 30
在C语言中,我们可以使用链表数据结构来模拟家庭关系,并利用文件I/O操作来存储和读取信息。下面是一个简单的例子,使用struct表示家族成员,包含姓名、双亲ID、子节点列表以及辈分信息。
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct {
char name[50];
int parent_id; // 使用整数表示父母ID,可以扩展为结构体表示更复杂的关系
struct Node *children;
int generation; // 成员的辈分
} Member;
typedef struct Node {
Member member;
struct Node *next;
} Node;
// 文件操作函数,用于保存和加载家族成员
void save_to_file(Node *root, const char *filename) {
FILE *fp = fopen(filename, "w");
if (!fp) return;
Node *temp = root;
while (temp != NULL) {
fprintf(fp, "%s (%d,%d)\n", temp->member.name, temp->member.parent_id, temp->member.generation);
temp = temp->next;
}
fclose(fp);
}
Node* load_from_file(const char *filename) {
FILE *fp = fopen(filename, "r");
if (!fp) return NULL;
Node *root = NULL, *current = NULL;
char name[50], parent_id_str[50], *token;
while ((token = fgets(name, sizeof(name), fp))) {
sscanf(token, "%[^()]%s(%d,%d)", name, &parent_id_str, &temp_generation);
int parent_id = atoi(parent_id_str);
Member new_member = { .name = name, .parent_id = parent_id, .generation = temp_generation };
Node *new_node = malloc(sizeof(Node));
new_node->member = new_member;
new_node->next = NULL;
if (!root) root = current = new_node;
else {
while (current->next != NULL) current = current->next;
current->next = new_node;
}
}
fclose(fp);
return root;
}
// 添加新成员,假设输入合法
void add_family_member(Node **family_tree, const char *name, int parent_id, int generation) {
Member new_member = { .name = name, .parent_id = parent_id, .generation = generation };
Node *new_node = malloc(sizeof(Node));
new_node->member = new_member;
new_node->next = (*family_tree)->children;
(*family_tree)->children = new_node;
new_node->member.children = NULL;
}
// 查询相关的成员
Member* find_relationship(Node *root, int target_id, char *relationship) {
if (strcmp(relationship, "双亲") == 0) {
for (Node *node = root; node != NULL; node = node->next) {
if (node->member.id == target_id)
return node->member.parent;
}
} else if (strcmp(relationship, "兄弟") == 0) {
// 需遍历整个家族树寻找同父异母的兄弟,这里简化了示例,只返回直接兄弟
for (Node *node = root; node != NULL; node = node->next) {
if (node->member.parent_id == target_id && node->member.id != target_id)
return node->member;
}
} else if (/* 其他关系查询逻辑类似 */) {
// ... 详细实现其他关系如子孙、后代等
}
return NULL;
}
// 计算成员的祖先路径
void print_ancestor_path(Node *root, int target_id) {
Node *node = root;
while (node != NULL) {
printf("%s - ", node->member.name);
node = find_relationship(root, target_id, "父亲"); // 修改为目标成员的父亲
}
printf("NULL\n");
}
// 确定成员在家族中的位置(简化版本)
int position_in_family(Node *root, int target_id) {
int count = 0;
Node *node = root;
while (node != NULL) {
if (node->member.id == target_id) return ++count; // 如果找到,返回当前层级加一
node = node->next;
}
return -1; // 没有找到,返回-1
}
int main() {
Node *family_tree = load_from_file("family.txt"); // 假设已经存在一个文件存储家族树
// 示例操作
add_family_member(&family_tree, "张三", 100, 1); // 添加成员
print_ancestor_path(family_tree, 101); // 查找成员的祖先路径
printf("成员 %d 在家族中的位置:%d\n", 102, position_in_family(family_tree, 102));
save_to_file(family_tree, "family.txt"); // 保存更新后的家族树
return 0;
}
```
阅读全文