2016-09-16 78 views
0

我必須解決幾個C問題,其中大部分都涉及不得不在某處使用qsort(),但無論我從網上獲得多少幫助,都無法使其工作。 拿這個代碼,例如:如何實現qsort()來爲一個結構數組工作?

#include <stdio.h> 
#include <string.h> 
struct date 
{ 
    int day; 
    int month; 
    int year; 
};struct date d[5]={ 
    {12,12,2012}, 
    {23,02,2014}, 
    {31,01,2222}, 
    {32,21,2011}, 
    {12,01,1990} 
    }; 

int compare(const void * a, const void * b) 
{ 
    struct date *orderA = (date *)a; 
    struct date *orderB = (date *)b; 

    return ( orderA->year -orderB->year ); 
} 
int main() 
{ 
    int i; 
    qsort(d,5,sizeof(date),compare); 

    for(i=0;i<5;i++) 
    printf("%d %d %d\n",d[i].day,d[i].month,d[i].year); 
    return 0; 

} 

我得到的錯誤,日期是未申報的,即使它已經是。我根本無法理解比較函數,必須從網絡中複製它們。請幫幫我。我在大學的老師是一個完全的傻子。

+2

'的sizeof(結構日期)','還的#include ' – Kninnug

+1

並以'結構日期* orderA =(結構日期*)一個; '在比較函數中。 – Riley

+2

或使用'typedef struct date date;' – BLUEPIXY

回答

0

與您的代碼次要問題:你需要包括stdlib.h(用於qsort()),但你不使用你的榜樣string.h;您使用date作爲結構和類型,但未定義它 - 您可以通過typedef同時將它定義爲:如果你願意,你可以擴大你的比較年限。

代碼解決上述問題的返工:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct date { 
    int day; 
    int month; 
    int year; 
} Date; 

int compare(const void *a, const void *b) { 
    const Date *date_A = a; 
    const Date *date_B = b; 

    return date_A->year == date_B->year ? 
     date_A->month == date_B->month ? 
      date_A->day - date_B->day 
       : date_A->month - date_B->month 
        : date_A->year - date_B->year; 
} 

int main() { 

    Date dates[] = { 
     {12, 12, 2012}, 
     {23, 02, 2014}, 
     {31, 01, 2222}, 
     {32, 21, 2011}, 
     {12, 01, 1990} 
    }; 

    size_t count = sizeof(dates)/sizeof(Date); 

    qsort(dates, count, sizeof(Date), compare); 

    for (int i = 0; i < count; i++) { 
     Date *date = &dates[i]; 
     printf("%d %d %d\n", date->day, date->month, date->year); 
    } 

    return 0; 
} 
1

date不是一種類型。 struct date是。引用結構類型時,您需要使用struct關鍵字。

此外,如果將比較函數中的指針定義爲const,則不需要強制轉換。

const struct date *orderA = a; 
const struct date *orderB = b; 
+0

@overloood很高興我可以幫忙。如果您發現它有用,請隨時接受此答案。 – dbush