C和指针第13章第4题

题目:编写一个函数,它用于对一个任何类型的数组进行排序。

算法核心代码sort函数实现

/**

功能说明:sort函数可以对不同类型的数据进行排序

参数:

1、一个指向需要排序的数组的第一个值的指针。

2、数组中元素的个数。 

3、每个数组元素的长度。

4、一个指向比较回调函数的指针 

**/

void sort(void *array,int size,int element_size,int (*cmp)(void const *a,void const *b))

{

    char *pc = (char *)array;//默认void *大小未知,这里把它存入字符指针下

     //简单的冒泡排序 这里可以用更高级的算法实现,这里采用了简单的冒泡排序

     for(int i = 0; i < size; i++)

     for(int j = 1; j < size-i; j++)

     {

             if(cmp(pc+(j-1)*element_size,pc+j*element_size) < 0)

             {

                 void *p = malloc(element_size);//分配一个string大小的内存

                 //交换两个元素,借助于和中间变量p,由于具体类型未知,这里借助于内存cpy函数拷贝内存内的内容

                 memcpy(p,pc+j*element_size,element_size);

                 memcpy(pc+j*element_size,pc+(j-1)*element_size,element_size);

                 memcpy(pc+(j-1)*element_size,p,element_size);

                 free(p);//临时变量使用完毕后,记得释放,不然容易造成内存泄露

             }

     }

}

字符串比较函数,这里是第二个大于第一个返回值大于0,相等等于0,第二个数小于第一个返回值小于0

//string 比较

int string_cmp(void const *a,void const *b)

{

    char *num1 = (char *)a;

    char *num2 = (char *)b;

    assert(num1 != NULL && num2 != NULL);

    while(*num1 != '\0' && *num2 != '\0')

    {        

        if(*num1 == *num2)

        {

            num1++;

            num2++;

            continue;

        }

        break;

    }

    return *num2-*num1;



}

测试代码,全部代码

C和指针第13章第4题
/*************************************************************************

    > File Name: sort.c

    > Created Time: 2014年06月17日 星期二 23时22分34秒

 ************************************************************************/





#include<stdio.h>

#include<stdlib.h>

#include<assert.h>

#include<string.h>



/**

功能说明:sort函数可以对不同类型的数据进行排序

参数:

1、一个指向需要排序的数组的第一个值的指针。

2、数组中元素的个数。 

3、每个数组元素的长度。

4、一个指向比较回调函数的指针 

**/

void sort(void *array,int size,int element_size,int (*cmp)(void const *a,void const *b))

{

    char *pc = (char *)array;//默认void *大小未知,这里把它存入字符指针下

     //简单的冒泡排序 这里可以用更高级的算法实现,这里采用了简单的冒泡排序

     for(int i = 0; i < size; i++)

     for(int j = 1; j < size-i; j++)

     {

             if(cmp(pc+(j-1)*element_size,pc+j*element_size) < 0)

             {

                 void *p = malloc(element_size);//分配一个string大小的内存

                 //交换两个元素,借助于和中间变量p,由于具体类型未知,这里借助于内存cpy函数拷贝内存内的内容

                 memcpy(p,pc+j*element_size,element_size);

                 memcpy(pc+j*element_size,pc+(j-1)*element_size,element_size);

                 memcpy(pc+(j-1)*element_size,p,element_size);

                 free(p);//临时变量使用完毕后,记得释放,不然容易造成内存泄露

             }

     }

}



//int比较

int int_cmp(void const *a,void const *b)

{

    int *num1 = (int *)a;

    int *num2 = (int *)b;

    if(*num1 == *num2)return 0;

    else return *num2-*num1;

}

//double比较

int double_cmp(void const *a,void const *b)

{

    double *num1 = (double *)a;

    double *num2 = (double *)b;

    if(*num1 == *num2)return 0;

    else return *num2-*num1;

}





//char 比较

int char_cmp(void const *a,void const *b)

{

    char *num1 = (char *)a;

    char *num2 = (char *)b;

    if(*num1 == *num2)return 0;

    else return *num2-*num1;

}



//string 比较

int string_cmp(void const *a,void const *b)

{

    char *num1 = (char *)a;

    char *num2 = (char *)b;

    assert(num1 != NULL && num2 != NULL);

    while(*num1 != '\0' && *num2 != '\0')

    {        

        if(*num1 == *num2)

        {

            num1++;

            num2++;

            continue;

        }

        break;

    }

    return *num2-*num1;



}



int main()

{



    //int 数组

    int array[6] = {9,3,5,2,0,4};

    printf("int 数组排序前:\n");

    for(int i = 0; i < 6; i++)

    printf("%d ",array[i]);

    printf("\n");

    sort(array,6,sizeof(int),int_cmp);

    printf("int 数组排序后:\n");

    for(int i = 0; i < 6; i++)

    printf("%d ",array[i]);

    printf("\n");



    //double 数组

    double array_d[5] = {3.16,2.5,6.49,10.5,0.4};

    printf("double 数组排序前:\n");

    for(int i = 0; i < 5; i++)

        printf("%lf ",array_d[i]);

    printf("\n");

    sort(array_d,5,sizeof(double),double_cmp);

    printf("double 数组排序后:\n");

    for(int i = 0; i < 5; i++)

        printf("%lf ",array_d[i]);

    printf("\n");





    //char 

    char array_c[5] = {'E','C','A','D','B'};

    printf("char 数组排序前:\n");

    for(int i = 0; i < 5; i++)

        printf("%c ",array_c[i]);

    printf("\n");

    sort(array_c,5,sizeof(char),char_cmp);

    printf("char 数组排序后:\n");

    for(int i = 0; i < 5; i++)

        printf("%c ",array_c[i]);

    printf("\n");

    //string 数组排序

    char array_s[5][10] = {"yello","world","herb","herd","sort"};

    printf("string 数组排序前:\n");

    for(int i = 0; i < 5; i++)

        printf("%s ",array_s[i]);

    printf("\n");

    sort(array_s,5,sizeof(char)*10,string_cmp);

    printf("string 数组排序后:\n");

    for(int i = 0; i < 5; i++)

        printf("%s ",array_s[i]);

    printf("\n");



    return 0;

}
View Code

 运行结果:

C和指针第13章第4题

你可能感兴趣的:(指针)