【问题标题】:Quicksort using function pointers and qsort [closed]使用函数指针和 qsort 进行快速排序 [关闭]
【发布时间】:2020-10-25 22:00:45
【问题描述】:

我必须编写一个程序,使用 qsort 和函数指针对整数数组进行排序。

编写一个对包含 n 个整数的数组进行排序的程序。读取 n 和数组的值后 从标准输入中,程序读取一个字符,如果这个字符是'a',那么排序 应该是升序,如果字符是“d”那么排序应该是降序,如果 字符是 'e' 那么程序应该退出执行。

这是我的代码,我不断收到错误消息:assignment of function 'void qsort(void*, size_t, size_t, int (*)(const void*, const void*))。请问我可以有一些反馈吗?我是完全错误地接近它还是应该只改变几件事?

#include <ctype.h>
#include <stdlib.h>
void quicksort(int *a, int n, int (*func)(char c))
{
    qsort = (a, n, sizeof(int), func);
    for (int i = 0; i < n; i++)
        printf("%d ", a[i]);
}

int compare(char c)
{
    if (c == 'a')
        return -1;
    if (c == 'd')
        return 1;
    else
        return 0;
}
int main()
{
    int *a, n, i;
    scanf("%d", &n);
    a = (int *)malloc(sizeof(int) * n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    char c;
    while (1)
    {
        scanf("%c", c);
        if (c == 'e')
            break;
        quicksort(a, n, compare);
    }
    free(a);
    return 0;
}

【问题讨论】:

  • qsort = (a, n, sizeof(int), func); 尝试将值分配给 qsort。您应该调用该函数而不是更改它。
  • 而且compare 函数签名是错误的。阅读qsort manual 了解所需内容。也就是说,您对qsort 的使用不正确。您需要编写一个比较两个整数的比较函数,而不是与ad 的固定值进行比较。

标签: c function pointers quicksort


【解决方案1】:

qsort = (a, n, sizeof(int), func);

应该是

qsort(a, n, sizeof(int), func);

即调用函数,不要尝试分配给它。

此外,您传递给 qsort 的比较函数具有不同的签名,采用两个 void* 参数而不是单个 char

【讨论】:

  • 这是有道理的,但是我应该在哪里实现 'a' 和 'd' 案例呢?谢谢!
  • 一种方法是有两个比较函数,一个用于每个排序方向,并将对应的一个传递给qsort
【解决方案2】:

您的代码正在重新分配,而不是函数调用。

void quicksort(int *a, int n, int (*func)(char c))
{
    qsort(a, n, sizeof(int), func);
    for (int i = 0; i < n; i++)
        printf("%d ", a[i]);
}

调用qsort函数,并修复func签名获取两个参数。

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 2020-01-08
    • 2019-05-25
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多