You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.");
}

修复说明

  1. 用struct school temp保存当前待插入学生的完整信息,而非仅平均分
  2. 移动操作直接将整个学生结构体赋值给后一位,替代逐个字段复制,减少出错概率
  3. 最后将完整的学生信息插入到找到的正确位置,保证所有字段都被正确排序

内容的提问来源于stack exchange,提问作者user16329042

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:15:07