• 关于用switch函数实现二叉树的问题


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 2301_80971445 2024-05-29 14:07 采纳率: 0% 浏览 0 首页/ 编程语言 / 关于用switch函数实现二叉树的问题 c语言b树 #include#include#include#include#define maxsize 50typedef struct Node{ char data; struct Node *LChild; struct Node *RChild;}BiTNode,*BiTree;char *ch="ABD@@E@G@@CF@@@";int index=0;typedef struct{ BiTree elem[maxsize]; int front; int rear;}SeqQueue;void InitQueue(SeqQueue *Q){ Q->rear=Q->front=0;}int IsEmpty(SeqQueue *Q){ if(Q->rear==Q->front){ return (1); } else{ return (0); }}int EnterQueue(SeqQueue *Q,BiTree x){ if((Q->rear+1)%maxsize==Q->front){ return (0); } Q->elem[Q->rear]=x; Q->rear=(Q->rear+1)%maxsize; return (1);}int DeleteQueue(SeqQueue *Q,BiTree *a){ if(Q->rear!=Q->front){ *a=Q->elem[Q->front]; Q->front=(Q->front+1)%maxsize; return (1); } return (0);}void CreateBiTree(BiTree *bt){ if(strlen(ch)==0){ return ; } if(ch[index]=='@'){ bt=NULL; index++; } else{ *bt=(BiTree)malloc(sizeof(BiTNode)); (*bt)->data=ch[index]; index++; (*bt)->LChild=NULL; (*bt)->RChild=NULL; printf("left\n"); CreateBiTree(&(*bt)->LChild); printf("right\n"); CreateBiTree(&(*bt)->RChild); }}void PreOrder(BiTree root){ if(!root){ return; } printf("%c ",root->data); PreOrder(root->LChild); PreOrder(root->RChild);}void InOrder(BiTree root){ PreOrder(root->LChild); if(!root){ return; } printf("%c ",root->data); PreOrder(root->RChild);}void PostOrder(BiTree root){ PreOrder(root->LChild); PreOrder(root->RChild); if(!root){ return; } printf("%c ",root->data);}int main(){ char ch; int k; do{ printf("\n"); printf("1.CreateBiTree\n"); printf("2.PreOrderBiTree\n"); printf("3.InOrderBiTree\n"); printf("4.PostOrderBiTree\n"); printf("5.PrintBiTree\n"); printf("6.preorderleaf\n"); printf("7.PostTreeDepth\n"); printf("8.PrintLeaf\n"); printf("9.exit\n"); printf("===========================\n"); printf("choose(1,2,3,4,5,6,7,8,9)\n"); scanf("%d \n",&k); switch(k){ case 1: BiTree Tree; CreateBiTree(&Tree); case 2: PreOrder(Tree); case 3: InOrder(Tree); case 4: PostOrder(Tree); } printf("\n---------------------------\n"); }while(k>=1&&k<=9);} scanf输入后为何还需输入一个字符,又为啥直接运行了其他case的代码 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-29 14:07
      关注

      引自免费微信小程序:皆我百晓生

      首先,让我们解决代码中的警告和错误。

      1. ISO C++ forbids converting a string constant to 'char'* 这个警告是因为你在传递字符串常量给需要 char* 类型的函数时没有正确地转换。例如,在创建二叉树时,你应该使用 strdup() 函数复制字符串常量,然后释放内存。修改后的代码如下:
      char *input = strdup(ch);
      free(input);
      
      1. built-in function 'index' declared as non-function 这个警告是由于变量名与内置函数名冲突。将变量名更改为不与C++标准库中的任何函数名冲突的名字,比如 current_index

      接下来,我们来修复代码中的逻辑错误。在switch语句中,当用户选择创建二叉树(case 1)之后,你需要跳出当前的switch语句,否则会立即执行后续的预序遍历、中序遍历和后序遍历。这可以通过添加break语句来实现:

      switch(k){
          case 1:
              BiTree Tree;
              CreateBiTree(&Tree);
              break; // 添加这个break语句
          case 2:
              PreOrder(Tree);
          case 3:
              InOrder(Tree);
          case 4:
              PostOrder(Tree);
      }
      

      对于EnterQueue函数,存在一个语法错误,条件判断语句写法不正确。修正为:

      if((Q->rear + 1) % maxsize == Q->front){
          return(0);
      }
      

      现在,代码应该可以正常编译并运行,但是为了确保二叉树的正确构建,我们需要修复CreateBiTree函数。当前版本的函数在遇到第一个非 '@' 字符时就会停止处理,我们需要将其改为递归处理整个输入字符串。以下是修改后的CreateBiTree函数:

      void CreateBiTree(BiTree *bt){
          if(strlen(ch) == 0 || ch[index] == '\0'){
              return ;
          }
          if(ch[index] == '@'){
              *bt = NULL;
              index++;
          } else{
              *bt = (BiTree)malloc(sizeof(BiTNode));
              (*bt)->data = ch[index];
              index++;
              (*bt)->LChild = NULL;
              (*bt)->RChild = NULL;
              printf("left\n");
              CreateBiTree(&(*bt)->LChild);
              printf("right\n");
              CreateBiTree(&(*bt)->RChild);
          }
      }
      

      现在,当你运行程序并选择1来创建二叉树,程序将会根据给定的输入字符串构建二叉树,并且不会出现未定义的行为。注意,这个代码示例并没有包含所有选项的功能,如队列操作、打印等。如果你想要实现这些功能,你需要补充相应的函数和主函数中的调用。此外,记得在使用完动态分配的内存后释放它们,以防止内存泄漏。

      展开全部

      评论 编辑记录
    • 阿里嘎多学长 2024-05-29 14:07
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      根据您提供的代码和描述,问题主要出现在scanf的使用和switch语句的执行上。以下是针对您提出的问题的解答:

      问题1:scanf输入后为何还需输入一个字符

      在C语言中,scanf函数用于从标准输入(通常是键盘)读取格式化输入。当您使用scanf读取一个整数时,它只会读取整数部分,而任何跟随整数的非数字字符(比如空格、制表符或换行符)都不会被读取。

      如果scanf后面没有其他输入,那么可能是因为之前的输入操作(比如之前输入的换行符)留在了输入缓冲区中。为了解决这个问题,您可以在scanf之后添加一个清除输入缓冲区的操作,比如使用getchar()来读取并丢弃任何剩余的换行符。

      问题2:为什么直接运行了其他case的代码

      这个问题通常是由于switch语句中的case分支没有正确地使用break语句导致的。在C语言中,switch语句的每个case分支结尾如果没有break,程序会继续执行到下一个case,这就是所谓的“fall-through”。为了避免这种情况,每个case分支的末尾都应该有一个break语句来退出switch

      解决方案

      1. 清除输入缓冲区: 在scanf("%d", &k);后面添加getchar();来读取并丢弃任何剩余的换行符。

      2. 添加break语句: 确保switch语句中的每个case分支在执行完毕后都有break语句。

      修改后的main函数示例:

      int main() {
          char ch;
          int k;
          do {
              printf("\n");
              // ... 省略其他打印语句 ...
              printf("choose(1,2,3,4,5,6,7,8,9)\n");
              scanf("%d", &k);  // 读取整数
              getchar();        // 清除换行符
              printf("---------------------------\n");
              switch(k) {
                  case 1:
                      BiTree Tree;
                      CreateBiTree(&Tree);
                      break;  // 添加break
                  case 2:
                      PreOrder(Tree);
                      break;  // 添加break
                  case 3:
                      InOrder(Tree);
                      break;  // 添加break
                  case 4:
                      PostOrder(Tree);
                      break;  // 添加break
                  // ... 省略其他case ...
              }
          } while(k >= 1 && k <= 9);
          return 0;
      }
      

      参考资料

      请注意,由于我无法访问外部链接,上述链接仅供参考,您需要自行搜索相关内容。如果您需要进一步的帮助,请提供更多的信息或具体的错误描述。

      展开全部

      评论 编辑记录
    • 浪客 2024-05-29 14:14
      关注

      img

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    关于数据链路层(初步)
    入职前,没想到他们玩的这么花
    kCVPixelFormatType_32BGRA 格式的CMSampleBuffer sampebuffer 如何转化为 AVFrame
    [云] 大数据分析栈(Big Data Analytics Stack)+ Apache Hadoop分布式文件系统(HDFS)+Apache Spark
    SpringCloud学习(一)——微服务介绍
    汇编语言核心要点
    opencv图像卷积操作和常用的图像滤波函数
    MongoDB数据库
    Jetson TX2 NX安装遇到的问题汇总
    常见外贸英语缩写词
  • 原文地址:https://ask.csdn.net/questions/8111079