C语言二叉堆程序出现重复提示、未输入报无效选择等错误求解
问题排查及修复方案
1. 重复打印菜单、未输入即提示invalid choice
该问题由输入缓冲区残留换行符导致:之前使用scanf("%d")读取数字时,仅会读取数字内容,输入完成按下回车产生的\n会残留在缓冲区中,后续执行scanf("%c",&choice)时会直接读取该换行符,无法匹配任何case就触发invalid choice,循环再次执行就出现了菜单重复打印的问题。
修复方法:将读取选择的代码改为在%c前加空格,自动跳过所有空白字符:
scanf(" %c",&choice);
2. 堆化函数逻辑错误
max函数中右节点大小判断的条件写错,错误使用了左节点的值进行比较,会导致堆结构调整错误:
// 错误代码 if (right < n && arr[left]>arr[mx_ind]){ mx_ind=right; }
修复为:
if (right < n && arr[right]>arr[mx_ind]){ mx_ind=right; }
3. 最大值获取逻辑错误
- case '1'和case '5'中调用函数时未加括号,实际传入的是函数地址而非返回值,会输出错误的数值
- case '5'的需求是返回最大值,不应该删除堆顶元素,错误调用了
extractmax函数
修复为:
case '1': printf("Max value is : %d\n", extractmax()); break; // 中间代码省略 case '5': printf("Max value is : %d\n", returnmax()); break;
4. 打印函数格式错误
display函数的换行写法不规范,元素间无分隔符可读性差,修复为:
void display(){ for (int i=0;i<n;i++){ printf("%d ",arr[i]); } printf("\n"); }
5. 退出逻辑不规范
case '6'中使用exit(1)属于异常退出返回值,正常退出改为exit(0)即可。
内容的提问来源于stack exchange,提问作者kishor420
相关产品推荐
相关产品推荐

