이름, 성별, 나이를 입력 및 출력 가능한 Linked List를 구현하였습니다.
다음 주석과 같은 조건을 만족 합니다.
/*=========================================================================================*/
/* 프로그램명 : Selective sort (Linked list.)
*/
/* - 이름 성별 나이를 입력하고 출력하는 링크드 리스트.
- 마지막에 나이순으로 다시 출력할것. */
/* = 최대 4개의 변수만 사용할것.
= maloc 사용하는 게 아님. */
/* (즉, 주어진 연결리스트에서 직접 변경(nextp)를 사용할것.)
= Select sort 참고 할것. */
/* - 이름의 첫번째 글자가 'x'가 나오면 입력 끝.
/*=========================================================================================*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define YES 1 // 입력이 끝났다는 표시.
#define NO 0 // 입력이 끝이 아님.
#define LIST struct list
/* 자체참조구문 리스트 선언. */
LIST {
char *name; // 이름.
char sex; // 성별.
int age; // 나이.
LIST *nextp; // next root.
};
/* 함수들. */
int inp(char *, char *, int *); // 데이터 입력받는 함수.
LIST *node(LIST *,char *, char, int); // 주소값 두개와 값을 인자로 받고 node를 생성하는 함수.
void prn(LIST *); // 출력 해주는 함수.
LIST *invert(LIST *); // 역순화 시켜주는 함수.
LIST *SelectSort(LIST *i); // Select sort 함수.(정렬 시켜주는 함수.)
/*********************************************************************/
/* main 함수.
/*********************************************************************/
int main(void){
LIST *root; // head 생성.
char in[20], sx; // 이름, 성별 변수선언.
int ag; // 나이 변수선언.
root=NULL; // 초기화.
printf("♠명함 리스트♠ \n 입력을 마칠시엔 이름 성별 나이에 x를 입력하세요.\n ");
while(inp(in, &sx, &ag)==NO) // 입력이 끝나기 전까지..
root=node(root, in, sx, ag); // node함수 호출. 노드를 생성.
printf("\n\tName\t\tSex\t\tAge\n");
printf(" -----------------------------------------------------\n");
prn(root); // root출력(입력된 순으로..)
// root=invert(root); // 연결리스트를 역순화. ☆★
// printf("\n --------------invert-------------\n");
// prn(root); // root출력(역순으로..)
printf("\n --------Select Sort of Age--------\n");
root=SelectSort(root);
prn(root);
return 0;
}
/*********************************************************************/
/* node함수.(node 생성)
/*********************************************************************/
LIST *node(LIST *rp, char *nin, char nsx, int nag){ // 루트, 이름, 성별, 나이.
if(rp==NULL) //루트가 없으면..
{
char *temp=NULL;
if( (temp=(char *)malloc(strlen(nin)+1))==NULL ) // 이름 저장할 temp생성.
{
printf("error\n");
exit(1);
}
strcpy(temp, nin); // temp에 nin(이름)을 입력.
if( (rp=(LIST *)malloc(sizeof(LIST)))==NULL )
{
printf("error\n");
exit(1);
}
rp->name = temp; // 연결리스트 이름 지정.
rp->sex = nsx; // 연결리스트 성별 지정.
rp->age = nag; // 연결리스트 나이 지정.
rp->nextp = NULL; // 연결리스트 넥스트 비움.
}
else
rp->nextp = node(rp->nextp, nin, nsx, nag);
return(rp);
}
/*********************************************************************/
/* inp함수.(data를 입력받는 함수)
/*********************************************************************/
int inp(char *iin, char *isx, int *iag){ // 저장될 이름, 성별, 나이.
printf("\nName Sex Age ----------> ");
scanf("%s %c %d", iin, isx, iag);
if(*iin=='x')
return(YES); // 입력 종료.
return (NO);
}
/*********************************************************************/
/* prn 함수.( 연결리스트를 출력 해주는 함수.)
/*********************************************************************/
void prn(LIST *ps){
for( ; ps; ps=ps->nextp) // ps(리스트)가 존재하는 한 계속 next를 호출.
printf("\t%s\t\t%c\t\t%d\n",ps->name, ps->sex, ps->age);
}
/*********************************************************************/
/* ☆★ invert 함수.(연결리스트를 역순화 시켜주는 함수.)
/*********************************************************************/
LIST *invert(LIST *lead){
LIST *trail, *middle;
middle = NULL;
while(lead)
{
trail = middle;
middle = lead;
lead = lead->nextp;
middle->nextp = trail;
}
return middle;
}
/*********************************************************************/
/* ☆★☆★ Select sort 함수.(정렬 시켜주는 함수.)
- 나이순 정렬.
/*********************************************************************/
LIST *SelectSort(LIST *i){
LIST *j, *min, *trail ; // i(기준포인터.) j(탐색포인터.) min(최소값.) trail(min의 앞노드.)
if(i==NULL)
return i;
trail=i;
j=i;
min=i;
while(j){ //j가 관건 마지막 수에 도달시 if문이 안돌아갈수있음
if((j->age)<(min->age)){
min=j;
}
j=j->nextp;
}
j=i;
while(j->nextp!=NULL){
if(j->nextp == min){
trail=j;
}
j=j->nextp;
}
printf("2 i=%2d min=%2d j=%2d t=%2d\n",i->age,min->age,j->age,trail->age);
if(i!=min)
{
(j->nextp)=i;
i=min;
trail->nextp=NULL;
}
i->nextp=(SelectSort(i->nextp));
printf("R. i=%2d min=%2d j=%2d t=%2d\n",i->age,min->age,j->age,trail->age);
return i;
}
이 글은 스프링노트에서 작성되었습니다.
'Programming Language > C' 카테고리의 다른 글
C Tutorial (tree SWAP) (0) | 2010.10.14 |
---|---|
C Tutorial (D.L_list QUE) (0) | 2010.10.14 |
C Tutorial (이중스택) (0) | 2010.10.14 |
_Mini_Project2_MAZE (0) | 2010.10.14 |
C Tutorial ([C.L.A] 저수준) (0) | 2010.10.14 |