CodeSarang.Com
Home | 전체 메뉴 | 질문/답변 Join | Login | 검색   

 

구조체 정렬 (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 cpueblocpueblo.com