我的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
相关产品推荐
相关产品推荐

