관리 메뉴

프로그램 소스

[C언어 소스] 콜백을 이용한 정렬 함수 구현 및 사용 예 본문

C언어/디딤돌 C언어 예제

[C언어 소스] 콜백을 이용한 정렬 함수 구현 및 사용 예

Only 프로그램 소스 언제나휴일 2016.12.04 19:31

[C언어 소스] 콜백을 이용한 정렬 함수 구현 및 사용 예


Program.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언어] 117. 콜백




0 Comments
댓글쓰기 폼