zoukankan      html  css  js  c++  java
  • 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 != '' && *num2 != '')
        {        
            if(*num1 == *num2)
            {
                num1++;
                num2++;
                continue;
            }
            break;
        }
        return *num2-*num1;
    
    }

    测试代码,全部代码

    /*************************************************************************
        > 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 != '' && *num2 != '')
        {        
            if(*num1 == *num2)
            {
                num1++;
                num2++;
                continue;
            }
            break;
        }
        return *num2-*num1;
    
    }
    
    int main()
    {
    
        //int 数组
        int array[6] = {9,3,5,2,0,4};
        printf("int 数组排序前:
    ");
        for(int i = 0; i < 6; i++)
        printf("%d ",array[i]);
        printf("
    ");
        sort(array,6,sizeof(int),int_cmp);
        printf("int 数组排序后:
    ");
        for(int i = 0; i < 6; i++)
        printf("%d ",array[i]);
        printf("
    ");
    
        //double 数组
        double array_d[5] = {3.16,2.5,6.49,10.5,0.4};
        printf("double 数组排序前:
    ");
        for(int i = 0; i < 5; i++)
            printf("%lf ",array_d[i]);
        printf("
    ");
        sort(array_d,5,sizeof(double),double_cmp);
        printf("double 数组排序后:
    ");
        for(int i = 0; i < 5; i++)
            printf("%lf ",array_d[i]);
        printf("
    ");
    
    
        //char 
        char array_c[5] = {'E','C','A','D','B'};
        printf("char 数组排序前:
    ");
        for(int i = 0; i < 5; i++)
            printf("%c ",array_c[i]);
        printf("
    ");
        sort(array_c,5,sizeof(char),char_cmp);
        printf("char 数组排序后:
    ");
        for(int i = 0; i < 5; i++)
            printf("%c ",array_c[i]);
        printf("
    ");
        //string 数组排序
        char array_s[5][10] = {"yello","world","herb","herd","sort"};
        printf("string 数组排序前:
    ");
        for(int i = 0; i < 5; i++)
            printf("%s ",array_s[i]);
        printf("
    ");
        sort(array_s,5,sizeof(char)*10,string_cmp);
        printf("string 数组排序后:
    ");
        for(int i = 0; i < 5; i++)
            printf("%s ",array_s[i]);
        printf("
    ");
    
        return 0;
    }
    View Code

     运行结果:

  • 相关阅读:
    XML操作类
    输入框样式总结
    根据计算机MAC地址限定每台机子只能领取一次账号
    ico图标的应用
    C#实现关机功能
    在sql中实现数组
    JSON
    MvcHtml.ActionLink()用法
    Brettle.Web.NeatUpload.dll 大文件上传
    asp.net 创建Access数据库
  • 原文地址:https://www.cnblogs.com/newpanderking/p/3834285.html
Copyright © 2011-2022 走看看