2014-06-12 76 views
3

我已經寫了大量的抽象數據類型(即:散列表,堆等)和簡單的算法(即:搜索,排序,列表操作等)的集合所有工作在int的陣列上。我修改我的一些算法,像我有什麼下面這樣我就可以概括,而無需重新編寫每個相同的算法,我要排序的每個數據類型的代碼/比較:泛型和按大小而不是按類型鑄造

void* bubbleSort(void* inputArray, void (*functionPtr)(void*,void*)), size_t dataTypeSize, size_t numElements) 

的想法我希望能夠對任意數據類型的數組進行排序(即:自定義struct s),爲了適應這種情況,我將輸入數組作爲void指針,排序算法需要函數指針到特定的比較函數,因此它知道如何比較相同數據/結構類型的任何兩個元素。到現在爲止還挺好。

我弄不明白的一件事是如何在函數內正確地投射數組,以便我可以一次訪問單個元素。我試圖完成這樣的:

someRandomDataType* tempArray = (someRandomDataType*)inputArray; 

但是,我找不到在運行時這樣做不使用宏的任何手段(我想避免在這種情況下,如果可能的話) 。在我看來,我真正需要做的就是鑄造inputArray,以便將它看作是具有任意大小的元素的一些數組。是否有某種方式來將指針到數組,這樣,動態的,它等同於:

(typeThatIsDataTypeSize*) tempArray = (typeThatIsDataTypeSize*)inputArray; 

其中「dataTypeSize」指的是傳遞給排序函數size_t輸入值?謝謝!

+2

您實際上並不需要轉換爲基礎類型。只需在char指針中工作,並根據需要手動縮放指針。你可以找到qsort的源代碼來看看它是如何完成的。 –

+1

'void(* functionPtr)(void *,void *))':您必須返回結果比較函數。 – BLUEPIXY

回答

2

您的泡泡功能已經包含了所有信息。 size,它等於您包含的元素的sizeof並計算元素的數量。

inputArray指向第一個元素。當你想要移動到下一個元素時,只需通過元素的大小來增加指針。

void* second_element = (char*)inputArray + size ; 

size_t n = 123 ; 
void* nth_element = (char*)inputArray + size * n ; 

這就是你如何索引你的數組。

移動元素由memcpy完成,最後一個參數是size。通過聲明尺寸爲size的臨時內存並使用memcpy移動內存來完成交換。

+0

謝謝。現在看起來很簡單,它就在我面前。乾杯! – DevNull