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

DataList.c

다중리스트를 사용하여 만들어본 인사관리 프로그램입니다. 

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

/*    § 회사 직원 정보 리스트 프로그램.§

/*    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
Posted by BLUE-NOTE