【发布时间】:2021-05-24 10:59:31
【问题描述】:
所以我有这个问题。我应该创建一些排序函数以在 C 中的通用排序例程中使用。除了一个函数之外,我所有的函数都在工作。该函数应该用作结构的排序函数。代码应按年份排列列表。
以下是已预先编写并用于排序例程的两个辅助函数的代码:
static
void swap(void **left, void **right) {
void *temp = *left;
*left = *right;
*right = temp;
}
void sort_array(void *Array[], unsigned size, int (*ordered)(void *, void *))
{
int i;
int have_swapped = 1;
while (have_swapped) {
have_swapped = 0;
for (i = 0; i < size - 1; ++i ){
if (ordered(Array[i], Array[i+1])) {
swap(&Array[i], &Array[i+1]);
have_swapped = 1;
}
}
}
}
然后就是这个函数,也是预写在main中用来测试的。
int main() {
int i;
int status = EXIT_SUCCESS;
sort_array((void**)data, data_size, &ordered_structures);
for (i = 0; i < data_size - 1; ++i) {
if (data[i]->year > data[i+1]->year) {
fprintf(stderr,
"\"%s\" and \"%s\" are out of order\n",
data[i]->name,
data[i+1]->name);
status = EXIT_FAILURE;
}
}
return status;
}
结构简单。
struct automobile {
const char *name;
unsigned year;
unsigned price;
};
所以这些是使用的辅助函数。我所要做的就是编写一个函数,该函数将用于使用这些辅助函数对结构进行排序。
我的解决方案可以编译,但是没有达到预期的效果,我的解决方案仍然有问题。这是我所拥有的。
int ordered_structures(void *left, void *right) {
const int *x = left;
const int *y = right;
if (x < y)
return 0;
else
return 1;
}
非常感谢任何帮助
【问题讨论】:
-
@AlexReynolds:
main函数清楚地表明排序是通过增加年数来测试的,但不清楚排序函数应该返回什么来实现这种排序。如果对象是有序的,我认为它应该返回 true。
标签: c pointers structure function-pointers