2301_80971445 2024-05-29 14:07 采纳率: 0%
浏览 0

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

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#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);}

img

img

img

img

img

img


scanf输入后为何还需输入一个字符,又为啥直接运行了其他case的代码

  • 写回答

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

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月29日

悬赏问题

  • ¥15 Windows Script Host 无法找到脚本文件"C:\ProgramData\Player800\Cotrl.vbs”
  • ¥15 matlab自定义损失函数
  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图