2012-03-23 1 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; 

및 of 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를 사용하여 다르게 정렬하려고합니다. 무엇을이 방법을 비교하고 qsort가 인수가 같아야합니다 구조체

총을 사용하여 구조체의 이름과 대소 salesArray 최대를 사용하여 알파벳 순으로 nameArray는?

감사

+0

이 숙제입니까? 그것은 내가 교육에서 일했을 때 내가 설정했을지도 모르는 일종의 질문처럼 보입니다. – gbulmer

+0

배열 중 하나를 정렬하려고하는 코드가 어떻게 생깁니 까? Em 데이터 [empSize]; 배열로 시작하여 주위를 둘러보기가 좀 더 쉬워 졌습니까? 구조체의 배열로 시작하여 포인터를 사용하십시오. 그런 다음 scond 비교 함수를 작성하고 포인터의 두 번째 배열을 사용하십시오. – gbulmer

답변

3

당신은 두 개의 서로 다른 비교 함수를 정의 할 필요가있다. 각 비교 함수는 void에 두 개의 포인터를 가져야합니다 (이 경우에는 Emp ** 유형으로 캐스팅 한 후 첫 번째 항목이보다 작거나 같거나 큰 경우 음수, 0 또는 양의 정수를 반환합니다) 둘째는 각각

전체 기반 정렬의 경우 첫 번째 것에서 두 번째 total을 뺍니다. 첫 번째 합계가 두 번째보다 작은 경우이 값은 음수가되고 첫 번째 합계가 두 번째 합계보다 클 경우 반대가 true입니다. 값이 같으면 0이 반환됩니다.

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()'의 세 번째 인수로 사용하고 있습니까? –

+1

@PlatinumAzure,'size : 배열의 각 원소의 크기 (바이트 단위) ' – perreal

+1

기술적으로, 예제에서 요소는'Emp's (그들에 대한 포인터조차도 아니다)이지만, OP의 예에서는'Emp *' . 그것들은 특히 64 비트 시스템에서'sizeof (int)'와 같은 크기가되는 것은 아닙니다. 또한 어쨌든'sizeof (* data) '를 사용하는 것이 훨씬 안전합니다. 그렇게하면 더 일반적이고 미래 지향적입니다. –