欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习记录—回调函数和指针函数的运用

程序员文章站 2022-07-15 09:33:29
...

14.程序设计-排序
编写一个名叫sort的函数,它用于对一个任何类型的数组进行排序,为了使函数更为通用,它的其中一个参数必须是一个指向比较回调函数的指针,该回调函数由调用函数提供两个参数,也就是两个指向需要进行比较的值的指针。如果两个值相等,函数返回零;如果第1个值小于第2个,函数返回一个小于零的整数:如果第1个值大于第2个,函数返回一个大于零的整数。
Sort函数的参数将是:
1、一个指向需要排序的数组的第一个值的指针
2、数组中值的个数
3、每个数组元素的长度
4、一个指向比较回调函数的指针
Sort函数没有返回值。
你将不能根据实际类型声明数组参数,因为函数应该可以对不同类型的数组进行排序。如果你把数据当作一个字符数组使用,你可以用第3个参数寻找实际数组中每个元素的起始位置,也可以用它交换两个数组元素(每次一个字节)

#include <stdio.h>

typedef int (*Compare)(void *a, void *b);
typedef void (*Swap)(void *a, void *b);

void sort(void *arr, int size, int len, Compare compare, Swap swap);

int compare_int(void *a, void *b)
{
    if(*(int *)a > *(int *)b)
    {
        return 1;
    }
    else if(*(int *)a == *(int *)b)
    {
        return 0;
    }
    return -1;
}

int compare_char(void *a, void *b)
{
    if(*(char *)a > *(char *)b)
    {
        return 1;
    }
    else if(*(char *)a == *(char *)b)
    {
        return 0;
    }
    return -1;
}

void swap_int(void *a, void *b)
{
    int* p1=(int*)a;
	int* p2=(int*)b;
    int temp = 0;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp; 
}

void swap_char(void *a, void *b)
{
    char* p1=(char*)a;
	char* p2=(char*)b;
    char temp = 0;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp; 
}

typedef void (*Printf)(void *arr, int size);
void printf_int(void *arr, int size)
{
    int *p = (int *)arr;
    int i = 0;
    for(;i < size;i++)
    {
        printf("%d ",*p);
        p++;
    }
    printf("\n");
}
void printf_char(void *arr, int size)
{
    char *p = (char *)arr;
    int i = 0;
    for(;i < size;i++)
    {
        printf("%c ",*p);
        p++;
    }
    printf("\n");
}

int main()
{
	int  num=10;
    int  a_int[10]={9,2,3,8,1,5,6,4,7,12};
    char c_char[10]={'g','h','t','a','d','w','q','b','m','c'};
    sort(a_int,sizeof(a_int)/sizeof(int),sizeof(int),compare_int, swap_int);
    sort(c_char,sizeof(c_char)/sizeof(char),sizeof(char),compare_char, swap_char);
    printf_char(c_char, sizeof(c_char)/sizeof(char));
    printf_int(a_int, sizeof(a_int)/sizeof(int));

    
}

void sort(void *arr, int size, int len, Compare compare, Swap swap)
{
    int i = 0, j = 0;
    char* test=(char*)arr;
    for(i = 0; i < size - 1; i++)
	{
		//先搞定一趟排序,利用冒泡排序将最大值放在最后一个数组的位置上
		for(j = 0; j < size - i -1; j++)
		{
			//取前一个数和后一个数进行对比,将大的数据放在后一个位置上
			if(compare(test+j*len,test+(j+1)*len) == 1)
			{
				swap(test+j*len,test+(j+1)*len);
			}
		}
	}
}