KKK735 2021-12-23 21:35 采纳率: 75%
浏览 20

二叉树的根节点无法置空

问题遇到的现象和发生背景

想在构建完二叉树后调用deleall()函数将二叉树的所有结点删除包括根节点,再调用output()函数提示用户“名单为空,请先输入教师信息”,但是程序进入了if(T)语句并且无法继续运行,不是应该进入else语句吗?

问题相关代码,请勿粘贴截图

 #include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define N 100
//教师信息的结构体定义
typedef struct s
{
    int key;
    char name[20];
    char sex[3];
    int age;
    char address[50];
}ElemType;
//二叉树定义
typedef struct Node
{    ElemType data;
    struct Node *lchild;
    struct Node *rchild;
}BiTNode,*BiTree;
int n=0;//将要处理的教师人数
ElemType teacher[N];//存放教师信息
//保存二叉树函数
void save(BiTree T,    FILE *fp,int i) {
    if(T){
        save(T->lchild,fp,i);
        strcpy(teacher[i].address ,T->data .address );
        teacher[i].age =T->data .age ;
        teacher[i].key =T->data .key ;
        strcpy(teacher[i].name ,T->data .name) ;
        strcpy(teacher[i].sex,T->data .sex );
        i++;
        save(T->rchild,fp,i);
    }
    return ;
}
//保存函数
void Save(BiTree T){
      int i=0;
      FILE *fp=fopen("tea.dat","wb");
      fprintf(fp,"%d\n",n);
      save(T,fp,i);
      for (i=0;i<n;i++)
         fwrite(&teacher[i],sizeof(ElemType),1,fp);
      fclose(fp);
      printf("保存成功!\n");
}
//插入结点函数
void insert(BiTree &bst,ElemType teacher)
{
    BiTree p;
    if (bst==NULL)
    {
        p=(BiTree)malloc(sizeof(BiTNode));
        p->data =teacher;
        p->lchild=NULL;
        p->rchild=NULL;
        bst=p;
    }
    else 
        if (teacher.key <bst->data.key )
            insert(bst->lchild,teacher);
        else
            if (teacher.key>bst->data.key )
                insert(bst->rchild,teacher);
}
//信息录入函数
void creat(BiTree &bst)
{
      char chs;
      int i;
      FILE *fp;
      bst=NULL;
      printf("请选择A:键盘录入/B:文件录入:");
      getchar();
      scanf("%c",&chs);
      if(chs=='A'){
           fp=fopen("tea.dat","wb");
           printf("请输入将要处理的教师人数:");
           scanf("%d",&n);
           printf("请输入%d个教师信息:\n",n);
           for (i=0;i<n;i++)
           {
               printf("请输入第%d个教师工号:",i+1);
               scanf("%d",&teacher[i].key);
               getchar();
               printf("请输入第%d个教师的姓名:\n",i+1);
               gets(teacher[i].name);
               printf("请输入第%d个教师的性别(男或女):\n",i+1);
               gets(teacher[i].sex);
               printf("请输入第%d个教师的年龄:\n",i+1);
               scanf("%d",&teacher[i].age);
               getchar();
               printf("请输入第%d个教师的职称:\n",i+1);
               gets(teacher[i].address);
           }
           for (i=0;i<n;i++)
           {
               insert(bst,teacher[i]);        
           }
           fprintf(fp,"%d\n",n);
           for (i=0;i<n;i++)
           fwrite(&teacher[i],sizeof(ElemType),1,fp);
           fclose(fp);
      }
      else if(chs=='B'){
           int count;
           fp=fopen("tea.dat","rb");
           fscanf(fp,"%d\n",&count);
           n=count;
           for (i=0;i<count;i++)
           {
               fread(&teacher[i],sizeof(ElemType),1,fp);
               insert(bst,teacher[i]);
           }
      fclose(fp);
      }
}
//中序遍历函数
void Output(BiTree T) { 
    if(T){
        Output(T->lchild);
        printf("%-8d%-8s%-8s%-8d%-8s\n",T->data .key ,T->data .name ,T->data .sex ,T->data .age ,T->data .address );
        Output(T->rchild);
    }
    return ;
}
//信息输出函数
void output(BiTree T){
    if(n==0){          //如果没有录入信息
        printf("请先录入教师信息!");
    }
    else{
        if(T){
        printf("工号    姓名    性别    年龄    职称\n");
        Output(T);
        }
        else     printf("名单为空,请先输入教师信息!");    //如果二叉树为空
    }
}
//查找二叉树结点函数
BiTree search(BiTree bst,int key)
{
    if (bst==NULL)
       return NULL;
    else
        if (bst->data.key ==key)
             return bst;
        else
            if (key<bst->data.key )
               return search(bst->lchild,key);
            else
               return search(bst->rchild,key);
}
//修改二叉树结点信息函数
void revise(BiTree bst,int num){
        BiTree pd;
        pd=search(bst,num);
        if(!pd){
           printf("该教师不在名单中!");
        }
        else{
            char str1;
            do
            {
               printf("请选择要修改的教师信息:\n1.名字\n2.性别\n3.年龄\n4.职称\n5.保存修改\n6.退出修改\n");
               printf("根据选择输入1-6中的任一个数字:");
               scanf("%d",&str1);
               while (str1!=1&&str1!=2&&str1!=3&&str1!=4&&str1!=5&&str1!=6)
               {
                     printf("输入错误,请重新输入1-6中的任一个字符:");
                     scanf("%d",&str1);
               }
               switch (str1)
               {
                   case 1: 
                       {
                          char name[20];
                          getchar();
                          printf("请输入要修改的教师名字:");
                          gets(name);
                          strcpy(pd->data .name ,name);
                          break; 
                       }
                   case 2:        
                       {    
                          char sex[3];
                          getchar();
                          printf("请输入要修改的教师性别:");
                          gets(sex);
                          strcpy(pd->data .sex ,sex);
                          break;
                       }
                   case 3: 
                       {
                           int age=0;
                          printf("请输入要修改的教师年龄:");
                          scanf("%d",age);
                          pd->data.age=age;
                          break;
                       }
                   case 4: 
                       {
                          char address[50];
                            getchar();
                          printf("请输入要修改的教师职称:");
                          gets(address);
                          strcpy(pd->data .address ,address);
                          break;
                       }
                   case 5:
                       {    
                          Save(bst);
                          break;
                       }
               }
            } while(str1!=6);        
        }
}
//查询信息函数
void searchall(BiTree bst)
{
    if(n==0){
        printf("名单为空,请先录入名单!");
    }
    else{
        BiTree pd;
        int num;
        char chh;
        printf("\n请输入要查找的教师工号:");
        scanf("%d",&num);
        pd=search(bst,num);
        if(!pd)
        {
            printf("该教师不在名单中!");
        }
        else
        {
            printf("查找成功!\n是否打印该教师信息?Y:是/N:否:");
            getchar();
            scanf("%c",&chh);
            if(chh=='Y')
            {
                printf("工号    姓名    性别    年龄    职称\n");
                printf("%-8d%-8s%-8s%-8d%-8s\n",pd->data .key ,pd->data .name ,pd->data .sex ,pd->data .age ,pd->data .address );
            }
            else if(chh=='N')
            {
                printf("是否修改该教师除了工号之外的字段信息?Y:是/N:否:");
                getchar();
                scanf("%c",&chh);
                if(chh=='Y') {
                    revise(bst,num); }
            }
        }
    }
}
//信息修改函数
void modify(BiTree bst){
    if(n==0){
        printf("名单为空,请先录入名单!");
    }
    else{
        int num=0;
        printf("请输入要修改的教师工号:");
        scanf("%d",&num);
        revise(bst,num);
    }
}
//插入信息函数
void insertall(BiTree bst){
    if(n==0){
        printf("名单为空,请先录入名单!");
    }
    else{
        int num;
        char sh3;
        BiTree pd;
        printf("请输入要插入的教师工号:");
        scanf("%d",&num);
        pd=search(bst,num);
        if(!pd){
            ElemType tea;
            tea.key=num;
            getchar();
            printf("请输入教师的名字:");
            gets(tea.name);
            printf("请输入教师的性别:");
            gets(tea.sex);
            printf("请输入教师的年龄:");
            scanf("%d",&tea.age);
            getchar();
            printf("请输入教师的职称:");
            gets(tea.address);
            insert(bst,tea);
            printf("是否保存?Y:是/N:否:");
            scanf("%c",&sh3);
            if(sh3=='Y'){
               n++;
               Save(bst);
            }
        }
        else printf("该教师已在名单中!");
    }
}
//查找删除结点右子树中的最小结点函数
BiTree FindMin(BiTree t){
    if(t!=NULL){
        while(t->lchild !=NULL){
            t=t->lchild ;
        }
    }
    return t;
}
//删除最小结点函数
void DeleteMin(BiTree &t){
    if(t==NULL){
        printf("EMPTY TREE!");
        return ;
    }
    else if(t->lchild !=NULL){
        DeleteMin(t->lchild );
    }
    else if(t->lchild ==NULL){
        BiTNode *tmp=t;
        t=t->rchild ;
        delete tmp;
    }
}
//删除结点函数
void Delete(BiTree &t,int key){
    if(t==NULL){
        printf("教师信息不存在,无法删除!");
        return ;
    }
    if(key<t->data.key ) Delete(t->lchild,key);
    else if(key>t->data.key ) Delete(t->rchild,key);
    else if(t->lchild !=NULL&&t->rchild !=NULL ){        //删除左右子树不为空的(根)结点
        t->data =FindMin(t->rchild )->data ;       
        DeleteMin(t->rchild );
        printf("删除成功!\n");
        char sh1;
        printf("是否保存?Y:是/N:否:");
        getchar();
        scanf("%c",&sh1);
        if(sh1=='Y'){
           n--;
           Save(t);
        }
    }
    else {
        if(t->lchild ==NULL&&t->rchild ==NULL ){            //删除左右子树为空的(根)结点
            BiTNode *tmp=t;
               t=NULL;
            delete tmp;
            printf("删除成功!\n");
            char sh4;
            printf("是否保存?Y:是/N:否:");
            getchar();
            scanf("%c",&sh4);
            if(sh4=='Y'){
               n--;
               Save(t);
            }
        }
        else{
            BiTNode *tmp=t;      //删除左子树或右子树不为空的(根)结点
            t=(t->lchild !=NULL)?t->lchild :t->rchild ;
            printf("删除成功!\n");
            char sh2;
            printf("是否保存?Y:是/N:否:");
            getchar();
            scanf("%c",&sh2);
            if(sh2=='Y'){
               n--;
               Save(t);
            }

            delete tmp;
        }
    }
}
//删除教师信息函数
void deleall(BiTree bst){
    if(n==0){
        printf("名单为空,请先录入名单!");
    }
    else{
        int num;
        printf("请输入要删除的教师工号:");
        scanf("%d",&num);
        Delete(bst,num);
    }
}
int main()
{
    int str;
    BiTree bst;
    do
    {
        printf("\n");
        printf("**************************\n");
        printf("1:录入信息\n");
        printf("2:打印信息\n");
        printf("3:查找信息\n");
        printf("4:修改信息\n");
        printf("5:插入信息\n");
        printf("6:删除信息\n");
        printf("7:退出\n");
        printf("**************************\n");
        printf("根据菜单选择输入1-7中的任一个数字:"); 
        scanf("%d",&str);
        while (str!=1&&str!=2&&str!=3&&str!=4&&str!=5&&str!=6&&str!=7)
        {
            printf("输入错误,请重新输入1-7中的任一个字符:");
            scanf("%d",&str);
        }
        switch (str)
        {
        case 1: 
            {
                creat(bst);
                break; 
            }
        case 2:        
            {
                output(bst);
                break;
            }
        case 3: 
            {
                searchall(bst);
                break;
            }
        case 4: 
            {
                modify(bst);
                break;
            }
        case 5: 
            {
                insertall(bst);
                break;
            }
        case 6: 
            {
                deleall(bst);
                break;
            }
        }
    }while(str!=7);       
return 0;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-12-23 22:02
    关注

    你说的if(T)是哪一行呢?实在不知道怎么找

    评论

报告相同问题?

问题事件

  • 创建了问题 12月23日

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络