2016-01-24 73 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,也許會有所幫助。