Programming Language/C2010. 10. 14. 20:17

SortLinkedList.c

 이름, 성별, 나이를 입력 및 출력 가능한 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
Posted by BLUE-NOTE