링크드 리스트를 사용하여 자료형을 만들고
입력, 출력 및 거꾸로 출력을 구현해 봅시다.
/*=======================================================================*/
/* 프로그램명 : 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 |