본문 바로가기

Native/C

[과제] selective_sort 2

/***************************************************************************
*
*        Date        : 2005-04-27
*        Copyright    : aucd29
*        E-mail        : aucd29@daum.net
*
*    
*
***************************************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define YES 1
#define NO 0

#define _ERR_MEMORY "메모리 생성 불가능"

typedef struct list {
    char *name;
    char sex;
    int age;
    struct list *nextp;
} LIST;

int inp(char *, char *, int *);
LIST *node(LIST *, char *, char, int);
void prn(LIST *);

//
// 추가 과제물
//
LIST *invert(LIST *);
LIST *selective_sort(LIST *);

int main(int argc, char *argv[])
{
    LIST *root;
    char in[20], sx;
    int ag;

    root = NULL;

    //while(inp(in, &sx, &ag) == NO)
    // root = node(root, in, sx, ag);
    
    sx = '1';
    root = node(root,"1",sx,3);
    sx = '2';
    root = node(root,"2",sx,6);
    sx = '3';
    root = node(root,"3",sx,5);
    sx = '4';
    root = node(root,"4",sx,1);
    sx = '5';
    root = node(root,"5",sx,2);
    sx = '6';
    root = node(root,"6",sx,7);

    puts("Name        Sex        Age\n");
    puts("--------------------------\n");
    prn(root);

    //
    // Append app : 2005-05-18
    // -------------------------------------
    // seletive sort
    // -------------------------------------
    //
    root = selective_sort(root);
    puts("------------- sort ----------");
    prn(root);

    //root = invert(root);
    //puts("------------- invert ----------");
    //prn(root);

    return 0;
}

//
// Type        : Recursive
// Return    : struct type
// 입력받은 이름,성별, 나이를 링크드 리스트 형식에 넣는다.
//
LIST *node(LIST *rp, char *nin, char nsx, int nag)
{
    if(rp == NULL)
    {
        char *temp = NULL;
        if(!(rp = (LIST *)malloc(sizeof(LIST))))
            puts(_ERR_MEMORY);
        if(!(temp = (char *)malloc(strlen(nin)+1)))
            puts(_ERR_MEMORY);

        strcpy(temp,nin);
        rp->name = temp;
        rp->sex = nsx;
        rp->age = nag;
        rp->nextp = NULL;
    }
    else rp->nextp = node(rp->nextp, nin, nsx, nag);

    return rp;
}

//
// x x x 입력받은 내용을 변수에 저장한다.
//
int inp(char *iin, char *isx, int *iag)
{
    printf("Name        Sex        Age -----> ");
    scanf("%s %c %d",iin, isx, iag);
    if(*iin == 'x')
        return (YES);
    return (NO);
}

//
// 링크드 리스트를 출력한다.
//
void prn(LIST *ps)
{
    for(; ps; ps = ps->nextp)
        printf("%-8s%-4c%d\n",ps->name, ps->sex, ps->age);
}

//
// 과제
// 해당 링크드 리스트를 역순화 시킨다.
//
LIST* invert(LIST *lead)
{
    LIST *trail, *middle;
    
    //
    // 초기화 작업으로 lead에 root->nextp 즉 두번째 위치(root->nextp)를 가르키고
    // 그 다음 middle에 첫번째(root)를 가르키게 한다음 trail은 null 값을 주고
    // root->nextp 는 \0 로 바꾼다.
    //
    middle = NULL;    

    while(lead)
    {        
        trail = middle;
        middle = lead;
        lead = lead->nextp;
        middle->nextp = trail;
    }

    return middle;
}

LIST* selective_sort(LIST *i)
{
    LIST *trail, *min, *j;

    // Null 이면 return
    if(i)
    {    
        min = j = i;
        while(j->nextp != NULL)
        {
            if(min->age > j->nextp->age)
            {
                min = j->nextp;
                trail = j;
            }
            j = j->nextp;
        }
        
        if(min == i)
            trail = j;
        else
        {
            j->nextp = i;
            i = min;
        }
        trail->nextp = NULL;

        i->nextp = selective_sort(i->nextp);
    }

    return i;
}

'Native > C' 카테고리의 다른 글

Tree swap  (0) 2013.10.02
Doubl Linked list  (0) 2013.10.02
a,b 내용을 c에 16비트씩 넣기  (0) 2013.10.02
[실습] double stack  (0) 2013.10.02
[실습] 커맨드 라인 아규먼트를 이용해서 텍스트에 문자열을 뒤집어라  (0) 2013.10.02