2017-05-29 32 views
0

我有結構的列表排序結構的列表:C:由給定的排序

typedef struct { 
    uint8_t mac_addr[6]; 
    uint32_t signal; 
    uint32_t freq; 
    ... 
}pseudo_entry; 

我整理這個entrys將列表中的東西的時候。

僞:

while(next) 
    if(curr.mac_addr < next.mac_addr) 
     if(curr.signal < next.signal) 
     ... 

這是非常不靈活,我想的排序,我可以給作爲啓動參數。 任何好主意?

我不需要整個代碼。只是想法或可能庫。

謝謝。 :)

+1

。在你的代碼中沒有鏈表。如果您要使用常規的結構數組,則可以針對不同的排序使用具有不同回調函數的'qsort'。 – user694733

+2

使用'<來比較兩個數組時,實際上比較*指針*,指向數組中的第一個元素。即使你有兩個內容相同的數組,他們也永遠不會相等。如果你想比較數組,你必須編寫一個函數來比較數組的*內容*。 –

+0

是的,我知道。 ^^ 這就是爲什麼我寫了僞代碼: – Nick

回答

0

您可以將您的數字轉換爲字符串(char*),然後將它們連接在一起成一個字符串。我認爲對它們進行排序可能會更容易,因爲那時您只需要一條if聲明。然而,轉換和連接可能比使用剛纔在問題中提到的三個條件花費更多的時間,因此您應該比較時間來檢查它是否真的值得。

1

您可能會感興趣於Intrusive Lists數據導向設計(陣列結構vs陣列結構)。優點包括更少的緩存未命中以及更好的數據和代碼分離。

如果您使用C或lambda如果您使用C++來處理數值並將其返回,您可以使用函數指針。

+0

非常感謝。 :) 我想我會試試這個。但我認爲這不是解決我最初的問題。 我仍然需要對入侵列表進行排序。 – Nick

+0

@Nick它確實導致了一個更靈活的系統:) – MattMatt2000

+0

@Nick - 請參閱我的編輯排序 – MattMatt2000

0

你需要一個比較函數,然後你可以將它傳遞給qsort功能:

int compt(void *f, void *s){ 
    return (f->signal) -(s->signal); 
} 

然後:

qsort(&curr,<yourarraysize>, sizeof(cur), &compt); 
+0

qsort is只是使用數組:/ 我不知道我的列表將包含多少個對象 – Nick

+0

它是通用的,它也可以對結構數組進行排序。 –

+0

是的。但我有一個鏈表^^ 所以我將不得不將列表轉換爲數組,然後再返回? – Nick