http://t.csdn.cn/NBo4I
(本人主页第一个问题)
修改链接中最佳回答代码有错,使其能在devc++中运行
参考GPT和自己的思路:此代码存在以下问题:
第 56 行 printf() 函数调用格式不正确,需要使用 %d 格式化字符串代替 %!s(MISSING)。
第 74 行 printMember() 函数缺少函数声明。
第 75 行 printMember() 函数调用时,第二个参数的类型应为 int,而不是 char。
第 99 行 printf() 函数调用格式不正确,需要使用 %s 格式化字符串代替 %!s(MISSING)。
第 131 行 printf() 函数调用格式不正确,需要使用 %s 格式化字符串代替 %!s(MISSING)。
第 150 行 printf() 函数调用格式不正确,需要使用 %s 格式化字符串代替 %!...。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 家庭成员结构体
typedef struct _Member {
char name[20];
char gender[5];
char birth[20];
char origin[20];
struct _Member *child; // 孩子节点
struct _Member *sibling; // 兄弟节点
} Member;
// 家庭族谱结构体
typedef Member* FamilyTree;
// 初始化家庭族谱
void initFamilyTree(FamilyTree* tree) {
*tree = NULL;
}
// 创建新的成员节点
Member *createMember(char *name, char *gender, char *birth, char *origin) {
Member *member = (Member *)malloc(sizeof(Member));
strcpy(member->name, name);
strcpy(member->gender, gender);
strcpy(member->birth, birth);
strcpy(member->origin, origin);
member->child = NULL;
member->sibling = NULL;
return member;
}
// 向家庭族谱中添加成员
void addMember(FamilyTree *tree, char *parentName, char *name, char *gender, char *birth, char *origin) {
Member *member = createMember(name, gender, birth, origin);
if (*tree == NULL) {
*tree = member; // 如果根节点为空,则添加到根节点
} else {
Member *parent = NULL;
Member *p = *tree;
while (p != NULL) {
if (strcmp(p->name, parentName) == 0) {
parent = p;
break;
}
p = p->sibling;
}
if (parent == NULL) {
printf("未找到父亲节点 %s,成员 %s 无法添加\n", parentName, name);
return;
}
if (parent->child == NULL) {
parent->child = member; // 如果父亲节点没有孩子,则添加到孩子节点
} else {
Member *q = parent->child;
while (q->sibling != NULL) {
q = q->sibling;
}
q->sibling = member; // 如果父亲节点有孩子,则添加到兄弟节点
}
}
printf("成员 %s 添加成功\n", name);
}
// 递归输出成员信息
void printMember(Member *member, int level) {
if (member != NULL) {
printf("%d %s|--%s(%s, %s, %s)\n", level * 4, "", member->name, member->gender, member->birth, member->origin);
printMember(member->child, level + 1);
printMember(member->sibling, level);
}
}
// 输出家庭族谱
void printFamilyTree(FamilyTree *tree) {
printf("家庭族谱信息如下:\n");
printMember(*tree, 0);
}
// 查询家庭族谱中的成员
Member *findMember(FamilyTree *tree, char *name) {
Member *p = *tree;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
return p;
}
Member *q = findMember(&p->child, name);
if (q != NULL) {
return q;
}
p = p->sibling;
}
return NULL;
}
// 删除节点
Member *deleteNode(Member *node) {
if (node->child == NULL) {
return node->sibling;
}
if (node->sibling == NULL) {
return node->child;
}
Member *p = node->child;
while (p->sibling != NULL) {
p = p->sibling;
}
p->sibling = node->sibling;
return node->child;
}
// 删除家庭族谱中的成员
void deleteMember(FamilyTree *tree, char *name) {
Member *p = *tree;
Member *parent = NULL;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
if (parent == NULL) {
*tree = deleteNode(p);
} else {
parent->child = deleteNode(p);
}
printf("成员 %s 删除成功\n", name);
return;
}
parent = p;
p = p->sibling;
}
printf("未找到成员 %s,无法删除\n", name);
}
// 修改家庭族谱中的成员信息
void modifyMember(FamilyTree *tree, char *name, char *gender, char *birth, char *origin) {
Member *member = findMember(tree, name);
if (member == NULL) {
printf("未找到成员 %s,无法修改\n", name);
return;
}
strcpy(member->gender, gender);
strcpy(member->birth, birth);
strcpy(member->origin, origin);
printf("成员 %s 修改成功\n", name);
}
// 递归保存成员信息到文件
void saveMember(FILE *fp, Member *member) {
while (member != NULL) {
fwrite(member, sizeof(Member), 1, fp);
saveMember(fp, member->child);
member = member->sibling;
}
}
// 保存家庭族谱信息到文件
void saveFamilyTree(FamilyTree *tree, char *filename) {
FILE *fp = fopen(filename, "wb");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
saveMember(fp, *tree);
fclose(fp);
printf("家庭族谱信息已保存到文件 %s 中\n", filename);
}
// 从文件中读取家庭族谱信息
void loadFamilyTree(FamilyTree *tree, char *filename) {
FILE *fp = fopen(filename, "rb");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
Member member;
while (fread(&member, sizeof(Member), 1, fp) == 1) {
addMember(tree, "", member.name, member.gender, member.birth, member.origin);
}
fclose(fp);
printf("家庭族谱信息已从文件 %s 中读取\n", filename);
}
// 显示菜单
void showMenu() {
printf("1. 家庭成员信息录入\n");
printf("2. 增加家庭成员信息\n");
printf("3. 家庭族谱信息浏览\n");
printf("4. 查询家庭族谱信息\n");
printf("5. 家庭族谱信息删除\n");
printf("6. 家庭族谱信息修改\n");
printf("7. 数据保存\n");
printf("8. 数据读取\n");
printf("0. 退出\n");
}
int main() {
FamilyTree familyTree;
initFamilyTree(&familyTree);
while (1) {
showMenu();
printf("请选择操作:");
int choice;
scanf("%d", &choice);
switch (choice) {
case 0:
printf("再见!\n");
return 0;
case 1: {
char name[20], gender[5], birth[20], origin[20];
printf("请输入成员姓名:");
scanf("%s", name);
printf("请输入成员性别:");
scanf("%s", gender);
printf("请输入成员出生年月日:");
scanf("%s", birth);
printf("请输入成员祖籍:");
scanf("%s", origin);
addMember(&familyTree, "", name, gender, birth, origin);
break;
}
case 2: {
char parentName[20], name[20], gender[5], birth[20], origin[20];
printf("请输入父亲节点的姓名:");
scanf("%s", parentName);
printf("请输入成员姓名:");
scanf("%s", name);
printf("请输入成员性别:");
scanf("%s", gender);
printf("请输入成员出生年月日:");
scanf("%s", birth);
printf("请输入成员祖籍:");
scanf("%s", origin);
addMember(&familyTree, parentName, name, gender, birth, origin);
break;
}
case 3:
printFamilyTree(&familyTree);
break;
case 4: {
char name[20];
printf("请输入要查询的成员姓名:");
scanf("%s", name);
Member *member = findMember(&familyTree, name);
if (member == NULL) {
printf("未找到成员 %s\n", name);
} else {
printf("成员 %s 信息如下:\n", name);
printf("姓名:%s,性别:%s,出生年月日:%s,祖籍:%s\n", member->name, member->gender, member->birth, member->origin);
}
break;
}
case 5: {
char name[20];
printf("请输入要删除的成员姓名:");
scanf("%s", name);
deleteMember(&familyTree, name);
break;
}
case 6: {
char name[20], gender[5], birth[20], origin[20];
printf("请输入要修改的成员姓名:");
scanf("%s", name);
printf("请输入成员性别:");
scanf("%s", gender);
printf("请输入成员出生年月日:");
scanf("%s", birth);
printf("请输入成员祖籍:");
scanf("%s", origin);
modifyMember(&familyTree, name, gender, birth, origin);
break;
}
case 7: {
char filename[20];
printf("请输入要保存的文件名:");
scanf("%s", filename);
saveFamilyTree(&familyTree, filename);
break;
}
case 8: {
char filename[20];
printf("请输入要读取的文件名:");
scanf("%s", filename);
loadFamilyTree(&familyTree, filename);
break;
}
default:
printf("无效操作!\n");
break;
}
}
return 0;
}
该回答引用GPTᴼᴾᴱᴺᴬᴵ
这是一个简单的家族谱管理程序,使用 C 语言编写。程序使用了结构体来表示家庭成员和家庭族谱,通过添加、删除、修改和查询操作来管理家庭族谱。下面是程序中定义的结构体和函数的简要说明:
结构体:
函数: