用c语言写一个家谱管理的代码
时间: 2024-03-07 13:50:38 浏览: 94
以下是一个简单的家谱管理系统的 C 语言代码示例,主要实现了家族成员的添加、删除、查找和显示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20 // 家族成员姓名最大长度
#define MAX_CHILDREN 10 // 每个家族成员最多的子女数目
/* 家族成员结构体 */
struct member {
char name[MAX_NAME_LEN]; // 姓名
int birth_year; // 出生年份
int death_year; // 死亡年份
struct member *parent; // 父亲指针
struct member *children[MAX_CHILDREN]; // 子女指针数组
int num_children; // 子女数目
};
/* 全局变量:家族树的根节点 */
struct member *root = NULL;
/* 函数声明 */
void add_member();
void delete_member();
void find_member();
void display_tree(struct member *p, int level);
/* 主函数 */
int main() {
int choice;
while (1) {
printf("\n请选择操作:\n");
printf("1. 添加家族成员\n");
printf("2. 删除家族成员\n");
printf("3. 查找家族成员\n");
printf("4. 显示家族树\n");
printf("5. 退出程序\n");
printf("请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
add_member();
break;
case 2:
delete_member();
break;
case 3:
find_member();
break;
case 4:
printf("\n家族树:\n");
display_tree(root, 0);
break;
case 5:
printf("程序已退出。\n");
return 0;
default:
printf("无效的操作编号,请重新输入。\n");
}
}
}
/* 添加家族成员 */
void add_member() {
struct member *p, *parent;
char name[MAX_NAME_LEN];
int birth_year;
printf("\n请输入新成员的姓名:");
scanf("%s", name);
printf("请输入新成员的出生年份:");
scanf("%d", &birth_year);
if (root == NULL) {
/* 如果家族树为空,新成员为根节点 */
root = (struct member*) malloc(sizeof(struct member));
strcpy(root->name, name);
root->birth_year = birth_year;
root->death_year = -1; // -1 表示未知
root->parent = NULL;
root->num_children = 0;
printf("已成功添加家族成员 %s。\n", name);
return;
}
printf("请指定新成员的父亲姓名:");
scanf("%s", name);
/* 查找父亲节点 */
p = root;
while (p != NULL && strcmp(p->name, name) != 0) {
p = p->children[p->num_children - 1];
}
if (p == NULL) {
printf("未找到父亲成员 %s,无法添加新成员。\n", name);
return;
}
/* 创建新成员节点 */
parent = p;
p = (struct member*) malloc(sizeof(struct member));
strcpy(p->name, name);
p->birth_year = birth_year;
p->death_year = -1; // -1 表示未知
p->parent = parent;
p->num_children = 0;
/* 将新成员节点添加到父亲节点的子女数组中 */
parent->children[parent->num_children] = p;
parent->num_children++;
printf("已成功添加家族成员 %s。\n", p->name);
}
/* 删除家族成员 */
void delete_member() {
char name[MAX_NAME_LEN];
struct member *p, *parent;
int i, j;
printf("\n请输入要删除的成员姓名:");
scanf("%s", name);
/* 查找要删除的成员节点 */
p = root;
while (p != NULL && strcmp(p->name, name) != 0) {
p = p->children[p->num_children - 1];
}
if (p == NULL) {
printf("未找到要删除的成员 %s。\n", name);
return;
}
/* 如果要删除的成员有子女,则无法删除 */
if (p->num_children > 0) {
printf("成员 %s 有子女,无法删除。\n", name);
return;
}
/* 从父亲节点的子女数组中删除此成员节点 */
parent = p->parent;
for (i = 0; i < parent->num_children; i++) {
if (parent->children[i] == p) {
for (j = i + 1; j < parent->num_children; j++) {
parent->children[j - 1] = parent->children[j];
}
parent->num_children--;
break;
}
}
/* 释放成员节点的内存 */
free(p);
printf("已成功删除家族成员 %s。\n", name);
}
/* 查找家族成员 */
void find_member() {
char name[MAX_NAME_LEN];
struct member *p;
printf("\n请输入要查找的成员姓名:");
scanf("%s", name);
/* 查找成员节点 */
p = root;
while (p != NULL && strcmp(p->name, name) != 0) {
p = p->children[p->num_children - 1];
}
if (p == NULL) {
printf("未找到成员 %s。\n", name);
} else {
printf("成员姓名:%s\n", p->name);
printf("出生年份:%d\n", p->birth_year);
printf("死亡年份:%d\n", p->death_year);
if (p->parent != NULL) {
printf("父亲姓名:%s\n", p->parent->name);
}
if (p->num_children > 0) {
printf("子女姓名:");
for (int i = 0; i < p->num_children; i++) {
printf("%s ", p->children[i]->name);
}
printf("\n");
}
}
}
/* 显示家族树 */
void display_tree(struct member *p, int level) {
int i;
/* 打印成员节点信息 */
for (i = 0; i < level; i++) {
printf(" ");
}
printf("%s\n", p->name);
/* 递归打印子女节点 */
for (i = 0; i < p->num_children; i++) {
display_tree(p->children[i], level + 1);
}
}
```
以上代码只是一个简单的示例,实际的家谱管理系统可能需要更复杂的功能和数据结构,例如支持多级家族树、多种查询方式、日期格式化等等。如果需要,可以根据实际需求进行修改和扩展。
阅读全文