/***************************************************************************
*
* 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;
}
*
* 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 |