2012-03-23 86 views
3

我正在嘗試瞭解指向結構的上下文中的c庫qsort。 下面是現有代碼,我想操縱:使用qsort按不同變量對結構指針進行排序

結構:

#define MAX_NAME 20 
#define NUM_MONTHS 12 

typedef struct EMP { 
    char name[MAX_NAME+1]; 
    int monthSales[NUM_MONTHS]; 
    int total; 
} Emp; 

數據和它的大小的全局初始化:

Emp *data;//where all entries are kept 
int empSize; 

和我已經構建2個陣列的Emp指針,我想以不同的順序參考數據:

Emp *nameArray[empSize];//an array of pointers to point to entries alphabetically 
Emp *salesArray[empSize]; //an array of pointers to pointing to entries by sales 

在他們被分配完畢後,我想用qsort來區別他們。 的nameArray按字母順序排列,使用該結構的名稱和 到最小的salesArray最大使用總的結構

我應該比較方法和快速排序參數是什麼樣子?

感謝

+0

這個功課?這看起來像我在教育工作時可能會遇到的問題。 – gbulmer 2012-03-23 21:11:52

+0

你的代碼是什麼樣的,它試圖對一個數組進行排序?你是否已經開始使用一系列'emp數據[empSize];'使它更易於理解它?我將從一系列結構開始,讓它工作,然後使用指針數組。然後編寫第二個比較函數,並使用secoond指針數組。 – gbulmer 2012-03-23 21:14:56

回答

3

你只需要定義兩個不同的比較功能。每個比較函數都應該有兩個指針無效(在這種情況下,您將它們轉換爲Emp **類型),然後返回負整數,零或正整數(如果第一個條目小於,等於或大於)第二個,分別。

對於基於總量的排序,您可以簡單地從第一個中減去第二個total。如果第一個總數小於第二個總數,則結果爲負數,而當第一個總數大於第二個總數時則相反。當它們相等時,返回零。

int compareByTotal(const void *first, const void *second) 
{ 
    int firstTotal = (*(Emp **)first)->total; 
    int secondTotal = (*(Emp **)second)->total; 

    return firstTotal - secondTotal; 
} 

第二個,因爲它是一個字符串比較,可以返回strcmp的值(服從相同的返回值慣例):通過這些

int compareByName(const void *first, const void *second) 
{ 
    const char *firstName = (*(Emp **)first)->name; 
    const char *secondName = (*(Emp **)second)->name; 

    return strcmp(firstName, secondName); 
} 

然後,你可以調用qsort函數名稱:

/* given: */ 
Emp *nameArray[empSize];//an array of pointers to point to entries alphabetically 
Emp *salesArray[empSize]; //an array of pointers to pointing to entries by sales 

/* use: */ 
qsort(nameArray, empSize, sizeof(*nameArray), &compareByName); 
qsort(salesArray, empSize, sizeof(*salesArray), &compareByTotal); 
1

對名稱進行排序的例子:

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_NAME 20 
#define NUM_MONTHS 12 

typedef struct EMP { 
    char name[MAX_NAME + 1]; 
    int monthSales[NUM_MONTHS]; 
    int total; 
} Emp; 

int compareName(const void * a, const void * b) 
{ 
    return (strcmp(((Emp*)a)->name, ((Emp*)b)->name)); 
} 

int main() 
{ 
    Emp *data; 
    int empSize = 100; 
    qsort(data, empSize, sizeof(Emp), compareName); 
    // qsort(data, empSize, sizeof(Emp), compareSales); 
    return 0; 
} 
+1

爲什麼使用'sizeof(int)'作爲'qsort()'的第三個參數? – 2012-03-23 21:23:01

+1

@PlatinumAzure,'size:數組中每個元素的字節大小' – perreal 2012-03-23 21:24:34

+1

技術上,在你的例子中元素是'Emp'(甚至不是指向它們的指針),但在OP的例子中它們是'Emp *'s 。這些不能保證與sizeof(int)相同,特別是在64位系統上。而且,只要使用'sizeof(* data)'就更安全了。這樣它就更加通用和麪向未來。 – 2012-03-23 21:26:02