[C언어 소스] 콜백을 이용한 정렬 함수 구현 및 사용 예
소스 코드
#pragma warning(disable:4996)
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
typedef int (*Compare)(void *,void *); //비교한 결과를 반환하는 함수 포인터 정의
typedef struct _Stu Stu;
#define MAX_NAME_LEN 20
struct _Stu
{
int num;
char
name[MAX_NAME_LEN+1];
};
void StuSut(Stu *stu, int num,const char *name);
Stu *NewStu(int num,const char *name)
{
Stu *stu = (Stu *)malloc(sizeof(Stu));
StuSut(stu,num,name);
return stu;
}
void StuSut(Stu *stu, int num,const char *name)
{
stu->num = num;
memset(stu->name,0,sizeof(stu->name));
strncpy(stu->name,name,MAX_NAME_LEN);
}
void DeleteStu(Stu *stu)
{
free(stu);
}
void StuView(Stu *stu)
{
printf("번호:%d 이름:%s\n",stu->num,stu->name);
}
void BubbleSort(void **base,int asize,Compare compare)
{
void *temp;
int i = 0;
for( ;
asize>1 ;asize--) //정렬해야 할 사이즈가 1개 이상이라면 반복
{
for( i=1; i<asize ;i++)//비교해야 할 인덱스가 asize보다 작다면
{
if(compare(base[i-1], base[i])>0) // 앞의 요소가 더 클 때
{
//두 개의 요소를 교환
temp = base[i-1];
base[i-1] = base[i];
base[i] = temp;
}
}
}
}
int CompareByNum(Stu *stu1,Stu *stu2)
{
return
stu1->num - stu2->num;
}
int CompareByName(Stu *stu1,Stu *stu2)
{
return
strcmp(stu1->name,stu2->name);
}
int main()
{
Stu *arr[4]={0,};
int i = 0;
arr[0] = NewStu(3,"홍길동");
arr[1] = NewStu(11,"강감찬");
arr[2] = NewStu(6,"김구");
arr[3] = NewStu(8,"을지문덕");
BubbleSort(arr,4,CompareByNum);
printf("번호순\n");
for(i=0;i<4;i++)
{
StuView(arr[i]);
}
printf("이름순\n");
BubbleSort(arr,4,CompareByName);
for(i=0;i<4;i++)
{
StuView(arr[i]);
}
for(i=0;i<4;i++)
{
DeleteStu(arr[i]);
}
return 0;
}
실행 결과
번호순
번호:3 이름:홍길동
번호:6 이름:김구
번호:8 이름:을지문덕
번호:11 이름:강감찬
이름순
번호:11 이름:강감찬
번호:6 이름:김구
번호:8 이름:을지문덕
번호:3 이름:홍길동
본문
'C언어 > 디딤돌 C언어 예제' 카테고리의 다른 글
[C언어 소스] 함수 포인터 변수를 사용하는 예 (0) | 2016.12.04 |
---|---|
[C언어 소스] 장르별 도서 관리 프로그램 (0) | 2016.12.04 |
[C언어 소스] 회원 구조체 배열을 파일에 쓰기 및 읽기 테스트 (0) | 2016.12.04 |
[C언어 소스] fscanf_s 함수로 파일에서 입력받기 (0) | 2016.12.04 |
[C언어 소스] fscanf_s 함수로 키보드에서 입력받기 (0) | 2016.12.04 |