用c语言实现家谱管理系统
时间: 2023-09-23 07:04:16 浏览: 617
好的,实现一个家谱管理系统的基本思路如下:
1. 定义一个结构体来表示家族成员,包含成员姓名、性别、出生日期、父亲节点、母亲节点等信息。父亲节点和母亲节点用指针表示。
2. 使用二叉树来组织家族成员的关系。每个节点表示一个家族成员,节点的左子树表示该成员的父亲,右子树表示该成员的母亲。
3. 实现基本的操作,如添加成员、删除成员、修改成员信息、查找成员等。对于添加成员操作,需要根据父母节点的信息创建一个新节点;对于删除成员操作,需要将该节点及其子节点从树中删除;对于修改成员信息操作,需要先查找到该成员,然后修改其信息;对于查找成员操作,可以通过遍历树来实现。
下面是一个简单的家谱管理系统的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 家族成员结构体
typedef struct _member {
char name[20]; // 成员姓名
char gender[4]; // 成员性别
char birth[20]; // 成员出生日期
struct _member *father; // 父亲节点
struct _member *mother; // 母亲节点
} Member;
// 创建一个新成员
Member *create_member(const char *name, const char *gender, const char *birth, Member *father, Member *mother) {
Member *member = (Member*) malloc(sizeof(Member));
strcpy(member->name, name);
strcpy(member->gender, gender);
strcpy(member->birth, birth);
member->father = father;
member->mother = mother;
return member;
}
// 添加一个新成员
void add_member(Member **root, const char *name, const char *gender, const char *birth, const char *father_name, const char *mother_name) {
// 查找父亲节点和母亲节点
Member *father = NULL;
Member *mother = NULL;
if (father_name != NULL) {
father = find_member(*root, father_name);
}
if (mother_name != NULL) {
mother = find_member(*root, mother_name);
}
// 创建新成员
Member *member = create_member(name, gender, birth, father, mother);
// 将新成员插入到树中
if (*root == NULL) {
*root = member;
} else {
insert_member(*root, member);
}
}
// 在树中插入一个新成员
void insert_member(Member *root, Member *member) {
if (strcmp(member->name, root->name) < 0) {
if (root->father == NULL) {
root->father = member;
} else {
insert_member(root->father, member);
}
} else {
if (root->mother == NULL) {
root->mother = member;
} else {
insert_member(root->mother, member);
}
}
}
// 查找成员
Member *find_member(Member *root, const char *name) {
if (root == NULL) {
return NULL;
}
if (strcmp(name, root->name) == 0) {
return root;
} else if (strcmp(name, root->name) < 0) {
return find_member(root->father, name);
} else {
return find_member(root->mother, name);
}
}
// 删除成员
void delete_member(Member **root, const char *name) {
Member *member = find_member(*root, name);
if (member == NULL) {
return;
}
// 如果是根节点,直接删除
if (*root == member) {
*root = NULL;
free(member);
return;
}
// 如果有子节点,不能删除
if (member->father != NULL || member->mother != NULL) {
return;
}
// 删除节点
if (member->father->father == member) {
member->father->father = NULL;
} else {
member->father->mother = NULL;
}
free(member);
}
// 修改成员信息
void modify_member(Member *root, const char *name, const char *gender, const char *birth) {
Member *member = find_member(root, name);
if (member == NULL) {
return;
}
strcpy(member->gender, gender);
strcpy(member->birth, birth);
}
// 遍历成员
void traverse_member(Member *root) {
if (root == NULL) {
return;
}
printf("Name: %s, Gender: %s, Birth: %s\n", root->name, root->gender, root->birth);
traverse_member(root->father);
traverse_member(root->mother);
}
int main() {
Member *root = NULL;
add_member(&root, "Tom", "Male", "1980-01-01", NULL, NULL);
add_member(&root, "Jack", "Male", "1982-03-05", "Tom", NULL);
add_member(&root, "Kate", "Female", "1985-06-08", NULL, NULL);
add_member(&root, "Lucy", "Female", "1990-09-12", "Jack", "Kate");
traverse_member(root);
delete_member(&root, "Jack");
modify_member(root, "Lucy", "Female", "1991-09-12");
traverse_member(root);
return 0;
}
```
以上代码仅为示例,实际的家谱管理系统可以根据需求进行修改和扩展。
阅读全文