如何用c语言做家谱
时间: 2023-08-06 09:09:38 浏览: 171
在 C 语言中实现家谱管理系统,需要用到数据结构中的树。家谱可以看作一个树形结构,每个人作为树的一个节点,每个人可能有多个子节点(即孩子),也可能有一个父节点(即父亲)。以下是一个简单的家谱管理系统的实现思路:
1. 定义节点结构体
```c
struct node {
char name[20]; // 姓名
char sex; // 性别
int birthyear; // 出生年份
struct node *father; // 父亲
struct node *child[10]; // 子节点,最多有 10 个孩子
};
```
2. 创建家族树
可以手动输入每个人的信息,或者从文件中读取。由于每个人可能有多个孩子,所以需要一个数组来存储每个人的子节点。
```c
int main() {
struct node *root = NULL; // 家族树的根节点
// 创建根节点
root = (struct node *)malloc(sizeof(struct node));
strcpy(root->name, "张三");
root->sex = 'M';
root->birthyear = 1940;
root->father = NULL;
// 创建张三的子节点
root->child[0] = (struct node *)malloc(sizeof(struct node));
strcpy(root->child[0]->name, "李四");
root->child[0]->sex = 'M';
root->child[0]->birthyear = 1960;
root->child[0]->father = root;
root->child[1] = (struct node *)malloc(sizeof(struct node));
strcpy(root->child[1]->name, "王五");
root->child[1]->sex = 'F';
root->child[1]->birthyear = 1965;
root->child[1]->father = root;
root->child[2] = NULL;
// 创建李四的子节点
root->child[0]->child[0] = (struct node *)malloc(sizeof(struct node));
strcpy(root->child[0]->child[0]->name, "赵六");
root->child[0]->child[0]->sex = 'F';
root->child[0]->child[0]->birthyear = 1985;
root->child[0]->child[0]->father = root->child[0];
root->child[0]->child[1] = NULL;
// 创建王五的子节点
root->child[1]->child[0] = (struct node *)malloc(sizeof(struct node));
strcpy(root->child[1]->child[0]->name, "钱七");
root->child[1]->child[0]->sex = 'M';
root->child[1]->child[0]->birthyear = 1990;
root->child[1]->child[0]->father = root->child[1];
root->child[1]->child[1] = NULL;
return 0;
}
```
3. 搜索家族成员
可以根据姓名、性别、出生年份等信息搜索家族成员。可以使用递归算法来遍历整个家族树。
```c
// 根据姓名查找家族成员
struct node *search_by_name(struct node *root, char *name) {
if (root == NULL) {
return NULL;
}
if (strcmp(root->name, name) == 0) {
return root;
}
for (int i = 0; i < 10; i++) {
if (root->child[i] != NULL) {
struct node *result = search_by_name(root->child[i], name);
if (result != NULL) {
return result;
}
}
}
return NULL;
}
```
4. 修改家族成员信息
可以根据上面的搜索算法找到要修改的家族成员,然后修改其信息。
```c
// 修改家族成员信息
void modify_member_info(struct node *member, char *name, char sex, int birthyear) {
strcpy(member->name, name);
member->sex = sex;
member->birthyear = birthyear;
}
```
5. 删除家族成员
可以根据上面的搜索算法找到要删除的家族成员,然后将其从家族树中删除。
```c
// 删除家族成员
void delete_member(struct node *member) {
if (member->father != NULL) {
// 从父亲的子节点数组中删除该成员
for (int i = 0; i < 10; i++) {
if (member->father->child[i] == member) {
member->father->child[i] = NULL;
break;
}
}
}
// 递归删除该成员的所有子孙节点
for (int i = 0; i < 10; i++) {
if (member->child[i] != NULL) {
delete_member(member->child[i]);
}
}
free(member);
}
```
以上是一个简单的家谱管理系统的实现思路,具体实现需要根据需求来进行调整。
阅读全文