关于#c的问题,如何解决?

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 语言编写。程序使用了结构体来表示家庭成员和家庭族谱,通过添加、删除、修改和查询操作来管理家庭族谱。下面是程序中定义的结构体和函数的简要说明:

结构体:

  • Member:表示家庭成员,包括姓名、性别、出生日期、籍贯以及指向孩子和兄弟节点的指针。
  • FamilyTree:表示家庭族谱,包括指向根节点的指针。

函数:

  • initFamilyTree:初始化家庭族谱。
  • createMember:创建新的家庭成员。
  • addMember:向家庭族谱中添加成员。
  • printFamilyTree:输出家庭族谱信息。
  • printMember:递归输出成员信息。
  • findMember:查询家庭族谱中的成员。
  • deleteMember:删除家庭族谱中的成员。
  • deleteNode:删除节点。
  • modifyMember:修改家庭族谱中的成员信息。