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

我的C语言选择排序代码出错,如何修改实现结构体数组排序与插值搜索

问题分析与代码修正

现有代码错误列表

  • 选择排序函数参数不匹配:原函数只支持int数组排序,实际需要对结构体数组排序,排序逻辑要基于结构体的angka成员,交换操作也要对应修改为交换整个结构体
  • 排序逻辑bug:if (angka[j] < angka[k]);末尾多余分号,导致判断条件完全失效,无法正确找到最小值下标
  • 数组长度计算错误:sizeof(nama_var.angka)/sizeof(nama_var.angka[])语法错误,结构体数组长度正确计算方式为sizeof(数组名)/sizeof(数组[0])
  • 传参错误:selectionSort(nama_var[15], n)传入的是越界的数组元素,应该传入结构体数组首地址
  • 打印函数不匹配:原打印函数仅支持int数组输出,需要修改为适配结构体数组的打印逻辑
  • 缺少插值搜索实现:需求要求的插值搜索功能完全未实现
  • conio.h为Windows平台非标准头文件,可替换为标准C库实现提升兼容性

修正后完整代码

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

struct dat {
    int angka;
    const char* name;
};

// 交换两个结构体元素
void swap(struct dat *xp, struct dat *yp) {
    struct dat temp = *xp;
    *xp = *yp;
    *yp = temp;
}

// 直接选择排序:按angka成员升序排序结构体数组
void selectionSort(struct dat arr[], int n) {
    int i, j, min_idx;
    for (i = 0; i < n - 1; i++) {
        min_idx = i;
        for (j = i + 1; j < n; j++) {
            if (arr[j].angka < arr[min_idx].angka) {
                min_idx = j;
            }
        }
        swap(&arr[min_idx], &arr[i]);
    }
}

// 插值搜索:基于angka成员查找目标值,找到返回下标,找不到返回-1
int interpolationSearch(struct dat arr[], int n, int target) {
    int low = 0, high = n - 1;
    while (low <= high && target >= arr[low].angka && target <= arr[high].angka) {
        // 处理所有元素值相同的情况,避免除零错误
        if (arr[high].angka == arr[low].angka) {
            return arr[low].angka == target ? low : -1;
        }
        // 插值公式计算预测位置
        int pos = low + ((target - arr[low].angka) * (high - low)) / (arr[high].angka - arr[low].angka);
        if (arr[pos].angka == target) {
            return pos;
        }
        if (arr[pos].angka < target) {
            low = pos + 1;
        } else {
            high = pos - 1;
        }
    }
    return -1;
}

// 打印结构体数组所有元素
void printStructArray(struct dat arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("第%d项:angka = %d,name = %s\n", i + 1, arr[i].angka, arr[i].name);
    }
    printf("\n");
}

int main () {
    struct dat nama_var[15] = {
        {4, "Farina"},
        {12, "Rima"},
        {7, "Jihan"},
        {1, "Audi"},
        {14, "Tantri"},
        {5, "Farhan"},
        {15, "Tedi"},
        {6, "Husain"},
        {9, "Laudia"},
        {13, "Sari"},
        {2, "Ardi"},
        {10, "10"},
        {8, "Johan"},
        {11, "Misbah"},
        {3, "Cindy"}
    };
    int n = sizeof(nama_var) / sizeof(nama_var[0]);

    // 执行排序并输出结果
    selectionSort(nama_var, n);
    printf("排序后的数组:\n");
    printStructArray(nama_var, n);

    // 测试插值搜索功能
    int search_target = 7;
    int search_res = interpolationSearch(nama_var, n, search_target);
    if (search_res != -1) {
        printf("查找angka=%d的结果:下标为%d,对应姓名为%s\n", search_target, search_res, nama_var[search_res].name);
    } else {
        printf("未找到angka=%d的元素\n", search_target);
    }

    getchar();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:15:03