2012-11-14 109 views
10

給定一個結構數組(在C中)我試圖按數字順序按性別和子順序打印結果。例如:結構數組的排序成員

struct employee{ 
char gender[13] 
char name[13]; 
int id; 
}; 

說我定義結構數組,像這樣:

struct employee info[2]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 

我怎麼能去打印結果像

1234 Matt 
1235 Josh 


2345 Jessica 

回答

15

你需要實現的結構比較分揀功能,你需要

int compare(const void *s1, const void *s2) 
{ 
    struct employee *e1 = (struct employee *)s1; 
    struct employee *e2 = (struct employee *)s2; 
    int gendercompare = strcmp(e1->gender, e2->gender); 
    if (gendercompare == 0) /* same gender so sort by id */ 
    return e1->id - e2->id; 
    else 
    return -gendercompare; /* the minus puts "male" first as in the question */ 
} 

然後用快速排序標準庫中。

qsort(data, count, sizeof(struct employee), compare); 

裏面的比較功能你可能要檢查的ID都是平等的,那麼你可以通過名稱(也使用strcmp())你喜歡的排序。

編輯:剛剛編譯和解決這個問題。這裏有一個小測試程序

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

    struct employee{ 
     char gender[13]; 
     char name[13]; 
     int id; 
    }; 

    int compare(const void *s1, const void *s2) 
    { 
     struct employee *e1 = (struct employee *)s1; 
     struct employee *e2 = (struct employee *)s2; 
     int gendercompare = strcmp(e1->gender, e2->gender); 
     if (gendercompare == 0) /* same gender so sort by id */ 
     return e1->id - e2->id; 
     else 
     return -gendercompare; 
    } 

    main() 
    { 
     int i; 
     struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 

     for (i = 0; i < 3; ++i) 
     printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); 

     qsort(info, 3, sizeof(struct employee), compare); 

     for (i = 0; i < 3; ++i) 
     printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); 
    } 

隨着輸出:

$ ./a.exe 
1234 male Matt 
2345 female Jessica 
1235 male Josh 
1234 male Matt 
1235 male Josh 
2345 female Jessica 
+1

我想我們想要「按數字順序的子順序」 – dreamcrash

+0

下面是一個問題,但我說定義一個函數。我如何將員工信息的內容傳遞給該功能? – bardockyo

+0

如果有人對此有所瞭解,請參閱https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/qsort.htm –

2

的結構使用您喜愛的排序算法陣列。比較數組中的兩個元素來決定哪個是「更大」時,比較它們的性別;如果性別相同,則比較他們的數字。 (您可能想要定義一個單獨的函數來執行此比較,以使事情更清晰。)之後,使用所需的格式按順序打印排序後的數組。跟蹤性別從男性轉移到女性的時間,以便您可以添加額外的三個換行符,如您的示例中所示。

編輯:從kallikak無恥地借用,你可以將你的比較函數傳遞給qsort,但是如果一個結構是「較大」則返回1;如果是「較少」則返回-1;如果需要則返回0它是一樣的(使用我上面概述的程序)。看看How to write a compare function for qsort from stdlib?以獲得編寫自定義比較函數的幫助。

+0

謝謝你們的迴應。我想知道如何在使用排序算法時檢查性別。例如,假設我正在使用quicksort,如果right bardockyo

+0

請參閱我的示例中的比較方法。您可以在決定訂購時檢查結構中的任何字段。 – kallikak

0

認爲這是比較容易理解,因爲我在指針很微弱,希望它有助於............

#include<bits/stdc++.h> 

using namespace std; 


struct employee{ 
    char gender[13]; 
    char name[13]; 
    int id; 
}; 

bool compare(employee s1,employee s2) 
{ 
    return s1.id<s2.id; 
} 

main() 
{ 
    int i; 
    struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 
    sort(info,info+3,compare); 
    for (i = 0; i < 3; i++) 
    printf("%d\t%s\t%s\n",info[i].id,info[i].gender,info[i].name); 
}