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

Linked_list_invert.c

 링크드 리스트를 사용하여 자료형을 만들고
입력, 출력 및 거꾸로 출력을 구현해 봅시다.

 

/*=======================================================================*/

/*    프로그램명 : Invert Root (Linked list.)      */

/*    - 이름 성별 나이를 입력하고 출력하는 링크드 리스트.
    - 마지막에 역순으로 다시 출력할것.       */
/*    - 이름의 첫번째 글자가 '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 *);      // 역순화 시켜주는 함수.

/*********************************************************************/
/*    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 Name  Sex   Age\n");
 printf(" -----------------------------------------------------\n");
 prn(root);        // root출력(입력된 순으로..)

 root=invert(root);      // 연결리스트를 역순화. ☆★
 printf(" --------------invert-------------\n");
 prn(root);        // 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("  %s    %c    %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;
}

 

 

 

이 글은 스프링노트에서 작성되었습니다.

'Programming Language > C' 카테고리의 다른 글

C Tutorial ([C.L.A] 저수준)  (0) 2010.10.14
C Tutorial ([C.L.A] 화일 생성)  (0) 2010.10.14
C Tutorial (트리 문자 읽기)  (0) 2010.10.14
_Mini_Project1_CALC  (0) 2010.10.14
C Tutorial (strcmp+numcmp)  (0) 2010.10.14
Posted by BLUE-NOTE