我正在尝试对结构数组进行排序。但是我要按要素排序。例如,我正在使用冒泡排序进行排序。
struct example{
int num;
char str[5];
} ex[90];
for(int i = 0; i < 88; i++){
for(int o = 0; o < 88; o++){
if(ex[o].num > ex[o + 1].num){
swap(ex[o].num, ex[o + 1].num);
}
}
}
在这段代码中,如何在不再次编写代码的情况下将ex [o] .num更改为ex [o] .str?
最佳答案
可以实现比较功能并使用标准库的qsort
。除非要进行稳定的排序,否则很难超越标准库进行常规排序。 qsort
接受一个compar
,
compar参数是一个指向比较函数的指针,该函数使用两个指向要比较的元素的参数来调用。如果第一个参数分别小于,等于或大于第二个参数,则应用程序应确保该函数返回小于,等于或大于0的整数。
像这样
#include <stdlib.h> /* EXIT_* qsort */
#include <stdio.h> /* printf */
#include <string.h> /* strcmp */
#include <assert.h>
struct Example {
int num;
char str[5];
} ex[90];
static const size_t ex_size = sizeof ex / sizeof *ex;
static void fill(struct Example *const example) {
assert(example);
example->num = rand() / (RAND_MAX / 100.0);
example->str[0] = rand() / (RAND_MAX / 26.0) + 'A';
example->str[1] = rand() / (RAND_MAX / 26.0) + 'a';
example->str[2] = rand() / (RAND_MAX / 26.0) + 'a';
example->str[3] = rand() / (RAND_MAX / 26.0) + 'a';
example->str[4] = '\0';
}
static void print(const struct Example *const example) {
assert(example);
printf("%d\t\"%s\"\n", example->num, example->str);
}
/* Implements <Example>Comparator. */
static int comp_num(const void *va, const void *vb) {
const struct Example *a = va, *b = vb;
return (a->num > b->num) - (a->num < b->num);
}
/* Implements <Example>Comparator. */
static int comp_str(const void *va, const void *vb) {
const struct Example *a = va, *b = vb;
return strcmp(a->str, b->str);
}
int main(void) {
size_t i;
for(i = 0; i < ex_size; i++) fill(&ex[i]);
for(i = 0; i < ex_size; i++) print(&ex[i]);
printf("Sorting by num.\n");
qsort(ex, ex_size, sizeof *ex, &comp_num);
for(i = 0; i < ex_size; i++) print(&ex[i]);
printf("Sorting by str.\n");
qsort(ex, ex_size, sizeof *ex, &comp_str);
for(i = 0; i < ex_size; i++) print(&ex[i]);
return EXIT_SUCCESS;
}
关于c - 选择struct元素时有捷径吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53980450/