다중리스트를 사용하여 만들어본 인사관리 프로그램입니다.
/*===========================================================================================*/
/* § 회사 직원 정보 리스트 프로그램.§
/* 1. 다중 리스트(multilist)사용.
2. 키값(ID번호), 이름을 제외한 각 필드는 인덱스 테이블을 둔다.
/* 3. 필드의 정보를 한정하지 말고, 변경, 추가 할수 있어야 한다.
4. 새로운 필드를 추가 할수 있어야 한다.
/* ∴ 삽입, 삭제, 정보 변경, 필드 추가, 출력 가능.
/*===========================================================================================*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_DATA_SIZE 100
#define END 0
#define CONTINUE 1
typedef struct data_node
{
int field_type;
char *data;
struct data_node *eq_up;
struct data_node *eq_down;
struct data_node *left;
struct data_node *right;
}d_node;
d_node *head; // dummy node
d_node *f_head; // field dummy node
int id=0; // id_number
int f_type=0; // field의 일련번호.
/*========================함 수 들=======================================*/
void put_menu(void); //메뉴 출력 함수.
d_node *addman(d_node* root); //사람 추가 함수.
void print_node(void); //출력 함수.
d_node *insert_data(d_node *next); //사람의 데이타 필드 정보를 입력.
void data_link(d_node *root); //데이터를 연결.
void mod_data(void); //데이터를 수정.
void add_field(void); //필드 추가 함수.
d_node *talloc(void); //노드 동적 할당 함수.
int getword(char *word, int );
void del_node(void);
/*=========================================================================*/
/* main 함수
/*=========================================================================*/
int main(void){
d_node *root;
d_node *fld;
d_node *fld_prev;
int ch,c,n=0;
int k=CONTINUE;
// char word[MAX_DATA_SIZE];
char *w;
// head (에러를 방지하고 시작점을 알려주는 dummy node)
head=talloc();
head->data=NULL;
head->field_type=-1;
head->eq_up = NULL;
head->eq_down = NULL;
head->left = NULL;
head->right = NULL;
root=head;
//head의 eq_down이 id 1인 첫번째 사람임을 알려주는 것.
f_head=talloc();
f_head->data=NULL;
f_head->field_type=0;
f_head->eq_up = NULL;
f_head->eq_down = NULL;
f_head->left = NULL;
f_head->right = NULL;
// f_root=f_head;
fld=f_head->eq_down;
fld=talloc();
w="NAME";
fld->data=(char *)malloc(strlen(w)+1);
strcpy(fld->data,w);
fld->field_type=++f_type;
fld->eq_up=f_head;
fld->eq_down=NULL;
fld->left=NULL;
fld->right=NULL;
f_head->eq_down=fld;
fld_prev=fld;
fld=fld->eq_down;
fld=talloc();
w="ADRESS";
fld->data=(char *)malloc(strlen(w)+1);
strcpy(fld->data,w);
fld->field_type=++f_type;
fld->eq_up=fld_prev;
fld_prev->eq_down=fld;
fld->eq_down=NULL;
fld->left=NULL;
fld->right=NULL;
while(k!=END){
put_menu();
// printf("%s",man->data);
printf("숫자를 입력하시오(1~6):");
// ch = c = 0;
while((c=getchar())!='\n')
ch=c;
switch(ch){
case '1'://추가
printf("사람을 추가 합니다. \n");
// while(getword(word,MAX_DATA_SIZE)!=EOF)
root = addman(root);
break;
case '2'://삭제
del_node();
break;
case '3'://필드추가
add_field();
break;
case '4'://데이타 수정
mod_data();
break;
case '5'://출력
print_node();
break;
case '6'://종료
k=END;
printf("이용해 주셔서 감사합니다.");
break;
}
getchar();
system("cls");
}
printf(" 제작: ♨J.S_PRODUCT♨\n");
return 0;
}
/***********************************************************************/
/* 메뉴 출력 함수.
/***********************************************************************/
void put_menu(void)
{
puts(" ┌─────────────────────────────────────┐");
puts(" │ │");
puts(" │ § Data field program § │");
puts(" │ │");
puts(" │ ▶ 원하는 메뉴를 입력하세요. │");
puts(" │ │");
puts(" │ ▶ 1.사람추가 2.사람삭제 3.필드추가 4.데이타 수정 5.출력 6.종료 │");
puts(" │ │");
printf(" │ -현재 입력된 사람수: %d -현재 입력된 필드수: %d │\n",id,f_type);
puts(" └─────────────────────────────────────┘");
puts("");
}
/***********************************************************************/
/* addman (사람 추가 함수.)
/* 사람 추가 함수. 아이디넘버는 char형으로 data*에..
/*
/***********************************************************************/
d_node *addman(d_node* root){
d_node *next;
d_node *up;
d_node *prev;
d_node *man_data;
char w[MAX_DATA_SIZE];
int cnt;
next=root->eq_down;
//1. 노드 생성 부분.
printf("id번호 입력: ");
getword(w,MAX_DATA_SIZE);
if(root!=head)
{
up=root;
while(up->eq_up)
{
if((strcmp(up->data,w))==0){
printf("이미 사용중인 번호입니다. 다시 시도해주십시오.\n");
return root;
}
up=up->eq_up;
}
}
if((next=talloc())==NULL){
printf("error\n");
exit(1);
}
if((next->data = (char *)malloc(strlen(w)+1))==NULL)
{
printf("error ");
exit(1);
}
next->eq_up=root;
root->eq_down=next;
id++;
strcpy(next->data,w);
next->field_type=0;
next->eq_up=root; //아래 위 노드 연결.
next->eq_down=NULL;
next->left=NULL;
next->right=NULL;
//2. 데이터 필드 생성 부분.
prev=next; // prev는 man_data의 전(옆)노드이다.
man_data=next->right;
for(cnt=1; cnt<=f_type; cnt++) //f_type이 있는 만큼...
{
man_data=talloc();
prev->right=man_data;
man_data->left=prev;
man_data->eq_up=NULL;
man_data->eq_down=NULL;
man_data->right=NULL;
man_data->field_type=cnt;
prev=man_data;
man_data=man_data->right;
}
next=insert_data(next); // next의 오른쪽 필드에 데이터 입력.
return next;
}
/***********************************************************************/
/* 삭제 함수..
/***********************************************************************/
void del_node(void)
{
// int ch;
char word[MAX_DATA_SIZE];
d_node *man;
d_node *parent;
d_node *fld;
d_node *prev;
printf("삭제하실 아이디번호를 입력해주세요. : ");
getword(word,MAX_DATA_SIZE);
man=head->eq_down;
parent=head;
while(man)
{
fld=man->right;
if((strcmp(man->data,word))==0)
{
while(fld)
{
prev=fld;
fld=fld->right;
free(prev);
}
break;
}
man=man->eq_down;
parent=parent->eq_down;
}
if(man!=NULL){
parent->eq_down=man->eq_down;
prev=man->eq_down;
if(prev)
prev->eq_up=parent;
free(man);
}
id--;
printf("삭제 되었습니다.");
}
/***********************************************************************/
/* 출력 함수..
/***********************************************************************/
void print_node(void){
d_node *man;
d_node *fdata;
d_node *fld;
fld=f_head->eq_down;
man=head->eq_down;
printf("ID\t");
while(fld)
{
printf("\t%s\t",fld->data);
fld=fld->eq_down;
}
printf("\n--------------------------------------------------------------------------------\n");
while(man)
{
printf("%s\t",man->data);
fdata=man->right;
while(fdata){
printf("\t%s\t",fdata->data);
fdata=fdata->right;
}
puts("");
man=man->eq_down;
}
}
/*************************************************************/
/* getword.
/* -한계값을 준 getchar.
/*************************************************************/
int getword(char *word, int i)
{
int cnt=0;
//printf("입력하시오. 종료시엔 ctrl+z\n");
while((*(word+cnt)=getchar())!= ' ' && *(word+cnt) != '\n')
{
if(cnt==( MAX_DATA_SIZE-1)){
printf("단어의 크기가 초과했습니다.\n");
exit(1);
}
if(*(word+cnt)==EOF)
return *(word+cnt);
cnt++;
}
if(cnt<1){
printf("입력이 되지 않으셨습니다.다시 시도해주십시오.");
return 0;
}
*(word+cnt)='\0';
//printf("%s",word);
return *(word+cnt);
}
/***********************************************************************/
/* 사람의 데이타 필드 정보를 입력..
/***********************************************************************/
d_node *insert_data(d_node *next){
char word[MAX_DATA_SIZE]; // data를 입력받을 배열.
d_node *fld; //fld;
d_node *Nright;
d_node *temp;
printf("insert_data시작\n");
Nright = next->right; // field node들.
fld = f_head->eq_down; // field영역의 dummy node아래로...
temp = next;
//1. Data 입력.
printf("Data를 입력해주세요.\n");
while(fld){
printf("%s :",fld->data);
getword(word,MAX_DATA_SIZE);
Nright->data=(char *)malloc(strlen(word)+1); // 사람 지도 노드에 data저장.
strcpy(Nright->data,word);
temp->right=Nright;
Nright->left=temp;
Nright->field_type=fld->field_type;
temp=Nright;
Nright=Nright->right;
fld=fld->eq_down;
}
return next;
}
/***********************************************************************/
/* 데이터를 연결.
/***********************************************************************/
void data_link(d_node *root){
d_node *fld;
d_node *man;
d_node *dta;
d_node *down;
d_node *link;
//root=head->eq_down;
fld=f_head->eq_down;
man=root;
man=man->right;
while(fld)
{
dta=fld->right;
while(dta)
{ //dta의 정보를 가진것 다 연결.
down=man;
link=dta;
while(down){
if(dta->data==down->data)
{
link->eq_down=down;
down->eq_up=link;
link=down;
}
down=down->eq_down;
}
dta=dta->right;
}
fld=fld->eq_down;
man=man->right;
}
}
/***********************************************************************/
/* 데이터를 수정.
/***********************************************************************/
void mod_data(void)
{
int ch=0,cnt=0;
char word[MAX_DATA_SIZE];
char Dword[MAX_DATA_SIZE];
d_node *man;
d_node *fld;
printf("수정할 사람의 ID를 입력해주세요. :\n");
getword(word,MAX_DATA_SIZE);
man=head->eq_down;
while(man)
{
if((strcmp(man->data,word))==0)
{
fld=man->right;
printf("%d번 %s \n",man->data,fld->data);
cnt++;
break;
}
man=man->eq_down;
}
if(cnt==0){
printf("\n error : 그런 이름은 없습니다.\n");
return;
}
else
{
while(fld)
{
printf("%d.%s ",fld->field_type,fld->data);
fld=fld->right;
}
printf("\n수정할 필드의 번호를 입력하시오. :");
/* while(((c=getchar())!=' ') || (c != '\n'))
{
ch=c-'0';
ch+=cnt;
cnt=10*ch;
}*/
scanf("%d",&ch);
fld=man->right;
while(fld)
{
if(fld->field_type==ch)
break;
fld=fld->right;
}
getchar();
printf("새로 삽입할 데이터를 입력하시오. :");
getword(Dword,MAX_DATA_SIZE);
fld->data=(char *)malloc(strlen(Dword)+1);
strcpy(fld->data,Dword);
printf("\n 수정되었습니다.");
}
}
/***********************************************************************/
/* 필드 추가 함수.
/***********************************************************************/
void add_field(void)
{
d_node *fld;
d_node *n_fld; // 새로 생성될 필드
d_node *man;
d_node *data;
d_node *n_data;
char word[100];
fld=f_head->eq_down;
while(fld->eq_down)
fld=fld->eq_down;
n_fld=fld->eq_down;
n_fld=talloc();
n_fld->field_type=++f_type;
printf("추가할 필드명을 입력해주세요.:");
getword(word,MAX_DATA_SIZE);
n_fld->data=(char *)malloc(strlen(word)+1);
strcpy(n_fld->data,word);
n_fld->eq_up=fld;
fld->eq_down=n_fld;
n_fld->eq_down=NULL;
n_fld->left=NULL;
n_fld->right=NULL;
// 사람들의 우측노드 추가(뉴필드)
man=head->eq_down;
while(man)
{
data=man->right;
while(data->right)
data=data->right;
n_data=data->right;
n_data=talloc();
n_data->right=NULL; //좌우 연결
n_data->left=data;
n_data->eq_up=NULL;
n_data->eq_down=NULL;
n_data->field_type=f_type;
n_data->data=NULL;
data->right=n_data;
man=man->eq_down;
}
}
/***********************************************************************/
/* talloc (노드 동적 할당 함수.)
/***********************************************************************/
d_node *talloc(void){ //노드 동적 할당 함수.
return (d_node *)malloc(sizeof(d_node));
}
이 글은 스프링노트에서 작성되었습니다.
'Programming Language > C' 카테고리의 다른 글
C Tutorial (배열이용 Heaptree) (1) | 2010.10.14 |
---|---|
C Tutorial (tree 삽입삭제swap출력) (0) | 2010.10.14 |
C Tutorial (tree SWAP) (0) | 2010.10.14 |
C Tutorial (D.L_list QUE) (0) | 2010.10.14 |
C Tutorial (L_list 선택정렬) (2) | 2010.10.14 |