如何交换结构体数组元素?C语言动态结构体数组冒泡排序交换失效求助
问题根因
- 你的代码核心错误是
if(st[j].sum < st[j+1].sum);这行末尾多了一个多余的分号。 - C语言中单独的分号属于空语句,此处的分号会直接结束if判断的逻辑分支:当if条件成立时仅执行空语句,后续大括号包裹的交换逻辑完全不受if条件控制,每轮内层循环都会无条件交换相邻的两个结构体元素。
- 整套冒泡逻辑运行完后,数组会被完整反转,所以你看到的输出始终是输入顺序的倒序,和你要的总分降序排序逻辑完全无关。
修复方法
直接删除if判断末尾的分号即可,修改后的对应代码段如下:
for(i=0;i<(n-1);i++) { for(j=0;j<(n-i-1);j++) { // 删掉了末尾的分号,交换逻辑现在受if条件控制 if(st[j].sum < st[j+1].sum) { temp = st[j]; st[j] = st[j+1]; st[j+1] = temp; } } }
可选优化点(非必须,仅提升代码规范性)
void main不是C标准的主函数写法,建议改为int main(),函数末尾添加return 0;conio.h是Windows平台特有的非标准头文件,getch()也不属于标准库函数,如果需要跨平台兼容可以删除conio.h引用,把getch()替换为标准的getchar()- 读取字符串的
scanf参数&st[i].name写法不规范,name本身是字符数组名,自动退化为指针,不需要加取地址符&,直接写st[i].name即可
内容的提问来源于stack exchange,提问作者Surya Majumder
相关产品推荐
相关产品推荐

