当前位置:编程学习 > C/C++ >>

一步一步写算法(之通用算法的编写)

 

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

 

 

    前面我们写过各种各样的算法,什么排序、查找、二叉树、队列、堆栈等等。但是我们在编写这些代码的时候却都有一个缺点,不知道大家发现了没有?那就是这些算法中使用的数据结构都是简单的int数据。所以,如果排序的是int,那么用起来没有什么问题。关键就是万一是其他的数据类型,那我们应该怎么办呢?

 

    在c++中,有一种解决的方法。那就是类函数。就拿冒泡排序来说,我们完全可以这么写。

 

template <typename type> 

void bubble_sort(type array[], int length) 

    int outer; 

    int inner; 

    type median; 

 

    if(NULL == array || 0 == length) 

        return; 

 

    for(outer = length -1; outer >0; outer --){ 

        for(inner = 0; inner < outer; inner ++){ 

            if(array[inner] > array[inner +1]){ 

                median = array[inner]; 

                array[inner] = array[inner +1]; 

                array[inner +1] = median; 

            } 

        } 

    } 

 

    return; 

template <typename type>

void bubble_sort(type array[], int length)

{

       int outer;

       int inner;

       type median;

 

       if(NULL == array || 0 == length)

              return;

 

       for(outer = length -1; outer >0; outer --){

              for(inner = 0; inner < outer; inner ++){

                     if(array[inner] > array[inner +1]){

                            median = array[inner];

                            array[inner] = array[inner +1];

                            array[inner +1] = median;

                     }

              }

       }

 

       return;

}    当然,如果是一个class需要调用上面的算法的话,它还需要定义type缺省构造函数、type拷贝够构造函数两个函数。

 

    那么,在c语言里面有没有什么办法呢?其实也有,那就是void*这种方法。

 

void bubble_sort(void* array[], int length, int (*compare)(void*, void*), void(*swap)(void*, void*)) 

    int outer; 

    int inner; 

 

    for(outer = length -1; outer >0; outer --){ 

        for(inner = 0; inner < outer; inner ++){ 

            if(compare(array[inner], array[inner + 1])) 

                swap(array[inner], array[inner + 1]); 

        } 

    } 

 

    return; 

void bubble_sort(void* array[], int length, int (*compare)(void*, void*), void(*swap)(void*, void*))

{

       int outer;

       int inner;

 

       for(outer = length -1; outer >0; outer --){

              for(inner = 0; inner < outer; inner ++){

                     if(compare(array[inner], array[inner + 1]))

                            swap(array[inner], array[inner + 1]);

              }

       }

 

       return;

}    接着在具体应用的时候,只需要将void*转换成自己需要的那个数据指针了。比如说,如果是int排序的话,我们就需要添加这两个函数即可。

 

int compare(void* var1, void* var2) 

    int* p_var1 = (int*)var1; 

    int* p_var2 = (int*)var2; 

 

    return (*p_var1 > *p_var2) ? 1 : 0; 

 

void swap(void* var1, void* var2) 

    int* p_var1 = (int*)var1; 

    int* p_var2 = (int*)var2; 

    int median; 

     

    median = *p_var1; 

    *p_var1 = *p_var2; 

    *p_var2 = median; 

int compare(void* var1, void* var2)

{

       int* p_var1 = (int*)var1;

       int* p_var2 = (int*)var2;

 

       return (*p_var1 > *p_var2) ? 1 : 0;

}

 

void swap(void* var1, void* var2)

{

       int* p_var1 = (int*)var1;

       int* p_var2 = (int*)var2;

       int median;

      

       median = *p_var1;

       *p_var1 = *p_var2;

       *p_var2 = median;

}

 

    函数调用如下所示,数据转换稍显麻烦。

 

void test() 

    int array[5] = {1, 2, 4,3,5}; 

    int* p_array[5] = {&array[0],

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,