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

基于姓氏对customers结构体实现冒泡排序失败,请求问题排查

你的冒泡排序代码问题分析与修复

先把你代码里的致命问题列出来:

  • 外层循环行末尾多了个0,这是语法错误,编译器直接报错,先删掉它。
  • 内层循环的遍历逻辑完全搞反:从数组首元素p_info开始就p_walker--会直接越界,且条件(p_walker-p_info) > current不符合冒泡排序的遍历规则。
  • 比较逻辑错误:拿当前遍历元素和数组首元素对比,而非冒泡排序要求的相邻元素比较。
  • 交换逻辑错误:仅交换指针变量本身,没有修改结构体数组里的实际元素,原数组根本不会被排序。

针对你的需求(按姓氏字典序升序排序),修正后的代码如下:

void sort_customers(struct customers *p_info, int num_customers) {
    struct customers temp; // 用结构体变量存临时数据,而非指针
    int current;
    int swapped; // 优化冒泡排序,提前退出无交换的循环

    for (current = 0; current < num_customers - 1; current++) {
        swapped = 0;
        // 内层循环遍历未排序的前半部分,每轮会把最大元素推到末尾
        for (struct customers *p_walker = p_info; p_walker < p_info + num_customers - 1 - current; p_walker++) {
            // 比较相邻元素的姓氏,前者字典序更大则交换
            if (strcmp(p_walker->last_name, (p_walker + 1)->last_name) > 0) {
                // 交换两个结构体的实际内容
                temp = *p_walker;
                *p_walker = *(p_walker + 1);
                *(p_walker + 1) = temp;
                swapped = 1;
            }
        }
        // 本轮无交换说明数组已完全有序,提前结束排序
        if (!swapped) {
            break;
        }
    }
    return;
}

关键修改说明:

  1. 移除了外层循环末尾的多余0,修复语法错误。
  2. 调整内层循环的遍历范围,每轮跳过已经排好序的末尾元素,提升效率。
  3. 改为比较相邻元素的姓氏,符合冒泡排序的核心逻辑。
  4. 交换结构体的实际内容(通过*p_walker访问元素),确保原数组被真正修改。
  5. 添加swapped标记优化排序过程,避免不必要的循环。

测试你的输入Jones, Smith, Allen,这个代码会输出预期的Allen, Jones, Smith。

内容的提问来源于stack exchange,提问作者big_brain-924

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:45:30