2012-11-14 9 views
10

Biorąc pod uwagę tablicę struktur (w C), próbuję wydrukować wyniki w grupach płci iw podrzędnej kolejności według kolejności numerycznej. Na przykład:sortowanie elementów tablicy struktur

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

powiedzieć, że określenie tablicę struktury tak:

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

Jak mogę iść o drukowaniu wyników jak

1234 Matt 
1235 Josh 


2345 Jessica 

Odpowiedz

15

Musisz zaimplementować funkcję sortowania, który porównuje konstrukcjom jak wymagają

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 */ 
} 

a następnie użyć qsort z biblioteki standardowej.

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

Wewnątrz porównać funkcjonować może chcesz sprawdzić id są równe, wówczas można sortować według nazw (również z wykorzystaniem strcmp()) jednak chcesz.

Ken

Edit: Właśnie skompilowany i stałe to. Oto mały program testowy

#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); 
    } 

Z wyjściem:

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

Myślę, że chcemy "podrzędność według porządku numerycznego". – dreamcrash

+0

Oto pewien rodzaj wyłączonego pytania, ale powiedz, że definiuję funkcję. Jak przekazać informacje o pracownikach do tej funkcji? – bardockyo

+0

Jeśli ktoś ma problem ze zrozumieniem tego, może odwołać się do https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/qsort.htm –

2

Użyj swojego ulubionego algorytm sortowania na struct szyk. Porównując dwa elementy tablicy, aby zdecydować, która jest "większa", porównaj ich rodzaje; jeśli płeć jest taka sama, porównaj ich liczby. (Możesz chcieć zdefiniować oddzielną funkcję, aby wykonać to porównanie, aby wszystko było bardziej zrozumiałe.) Następnie wydrukuj posortowaną tablicę po kolei, używając żądanego formatowania. Śledź, kiedy płeć zmienia się z mężczyzny na kobietę, dzięki czemu możesz umieścić dodatkowe trzy nowe linie, tak jak w twoim przykładzie.

Edytuj: aby pożyczyć bezwstydnie od kallikak, możesz po prostu przekazać swoją funkcję porównywania do qsort, ale niech zwróci 1, jeśli jedna struktura jest "większa", -1 jeśli jest "mniejsza" i (jeśli to konieczne) 0, jeśli to jest to samo (stosując procedurę opisaną powyżej). Spójrz na How to write a compare function for qsort from stdlib?, aby uzyskać pomoc dotyczącą pisania niestandardowej funkcji porównywania.

+0

Dziękuję za odpowiedź. Zastanawiałem się, jak sprawdzić również płeć podczas korzystania z algorytmu sortowania. Na przykład mówię, że używam quicksort jeśli right bardockyo

+0

Zobacz metodę porównania w moim przykładzie. Możesz sprawdzić dowolne z pól w strukturze, podejmując decyzję o zamawianiu. – kallikak

0

Pomyśl łatwiej zrozumieć, jak jestem słaby wskaźnik, nadzieję, że pomoże ............

#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); 
}