|
|
구조체 정렬 (struct, qsort)
등록자 : cpueblo (유광희), 2008-10-17
Intro
안녕하세요. cpueblo 입니다 ^^
qsort 를 이용한 구조체 정렬 방법을 소개합니다
qsort()
stdlib.h 이나 search.h 에 선언된 함수로 빠른 정렬을 제공합니다.
함수의 인자 형태는 void * 형태로 어떤 데이터 형이든 정렬을 가능하게 합니다.
void qsort(
void *base, // 정렬할 데이터
size_t num, // 인자 개수
size_t width, // 인자 크기
int (__cdecl *compare )(const void *, const void *) // 콜백 함수
);
소스
// 간단한 구조체를 선언합니다
typedef struct _MYSTRUCT
{
char *Name;
int Age;
} MYSTRUCT;
// 이름 정렬시 호출될 함수
int MyArrayNameCompare( const void *ItemPtr1, const void *ItemPtr2)
{
MYSTRUCT *Item1 = (MYSTRUCT *)ItemPtr1;
MYSTRUCT *Item2 = (MYSTRUCT *)ItemPtr2;
return strcmp(Item1->Name, Item2->Name);
}
// 이름(역순) 정렬시 호출될 함수
int MyArrayNameCompareDesc( const void *ItemPtr1, const void *ItemPtr2)
{
MYSTRUCT *Item1 = (MYSTRUCT *)ItemPtr1;
MYSTRUCT *Item2 = (MYSTRUCT *)ItemPtr2;
return !strcmp(Item1->Name, Item2->Name);
}
// 나이 정렬시 호출된 함수
int MyArrayAgeCompare( const void *ItemPtr1, const void *ItemPtr2)
{
MYSTRUCT *Item1 = (MYSTRUCT *)ItemPtr1;
MYSTRUCT *Item2 = (MYSTRUCT *)ItemPtr2;
return Item1->Age > Item2->Age;
}
// 나이(역순) 정렬시 호출될 함수
int MyArrayAgeCompareDesc( const void *ItemPtr1, const void *ItemPtr2)
{
MYSTRUCT *Item1 = (MYSTRUCT *)ItemPtr1;
MYSTRUCT *Item2 = (MYSTRUCT *)ItemPtr2;
return Item1->Age < Item2->Age;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 간단한 3개의 구조체 배열을 생성합니다
MYSTRUCT Array[3];
Array[0].Name = "갑돌이";
Array[0].Age = 50;
Array[1].Name = "순이";
Array[1].Age = 10;
Array[2].Name = "유광희";
Array[2].Age = 29;
// 배열의 개수 구하기
int ArrayCount = sizeof(Array) / sizeof(Array[0]);
//
// 이름으로 정렬
//
qsort( (void *)&Array, ArrayCount, sizeof(MYSTRUCT), MyArrayNameCompare );
printf ("[ 이름 정렬 ]\n");
for(int i = 0; i < ArrayCount; i++ )
printf("Name = %-10s, Age = %d\n", Array[i].Name, Array[i].Age);
//
// 이름으로 정렬 (역순)
//
qsort( (void *)&Array, ArrayCount, sizeof(MYSTRUCT), MyArrayNameCompareDesc );
printf ("[ 이름 정렬 (역순) ]\n");
for(int i = 0; i < ArrayCount; i++ )
printf("Name = %-10s, Age = %d\n", Array[i].Name, Array[i].Age);
//
// 나이로 정렬
//
qsort( (void *)&Array, ArrayCount, sizeof(MYSTRUCT), MyArrayAgeCompare );
printf ("[ 나이로 정렬 ]\n");
for(int i = 0; i < ArrayCount; i++ )
printf("Name = %-10s, Age = %d\n", Array[i].Name, Array[i].Age);
//
// 나이로 정렬 (역순)
//
qsort( (void *)&Array, ArrayCount, sizeof(MYSTRUCT), MyArrayAgeCompareDesc );
printf ("[ 나이로 정렬 (역순) ]\n");
for(int i = 0; i < ArrayCount; i++ )
printf("Name = %-10s, Age = %d\n", Array[i].Name, Array[i].Age);
return 0;
}
Output
[ 이름 정렬 ]
Name = 갑돌이 , Age = 50
Name = 순이 , Age = 10
Name = 유광희 , Age = 29
[ 이름 정렬 (역순) ]
Name = 순이 , Age = 10
Name = 유광희 , Age = 29
Name = 갑돌이 , Age = 50
[ 나이로 정렬 ]
Name = 순이 , Age = 10
Name = 유광희 , Age = 29
Name = 갑돌이 , Age = 50
[ 나이로 정렬 (역순) ]
Name = 갑돌이 , Age = 50
Name = 유광희 , Age = 29
Name = 순이 , Age = 10
Keywords
구조체 정렬
struct sort
구조체를 qsort 함수에 넘기는 방법
qsort 함수로 구조체 정렬하기
qsort() to sort an array of structures
qsort 함수로 구조체의 멤버를 정렬할때
http://codesarang.com. mail to cpueblo cpueblo.com
|
|