2016-01-24 75 views
-1

我在C中编写了一个通用插入排序,它工作得很好。C中的通用插入排序

但是,在我的插入排序功能,它得到一个void** arr, 和它的签名得到void* arr,否则,它不起作用。

这是为什么? 我们有任何其他方法来将插入排序编码为通用的吗?

完整的代码是在这里:

#include <stdio.h> 
#include <malloc.h> 
#define SIZE 10 
int cmp(void* elm1, void* elm2); 
void insertionSort(void* arr, int size); 

int main() 
{ 
    int arr[] = {5, 8, 2, 3, 15, 7, 4, 9, 20, 13}; 
    int arr2[] = {1}; 
    int i; 
    for (i = 0; i < SIZE; i++) 
     printf("%d ", arr[i]); 
    printf("\n"); 
    insertionSort(&arr, SIZE); 
    for (i = 0; i < SIZE; i++) 
     printf("%d ", arr[i]); 
    return 0; 
} 

void insertionSort(void** arr, int size) 
{ 
    int i = 1; 
    int j; 
    void* temp; 
    while (i < size) 
    { 
     if (cmp(arr[i], arr[i-1]) == -1) 
     { 
      temp = arr[i]; 
      j = i - 1; 
      while (j >= 0 && cmp(arr[j], temp) == 1) 
      { 
       arr[j + 1] = arr[j]; 
       j--; 
      } 
      arr[j + 1] = temp; 
     } 
     i++; 
    } 
} 

int cmp(void* elm1, void* elm2) 
{ 
    if ((int)elm1 == (int)elm2) 
     return 0; 
    else if ((int)elm1 > (int)elm2) 
     return 1; 
    else 
     return -1; 
} 

回答

1

,因为它是代码,是不确定的,因为多个问题。它只是正常工作,因为在你的系统上,指针的大小与int类型的大小相同。

您的代码不会在没有警告的情况下编译(如果启用它们)。函数insertionSort和它的原型必须具有相同的类型。

你应该改变在函数定义类型

void insertionSort(void* arr, int size) 

再投指针改编,以一个合适的类型。由于这是一种通用的排序方式,比如qsort(),唯一现实的选择是对char*进行强制转换。这意味着您还必须将该类型的大小传递给该函数,以便指针可以正确递增。这将要求您彻底改变功能。

所以,函数原型确实应该是一样的qsort:

void Sort(void* arr, size_t size , size_t object_size , int(*)(const void* , const void*)) 
0

的问题是,integers不是指针,所以您的测试阵列是*int型或int[]的。但是在你的函数中,你不知道这一点,而你试图让你的代码使用指针。所以你期望* void[]。如果您将temp变量更改为int,则签名中不需要**。同样,如果你想保留“通用”(如你所说),你需要一个*int的数组。

基本上,在C语言中,你不能编写一个函数来为主类型和指针提供开箱即用的功能。你需要一些技巧。看看this stackoverflow,也许会有所帮助。