C语言代码:设计并实现一个简单的家谱管理系统。 基本要求: (1)建立家族关系并能存储到文件中。 (2)实现家族成员的添加、删除功能。 (3)可以查询家族成员的双亲、祖先、兄弟、 孩子和后代等信息。 (4)按某种顺序输出家谱信息(树的遍历操作)、以树型结构输出家谱资料等功能。
时间: 2023-12-23 14:02:43 浏览: 508
以下是一个简单的家谱管理系统的 C 语言代码,实现了基本要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
// 家族成员结构体
typedef struct Member {
char name[MAX_NAME_LEN];
struct Member* parent;
struct Member* leftSibling;
struct Member* rightSibling;
struct Member* firstChild;
struct Member* next;
} Member;
// 全局变量,表示家族树的根节点
Member* familyTreeRoot = NULL;
// 函数声明
void addMember(Member* parent);
void deleteMember(Member* member);
void printTree(Member* root, int level);
void saveToFile(Member* root, FILE* file);
void loadFromFile(FILE* file);
int main() {
int choice;
FILE* file;
char fileName[100];
while (1) {
// 显示菜单
printf("\n家谱管理系统\n");
printf("1. 添加成员\n");
printf("2. 删除成员\n");
printf("3. 查询成员信息\n");
printf("4. 输出家谱\n");
printf("5. 保存到文件\n");
printf("6. 从文件加载\n");
printf("7. 退出\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1: // 添加成员
addMember(familyTreeRoot);
break;
case 2: // 删除成员
deleteMember(familyTreeRoot);
break;
case 3: // 查询成员信息
// TODO: 实现查询成员信息功能
printf("该功能尚未实现,请选择其他操作。\n");
break;
case 4: // 输出家谱
printf("\n家谱如下:\n");
printTree(familyTreeRoot, 0);
break;
case 5: // 保存到文件
printf("请输入文件名(包括路径):");
scanf("%s", fileName);
file = fopen(fileName, "wb");
if (file == NULL) {
printf("文件打开失败!\n");
} else {
saveToFile(familyTreeRoot, file);
fclose(file);
printf("保存成功!\n");
}
break;
case 6: // 从文件加载
printf("请输入文件名(包括路径):");
scanf("%s", fileName);
file = fopen(fileName, "rb");
if (file == NULL) {
printf("文件打开失败!\n");
} else {
loadFromFile(file);
fclose(file);
printf("加载成功!\n");
}
break;
case 7: // 退出
printf("谢谢使用,再见!\n");
return 0;
default: // 输入错误
printf("输入错误,请重新选择操作。\n");
break;
}
}
}
// 添加成员
void addMember(Member* parent) {
char name[MAX_NAME_LEN];
Member* member;
// 输入成员姓名
printf("请输入成员姓名:");
scanf("%s", name);
// 创建成员
member = (Member*)malloc(sizeof(Member));
strcpy(member->name, name);
member->parent = parent;
member->leftSibling = NULL;
member->rightSibling = NULL;
member->firstChild = NULL;
member->next = NULL;
// 如果家族树为空,将该成员作为根节点
if (familyTreeRoot == NULL) {
familyTreeRoot = member;
} else {
// 将该成员添加到兄弟列表的末尾
if (parent->firstChild == NULL) {
parent->firstChild = member;
} else {
Member* sibling = parent->firstChild;
while (sibling->rightSibling != NULL) {
sibling = sibling->rightSibling;
}
sibling->rightSibling = member;
member->leftSibling = sibling;
}
}
printf("添加成功!\n");
}
// 删除成员
void deleteMember(Member* member) {
char name[MAX_NAME_LEN];
int confirm;
// 输入要删除的成员姓名
printf("请输入要删除的成员姓名:");
scanf("%s", name);
// 查找要删除的成员
while (member != NULL && strcmp(member->name, name) != 0) {
member = member->next;
}
// 如果找到了要删除的成员
if (member != NULL) {
// 提示确认
printf("确定要删除 %s 吗?(1-确定,0-取消):", name);
scanf("%d", &confirm);
if (confirm) {
// 如果要删除的成员有子孙,先删除子孙
Member* child = member->firstChild;
while (child != NULL) {
deleteMember(child);
child = member->firstChild;
}
// 从兄弟列表中删除该成员
if (member->leftSibling == NULL) {
member->parent->firstChild = member->rightSibling;
} else {
member->leftSibling->rightSibling = member->rightSibling;
}
if (member->rightSibling != NULL) {
member->rightSibling->leftSibling = member->leftSibling;
}
// 释放成员占用的内存
free(member);
printf("删除成功!\n");
} else {
printf("已取消删除操作。\n");
}
} else {
printf("未找到要删除的成员。\n");
}
}
// 输出家谱
void printTree(Member* root, int level) {
if (root == NULL) {
return;
}
// 输出该成员的信息
int i;
for (i = 0; i < level; i++) {
printf(" ");
}
printf("|--%s\n", root->name);
// 输出该成员的子孙信息
Member* child = root->firstChild;
while (child != NULL) {
printTree(child, level + 1);
child = child->rightSibling;
}
}
// 保存到文件
void saveToFile(Member* root, FILE* file) {
if (root == NULL) {
return;
}
// 写入该成员的信息
fwrite(root, sizeof(Member), 1, file);
// 递归写入该成员的子孙信息
Member* child = root->firstChild;
while (child != NULL) {
saveToFile(child, file);
child = child->rightSibling;
}
}
// 从文件加载
void loadFromFile(FILE* file) {
Member member;
int count = 0;
// 清空家族树
familyTreeRoot = NULL;
// 逐个读取成员信息,添加到家族树中
while (fread(&member, sizeof(Member), 1, file) == 1) {
Member* newMember = (Member*)malloc(sizeof(Member));
memcpy(newMember, &member, sizeof(Member));
newMember->next = NULL;
if (familyTreeRoot == NULL) {
familyTreeRoot = newMember;
} else {
newMember->leftSibling = familyTreeRoot;
familyTreeRoot->rightSibling = newMember;
familyTreeRoot = newMember;
}
count++;
}
printf("共加载 %d 个成员。\n", count);
}
```
注意:该代码只是一个简单的示例,仅实现了基本要求,还有很多需要完善和优化的地方,比如输入验证、错误处理、查询成员信息等。
阅读全文