渴望变聪明的小笨蛋 2021-12-28 17:36 采纳率: 85.7%
浏览 26
已结题

载入函数有问题 请问该怎么修改啊

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include<conio.h> 
typedef char TElemType;
typedef int status;
typedef struct BiTPNode {
    TElemType data[10];
    struct BiTPNode* parent, * lchild, * rchild; //父亲及左右孩子指针
}BiTPNode, * BiPTree;
BiPTree P;
BiPTree T;

//家谱的创建
int Cre()
{
    system("cls");
    FILE* fp; //声明指向文件的指针
    char filename[40], str[10];
    printf("请输入家谱名称:");
    getchar();
    gets(filename); //输入家谱名称
    while (filename[0] == NULL)
    {
        printf("家谱名不能为空,请重新输入:");
        gets(filename);
    }
    if ((fp = fopen(filename, "w")) == NULL)
    {
        printf("%s家谱创建失败!\n", filename);
        return 0;
    }
    printf("请输入家谱内容:\n");
    while (strlen(gets(str)) > 0)
    {
        fputs(str, fp); //向文件写入字符串
        putc('\n', fp);
    }
    fclose(fp); //关闭文件
    printf("按任一键继续!");
    getchar();
    return 1;
}

status loc(BiPTree T, BiPTree* P, TElemType name[10]) {
    if (T)
    {
        P = T;
        //字符串的比较
        if (!strcmp(name, T->data)) return 1;
        if (loc(T->lchild, P, name)) return 1;
        if (loc(T->rchild, P, name)) return 1;
    }
    else
        return 0;
}

//构造二叉树
status inittree(BiPTree T)
{
    T = (BiTPNode*)malloc(sizeof(BiTPNode));
    if (T)
        return 0;
    T->lchild = NULL;
    T->rchild = NULL;
    T->parent = NULL;
    return 1;
}


//载入家谱
status Crt(BiPTree  T)
{
    FILE* fp;
    BiPTree Q, R, M, N;
    char filename[40], name[10];
    system("cls"); //清屏
    R = (BiTPNode*)malloc(sizeof(BiTPNode)); //分配存储空间
    M = (BiTPNode*)malloc(sizeof(BiTPNode));
    N = (BiTPNode*)malloc(sizeof(BiTPNode));
    printf("请输入家谱名:");
    getchar();


    gets(filename);
    while (filename[0] == NULL)
    {
        printf("家谱名不能为空,请重新输入:");
        gets(filename);
    }
    if ((fp = fopen("filename", "r")) == NULL)
    {
        printf("%s家谱打开失败!\n", filename);
        return 0;
    }

    inittree(T);
    fscanf(fp, "%s", name); //从文件读入姓名
    strcpy(T->data, name);
    T->lchild = NULL;
    T->rchild = NULL;
    T->parent = NULL;
    fclose(fp);
    if ((fp = fopen(filename, "r")) == NULL)
    {
        printf("%家谱打开失败!\n", filename);
        return 0;
    }
    fscanf(fp, "%s", name);
    while (!feof(fp))
    {
        if (loc(T, P, name))
        {
            fscanf(fp, "%s", name);
            Q = (BiTPNode*)malloc(sizeof(BiTPNode));
            strcpy(Q->data, name);
            P->lchild = Q; //构建孩子
            Q->parent = P;
            Q->lchild = NULL;
            Q->rchild = NULL;
            N = P;
        }
        else if (!loc(T, P, name))
        {
            Q = (BiTPNode*)malloc(sizeof(BiTPNode));
            R = N;
            R = R->lchild;
            while (R) {
                M = R;
                R = R->rchild;
            }
            strcpy(Q->data, name);
            M->rchild = Q;
            Q->parent = M;
            Q->lchild = NULL;
            Q->rchild = NULL;
        }
        fscanf(fp, "%s", name);
    }
    printf("信息载入成功,按任一键继续!");
    getchar();
    return 1;
}

//添加成员
status in(BiPTree* T)
{
    char father[10], name[10];
    BiPTree Q, M;
    system("cls");
    printf("请输入要添加到该家谱中的人的父亲姓名:");
    getchar();
    gets(father);
    while (!loc(T, P, father)) {
        printf("%s不在该家谱中!请重新输入:", father);
        gets(father);
    }
    printf("请输入要添加到该家谱中的人的姓名:");
    gets(name);
    Q = (BiTPNode*)malloc(sizeof(BiTPNode));
    M = (BiTPNode*)malloc(sizeof(BiTPNode));
    strcpy(Q->data, name);
    Q->lchild = NULL;
    Q->rchild = NULL;
    if (!P->lchild) {
        P->lchild = Q;
        Q->parent = P;
    }
    else {
        P = P->lchild;
        while (P) {
            M = P;
            P = P->rchild;
        }
        M->rchild = Q;
        Q->parent = M;
    }
    printf("成员添加成功,按任一键继续!");
    getchar();
    return 1;
}


//删除成员
status de(BiPTree* T)
{
    char name[10];
    system("cls");
    printf("请输入要删除的人的姓名:");
    getchar();
    gets(name);
    while (!loc(T, P, name)) {
        printf("%s不在该家谱中!请重新输入:", name);
        gets(name);
    }
    if (!P->rchild) {
        if (P->parent->lchild == P)
            P->parent->lchild = NULL;
        else
            P->parent->rchild = NULL;
        free(P);
    }
    else if (P->rchild) {
        if (P->parent->lchild == P)
            P->parent->lchild = P->rchild;
        else
            P->parent->rchild = P->rchild;
        free(P);
    }
    printf("成员删除成功,按任一键继续!");
    getchar();
    return 1;
}


status Show(TElemType e[10]) {
    printf("%s  ", e);
    return 1;
}


//二叉树的遍历
status pre(BiPTree T, status(*visit)(TElemType[10])) {
    if (T) {
        if ((*visit)(T->data))
            if (pre(T->lchild, visit))
                if (pre(T->rchild, visit)) return 1;
        return 0;
    }
    else return 1;
}


//家族成员查询
status Sea(BiPTree T) {
    char name[10];
    BiPTree N;
    N = (BiTPNode*)malloc(sizeof(BiTPNode));
    system("cls");
    printf("请输入要查寻的人的姓名:");
    getchar();
    gets(name);
    while (!loc(T, P, name)) {
        printf("%s不在该家谱中!请重新输入:", name);
        gets(name);
    }
    N = P;
    if (P == T)
        printf("%s的父亲在该家谱中没有记载!\n", P->data);
    else {
        while (N->parent->rchild == N)
            N = N->parent;
        printf("%s的父亲是:%s\n", P->data, N->parent->data);
    }
    N = P;
    if (P == T)
        printf("%s没有兄弟!\n", P->data);
    else if (!P->rchild && P->parent->rchild != P)
        printf("%s没有兄弟!\n", P->data);
    else {
        printf("%s的兄弟有:\n", name);
        while (N->rchild) {
            printf("%s ", N->rchild->data);
            N = N->rchild;
        }
        N = P;
        while (N->parent->rchild == N) {
            printf("%s ", N->parent->data);
            N = N->parent;
        }
        printf("\n");
    }
    if (P == T)
        printf("%s的祖先在该家谱中没有记载!\n", name);
    else
        printf("%s的祖先是:%s\n", name, T->data);
    N = P;
    if (!P->lchild) {
        printf("%s没有孩子!\n", name);
        printf("%s没有后代\n", name);
    }
    else {
        printf("%s的孩子有:\n", name);
        printf("%s ", P->lchild->data);
        N = N->lchild;
        while (N->rchild) {
            printf("%s ", N->rchild->data);
            N = N->rchild;
        }
        printf("\n");
        printf("%s的后代有:\n", name);
        pre(P->lchild, Show);
        printf("\n");
    }
    printf("按任一键继续!");
    getchar();
    return 1;
}

//文件的创建
status write(BiPTree T, char filename[40]) {
    FILE* fp;
    if ((fp = fopen(filename, "a+")) == NULL)
    {
        printf("%s文件创建失败!\n", filename);
        return 0;
    }
    fprintf(fp, "%s ", T->data);
    T = T->lchild;
    while (T) {
        fprintf(fp, "%s ", T->data);
        T = T->rchild;
    }
    fprintf(fp, "\n"); //输出
    fclose(fp);
    return 1;
}

status prewrite(BiPTree T, status(*visit)(BiPTree, char[40]), char filename[40]) {
    if (T) {
        if (T->lchild)
            (*visit)(T, filename);
        prewrite(T->lchild, visit, filename);
        prewrite(T->rchild, visit, filename);
        return 1;
    }
    else return 1;
}




status wrong()
{
    char a;
    scanf("%c", &a);
    printf("无此选项,请重新选择!(按任一键继续!)");
    getchar();
    return 1;
}


//家谱的存储
status Sav(BiPTree T) {
    FILE* fp;
    char filename[40];
    system("cls");
    printf("请输入新的文件名:");
    getchar();
    gets(filename);
    while (filename[0] == NULL)
    {
        printf("家谱名不能为空,请重新输入:");
        gets(filename);
    }
    prewrite(T, write, filename);
    printf("%s家谱保存成功,按任一键继续!", filename);
    getchar();
    return 1;
}

//修改家谱
status Upd() {
    system("cls");
    int xz;
    while (1)
    {
        system("cls");
        printf("\n\n\n\n");
        printf("   家族成员的添加与删除操作  \n");
        printf("      请选择           \n");
        printf("    1.添加成员.        \n");
        printf("    2.删除成员.        \n");
        printf("    3.返回上一级.      \n");
        printf("       请选择:");
        scanf("%d", &xz);
        switch (xz)
        {
        case 1: in(T); break;
        case 2: de(T); break;
        case 3: return 0;
        default:
            wrong();
            break;
        }
    }
}


 int main()
{
    P = (BiTPNode*)malloc(sizeof(BiTPNode));
    int xz;
    while (1)
    {
        system("cls");
        printf("\n\n\n\n");
        printf("     家族关系查询系统     \n");
        printf("     具体操作如下         \n");
        printf("     1.创建家谱.          \n");
        printf("     2.载入家谱.          \n");
        printf("     3.修改家谱.          \n");
        printf("     4.查寻成员.          \n");
        printf("     5.保存家谱.          \n");
        printf("     6.退出程序.          \n");
        printf("     请选择操作:");
        scanf("%d", &xz);
        switch (xz)
        {
        case 1:
            Cre();
            break;
        case 2:
            Crt(T);
            break;
        case 3:
            Upd();
            break;
        case 4:
            Sea(T);
            break;
        case 5:
            Sav(T);
            break;
        case 6:
            return 0;
        default:
            wrong();
            break;
        }
    }
}



  • 写回答

1条回答 默认 最新

  • 书山客 2021-12-28 19:07
    关注
    
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include<conio.h> 
    typedef char TElemType;
    typedef int status;
    typedef struct BiTPNode {
        TElemType data[10];
        struct BiTPNode* parent, * lchild, * rchild; //父亲及左右孩子指针
    }BiTPNode, * BiPTree;
    BiPTree P;
    BiPTree T;
    //家谱的创建
    int Cre()
    {
        system("cls");
        FILE* fp; //声明指向文件的指针
        char filename[40], str[10];
        printf("请输入家谱名称:");
        getchar();
        gets_s(filename); //输入家谱名称
        while (filename[0] == NULL)
        {
            printf("家谱名不能为空,请重新输入:");
            gets_s(filename);
        }
        if ((fp = fopen(filename, "w")) == NULL)
        {
            printf("%s家谱创建失败!\n", filename);
            return 0;
        }
        printf("请输入家谱内容:\n");
        while (strlen(gets_s(str)) > 0)
        {
            fputs(str, fp); //向文件写入字符串
            putc('\n', fp);
        }
        fclose(fp); //关闭文件
        printf("按任一键继续!");
        getchar();
        return 1;
    }
    status loc(BiPTree T, BiPTree P, TElemType name[10]) {
        if (T)
        {
            P = T;
            //字符串的比较
            if (!strcmp(name, T->data)) return 1;
            if (loc(T->lchild, P, name)) return 1;
            if (loc(T->rchild, P, name)) return 1;
        }
        else
            return 0;
    }
    //构造二叉树
    status inittree(BiPTree T)
    {
        T = (BiTPNode*)malloc(sizeof(BiTPNode));
        if (T)
            return 0;
        T->lchild = NULL;
        T->rchild = NULL;
        T->parent = NULL;
        return 1;
    }
    
    //载入家谱
    status Crt(BiPTree  T)
    {
        FILE* fp;
        BiPTree Q, R, M, N;
        char filename[40], name[10];
        system("cls"); //清屏
        R = (BiTPNode*)malloc(sizeof(BiTPNode)); //分配存储空间
        M = (BiTPNode*)malloc(sizeof(BiTPNode));
        N = (BiTPNode*)malloc(sizeof(BiTPNode));
        printf("请输入家谱名:");
        getchar();
    
        gets_s(filename);
        while (filename[0] == NULL)
        {
            printf("家谱名不能为空,请重新输入:");
            gets_s(filename);
        }
        if ((fp = fopen("filename", "r")) == NULL)
        {
            printf("%s家谱打开失败!\n", filename);
            return 0;
        }
        inittree(T);
        fscanf(fp, "%s", name); //从文件读入姓名
        strcpy(T->data, name);
        T->lchild = NULL;
        T->rchild = NULL;
        T->parent = NULL;
        fclose(fp);
        if ((fp = fopen(filename, "r")) == NULL)
        {
            printf("%家谱打开失败!\n", filename);
            return 0;
        }
        fscanf(fp, "%s", name);
        while (!feof(fp))
        {
            if (loc(T, P, name))
            {
                fscanf(fp, "%s", name);
                Q = (BiTPNode*)malloc(sizeof(BiTPNode));
                strcpy(Q->data, name);
                P->lchild = Q; //构建孩子
                Q->parent = P;
                Q->lchild = NULL;
                Q->rchild = NULL;
                N = P;
            }
            else if (!loc(T, P, name))
            {
                Q = (BiTPNode*)malloc(sizeof(BiTPNode));
                R = N;
                R = R->lchild;
                while (R) {
                    M = R;
                    R = R->rchild;
                }
                strcpy(Q->data, name);
                M->rchild = Q;
                Q->parent = M;
                Q->lchild = NULL;
                Q->rchild = NULL;
            }
            fscanf(fp, "%s", name);
        }
        printf("信息载入成功,按任一键继续!");
        getchar();
        return 1;
    }
    //添加成员
    status in(BiPTree T)
    {
        char father[10], name[10];
        BiPTree Q, M;
        system("cls");
        printf("请输入要添加到该家谱中的人的父亲姓名:");
        getchar();
        gets_s(father);
        while (!loc(T, P, father)) {
            printf("%s不在该家谱中!请重新输入:", father);
            gets_s(father);
        }
        printf("请输入要添加到该家谱中的人的姓名:");
        gets_s(name);
        Q = (BiTPNode*)malloc(sizeof(BiTPNode));
        M = (BiTPNode*)malloc(sizeof(BiTPNode));
        strcpy(Q->data, name);
        Q->lchild = NULL;
        Q->rchild = NULL;
        if (!P->lchild) {
            P->lchild = Q;
            Q->parent = P;
        }
        else {
            P = P->lchild;
            while (P) {
                M = P;
                P = P->rchild;
            }
            M->rchild = Q;
            Q->parent = M;
        }
        printf("成员添加成功,按任一键继续!");
        getchar();
        return 1;
    }
    
    //删除成员
    status de(BiPTree T)
    {
        char name[10];
        system("cls");
        printf("请输入要删除的人的姓名:");
        getchar();
        gets_s(name);
        while (!loc(T, P, name)) {
            printf("%s不在该家谱中!请重新输入:", name);
            gets_s(name);
        }
        if (!P->rchild) {
            if (P->parent->lchild == P)
                P->parent->lchild = NULL;
            else
                P->parent->rchild = NULL;
            free(P);
        }
        else if (P->rchild) {
            if (P->parent->lchild == P)
                P->parent->lchild = P->rchild;
            else
                P->parent->rchild = P->rchild;
            free(P);
        }
        printf("成员删除成功,按任一键继续!");
        getchar();
        return 1;
    }
    
    status Show(TElemType e[10]) {
        printf("%s  ", e);
        return 1;
    }
    
    //二叉树的遍历
    status pre(BiPTree T, status(*visit)(TElemType[10])) {
        if (T) {
            if ((*visit)(T->data))
                if (pre(T->lchild, visit))
                    if (pre(T->rchild, visit)) return 1;
            return 0;
        }
        else return 1;
    }
    
    //家族成员查询
    status Sea(BiPTree T) {
        char name[10];
        BiPTree N;
        N = (BiTPNode*)malloc(sizeof(BiTPNode));
        system("cls");
        printf("请输入要查寻的人的姓名:");
        getchar();
        gets_s(name);
        while (!loc(T, P, name)) {
            printf("%s不在该家谱中!请重新输入:", name);
            gets_s(name);
        }
        N = P;
        if (P == T)
            printf("%s的父亲在该家谱中没有记载!\n", P->data);
        else {
            while (N->parent->rchild == N)
                N = N->parent;
            printf("%s的父亲是:%s\n", P->data, N->parent->data);
        }
        N = P;
        if (P == T)
            printf("%s没有兄弟!\n", P->data);
        else if (!P->rchild && P->parent->rchild != P)
            printf("%s没有兄弟!\n", P->data);
        else {
            printf("%s的兄弟有:\n", name);
            while (N->rchild) {
                printf("%s ", N->rchild->data);
                N = N->rchild;
            }
            N = P;
            while (N->parent->rchild == N) {
                printf("%s ", N->parent->data);
                N = N->parent;
            }
            printf("\n");
        }
        if (P == T)
            printf("%s的祖先在该家谱中没有记载!\n", name);
        else
            printf("%s的祖先是:%s\n", name, T->data);
        N = P;
        if (!P->lchild) {
            printf("%s没有孩子!\n", name);
            printf("%s没有后代\n", name);
        }
        else {
            printf("%s的孩子有:\n", name);
            printf("%s ", P->lchild->data);
            N = N->lchild;
            while (N->rchild) {
                printf("%s ", N->rchild->data);
                N = N->rchild;
            }
            printf("\n");
            printf("%s的后代有:\n", name);
            pre(P->lchild, Show);
            printf("\n");
        }
        printf("按任一键继续!");
        getchar();
        return 1;
    }
    //文件的创建
    status write(BiPTree T, char filename[40]) {
        FILE* fp;
        if ((fp = fopen(filename, "a+")) == NULL)
        {
            printf("%s文件创建失败!\n", filename);
            return 0;
        }
        fprintf(fp, "%s ", T->data);
        T = T->lchild;
        while (T) {
            fprintf(fp, "%s ", T->data);
            T = T->rchild;
        }
        fprintf(fp, "\n"); //输出
        fclose(fp);
        return 1;
    }
    status prewrite(BiPTree T, status(*visit)(BiPTree, char[40]), char filename[40]) {
        if (T) {
            if (T->lchild)
                (*visit)(T, filename);
            prewrite(T->lchild, visit, filename);
            prewrite(T->rchild, visit, filename);
            return 1;
        }
        else return 1;
    }
    
    
    status wrong()
    {
        char a;
        scanf("%c", &a);
        printf("无此选项,请重新选择!(按任一键继续!)");
        getchar();
        return 1;
    }
    
    //家谱的存储
    status Sav(BiPTree T) {
        FILE* fp;
        char filename[40];
        system("cls");
        printf("请输入新的文件名:");
        getchar();
        gets_s(filename);
        while (filename[0] == NULL)
        {
            printf("家谱名不能为空,请重新输入:");
            gets_s(filename);
        }
        prewrite(T, write, filename);
        printf("%s家谱保存成功,按任一键继续!", filename);
        getchar();
        return 1;
    }
    //修改家谱
    status Upd() {
        system("cls");
        int xz;
        while (1)
        {
            system("cls");
            printf("\n\n\n\n");
            printf("   家族成员的添加与删除操作  \n");
            printf("      请选择           \n");
            printf("    1.添加成员.        \n");
            printf("    2.删除成员.        \n");
            printf("    3.返回上一级.      \n");
            printf("       请选择:");
            scanf("%d", &xz);
            switch (xz)
            {
            case 1: in(T); break;
            case 2: de(T); break;
            case 3: return 0;
            default:
                wrong();
                break;
            }
        }
    }
    
    int main()
    {
        P = (BiTPNode*)malloc(sizeof(BiTPNode));
        int xz;
        while (1)
        {
            system("cls");
            printf("\n\n\n\n");
            printf("     家族关系查询系统     \n");
            printf("     具体操作如下         \n");
            printf("     1.创建家谱.          \n");
            printf("     2.载入家谱.          \n");
            printf("     3.修改家谱.          \n");
            printf("     4.查寻成员.          \n");
            printf("     5.保存家谱.          \n");
            printf("     6.退出程序.          \n");
            printf("     请选择操作:");
            scanf("%d", &xz);
            switch (xz)
            {
            case 1:
                Cre();
                break;
            case 2:
                Crt(T);
                break;
            case 3:
                Upd();
                break;
            case 4:
                Sea(T);
                break;
            case 5:
                Sav(T);
                break;
            case 6:
                return 0;
            default:
                wrong();
                break;
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月5日
  • 已采纳回答 12月28日
  • 创建了问题 12月28日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)