C语言结构体数组冒泡排序bug求助:学生信息排序异常
修复学生信息管理程序的排序Bug
你的排序函数出现的问题是:仅能对平均分完成排序,但所有学生的姓名、ID等信息会被第一个学生条目覆盖。
问题根源
原sort_student函数仅保存了当前学生的平均分,在插入排序的移动过程中,将前面学生的完整信息覆盖到后一位,最后却只把平均分恢复到目标位置,导致姓名、ID等信息丢失,最终所有条目被前面的学生信息逐步覆盖。
错误代码
void sort_student() { float selected_item; int j; for (int i = 0; i < students_count; i++) { selected_item = student[i].average; j = i - 1; while ((j >= 0) && (selected_item < student[j].average)) { student[j + 1].average = student[j].average; strcpy(student[j + 1].first_name, student[j].first_name); strcpy(student[j + 1].last_name, student[j].last_name); strcpy(student[j + 1].id, student[j].id); j--; } student[j + 1].average = selected_item; } printf("The students are sorted now."); }
修复后的代码
直接保存当前学生的完整结构体副本,移动时整体后移,最后将副本插入正确位置,既简洁又避免字段遗漏:
void sort_student() { struct school temp; int j; for (int i = 0; i < students_count; i++) { // 保存当前学生的完整信息 temp = student[i]; j = i - 1; // 找到插入位置,将比当前平均分高的学生后移 while ((j >= 0) && (temp.average < student[j].average)) { student[j + 1] = student[j]; j--; } // 将保存的学生信息插入正确位置 student[j + 1] = temp; } printf("The students are sorted now."); }
修复说明
- 用
struct school temp保存当前待插入学生的完整信息,而非仅平均分 - 移动操作直接将整个学生结构体赋值给后一位,替代逐个字段复制,减少出错概率
- 最后将完整的学生信息插入到找到的正确位置,保证所有字段都被正确排序
内容的提问来源于stack exchange,提问作者user16329042
相关产品推荐
相关产品推荐

