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

如何使用Bubble Sort对汽车结构体按车牌字母顺序排序

解决你的C语言结构体冒泡排序问题

我仔细看了你的代码,发现冒泡排序逻辑和输出环节存在几个关键问题,导致排序没效果还出现重复输出的情况。咱们一步步来修正:

问题分析

  • 输出循环的索引错误:不管是未排序还是排序后的输出,你都用了固定值q=0来访问数组元素,而不是循环变量x。这就导致每次循环都只输出car[0]的内容,根本没遍历整个数组。
  • 冒泡排序的索引误用:排序逻辑里一直用q(始终为0)来比较元素,而不是内层循环的i变量。这样完全没有遍历数组进行相邻元素的比较交换,排序自然不起作用。
  • 临时变量类型错误:你把temp定义成了结构体数组struct carro temp[5];,但交换单个结构体元素只需要一个单个结构体变量,数组类型会导致赋值错误。
  • 冒泡排序的循环边界优化:标准冒泡排序的内层循环应该是i < 5 - j - 1,因为每一轮排序后,最后j个元素已经是有序的,不需要重复比较,这样能提升效率。

修正后的完整代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct carro {
    char placa[50];
    char marca[50];
    char modelo[50];
    char ano[50];
    char valordiaria[50];
};

int main() {
    struct carro car[5];
    // 改为单个结构体变量,用于交换临时存储
    struct carro temp;
    
    // 初始化数据
    strcpy(car[0].placa, "IZA-2929");
    strcpy(car[1].placa, "HJZ-1234");
    strcpy(car[2].placa, "XCV-3478");
    strcpy(car[3].placa, "BSD-8329");
    strcpy(car[4].placa, "AHG-8332");
    
    strcpy(car[0].marca, "Chevrolet");
    strcpy(car[1].marca, "Volkswagen");
    strcpy(car[2].marca, "Ferrari");
    strcpy(car[3].marca, "Nissan");
    strcpy(car[4].marca, "Ford");
    
    strcpy(car[0].modelo, "Onix");
    strcpy(car[1].modelo, "Golf");
    strcpy(car[2].modelo, "Enzo");
    strcpy(car[3].modelo, "GTR");
    strcpy(car[4].modelo, "Ka");
    
    strcpy(car[0].ano, "2013");
    strcpy(car[1].ano, "2008");
    strcpy(car[2].ano, "2004");
    strcpy(car[3].ano, "2017");
    strcpy(car[4].ano, "2015");
    
    strcpy(car[0].valordiaria, "45");
    strcpy(car[1].valordiaria, "60");
    strcpy(car[2].valordiaria, "80");
    strcpy(car[3].valordiaria, "200");
    strcpy(car[4].valordiaria, "65");

    // 展示未排序的结构体
    printf("=== 未排序的汽车信息 ===\n");
    for(int x = 0; x < 5; x++ ) {
        printf("\nPlaca: %s", car[x].placa);
        printf("\nMarca: %s", car[x].marca);
        printf("\nModelo: %s", car[x].modelo);
        printf("\nAno: %s", car[x].ano);
        printf("\nValor da diaria: R$%s\n", car[x].valordiaria);
    }

    // 冒泡排序:按车牌字母顺序排序
    for (int j = 0; j < 5 - 1; j++) {
        // 内层循环边界优化:每轮减少j+1次比较
        for (int i = 0; i < 5 - j - 1; i++) {
            // 比较相邻两个元素的车牌,前者大于后者则交换
            if (strcmp(car[i].placa, car[i+1].placa) > 0) {
                temp = car[i];
                car[i] = car[i+1];
                car[i+1] = temp;
            }
        }
    }

    // 展示排序后的结构体
    printf("\n=== 按车牌排序后的汽车信息 ===\n");
    for(int x = 0; x < 5; x++ ) {
        printf("\nPlaca: %s", car[x].placa);
        printf("\nMarca: %s", car[x].marca);
        printf("\nModelo: %s", car[x].modelo);
        printf("\nAno: %s", car[x].ano);
        printf("\nValor da diaria: R$%s\n", car[x].valordiaria);
    }

    return 0;
}

关键修正点说明

  1. 输出索引修正:把所有输出循环里的car[q]改成car[x],这样就能遍历数组的每个元素,正确展示所有汽车信息。
  2. 排序逻辑修正:用内层循环变量i作为数组索引,比较car[i]和car[i+1]的车牌,通过strcmp函数判断字母顺序(返回值>0表示前者字典序更大)。
  3. 临时变量修正:将temp改为单个结构体变量,结构体支持直接赋值,交换逻辑更简洁。
  4. 循环边界优化:内层循环i < 5 - j -1,避免重复比较已经有序的末尾元素,提升排序效率。

运行修正后的代码,你会看到车牌按字母顺序排列的结果:AHG-8332 → BSD-8329 → HJZ-1234 → IZA-2929 → XCV-3478,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:38:12