当前位置:首页C语言 > 正文

对C中回调函数的一些理解(实现泛型排序函数)

作者:野牛程序员:2024-01-03 21:20:16C语言阅读 2622

在C语言中,回调函数是指将一个函数作为参数传递给另一个函数,并在需要的时候由另一个函数调用。回调函数通常用于实现灵活性强的代码结构,其中一个函数可以在执行时调用传递进来的函数,以完成特定的任务。

实现泛型排序函数时,可以使用回调函数来指定排序的规则。以下是一个简单的例子,演示如何使用回调函数实现泛型排序:

#include <stdio.h>
#include <stdlib.h>

// 声明回调函数类型
typedef int (*CompareFunction)(const void*, const void*);

// 泛型排序函数
void genericSort(void* array, size_t numElements, size_t elementSize, CompareFunction compare) {
    for (size_t i = 0; i < numElements - 1; ++i) {
        for (size_t j = 0; j < numElements - i - 1; ++j) {
            // 计算要比较的元素的地址
            void* element1 = (char*)array + j * elementSize;
            void* element2 = (char*)array + (j + 1) * elementSize;

            // 调用回调函数比较元素
            if (compare(element1, element2) > 0) {
                // 交换元素
                char temp[elementSize];
                memcpy(temp, element1, elementSize);
                memcpy(element1, element2, elementSize);
                memcpy(element2, temp, elementSize);
            }
        }
    }
}

// 比较函数示例:整数比较
int compareInt(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}

// 比较函数示例:字符串比较
int compareString(const void* a, const void* b) {
    return strcmp(*(const char**)a, *(const char**)b);
}

int main() {
    int intArray[] = {5, 2, 8, 1, 6};
    const size_t intArraySize = sizeof(intArray) / sizeof(int);

    // 使用整数比较函数进行排序
    genericSort(intArray, intArraySize, sizeof(int), compareInt);

    // 输出排序后的整数数组
    for (size_t i = 0; i < intArraySize; ++i) {
        printf("%d ", intArray[i]);
    }
    printf("\\n");

    const char* stringArray[] = {"banana", "apple", "orange", "grape"};
    const size_t stringArraySize = sizeof(stringArray) / sizeof(const char*);

    // 使用字符串比较函数进行排序
    genericSort(stringArray, stringArraySize, sizeof(const char*), compareString);

    // 输出排序后的字符串数组
    for (size_t i = 0; i < stringArraySize; ++i) {
        printf("%s ", stringArray[i]);
    }
    printf("\\n");

    return 0;
}

上述代码演示了一个泛型排序函数genericSort,它可以对任意类型的数组进行排序。通过传递不同的比较函数作为回调,可以实现对不同类型的数据进行排序。在示例中,提供了整数比较函数compareInt和字符串比较函数compareString作为回调函数。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击