semiproject - 소스

Mokwon Univ 2008. 8. 16. 16:24
<list.c>
 
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "list.h"
int select1(void);
List yong;                            // List 선언 ( head와 tail 을 가지고 있다 list.h 참조)
int main()
{
     printf("nn리스트를 이용한 회원관리n");
     printf("2005.12.1 made by 용학,영훈n");
       
     list_init(&yong);              // List 초기화 시킴
     select1();                      // 메뉴함수시작
 
     return 0;
}
 
int select1(void)
{
     int input;
     while(1)                      // 특별한 입력이 올때까지 무한루프돌림, 메뉴를 계속 디스플레이 해줌
     {
          printf("----------------------n");
          printf(" 1 -> initn");
          printf(" 2 -> insertn");
          printf(" 3 -> removen");
          printf(" 4 -> printfn");
          printf(" 0 -> exitn");
          printf("----------------------n");
          printf(" input => ");
          scanf("%d",&input);
          switch(input)
          {
              case 1:
                   list_destroy(&yong);        // yong 이라는 List 파괴시키소
                   list_init(&yong);              // 다시 초기화시킴
                   break;
              case 2:
                   if((list_ins_next(&yong))!=0)            // 자료를 삽입할때 리턴값이 0이 나와야 정상..안나올경우 비정상종료
                   {
                        printf(" No No No insert");
                        return -1;
                   }
                   printf(" Yes Yes Yes insert n");       // 0 이 나왔을 경우 정상 종료
                   break;
              case 3:
                   list_rem_next(&yong);                      // 가장 마지막에 삽입한 자료 하나 삭제
                   break;
              case 4:
                   list_print(&yong);                             // 현재까지 있는 리스트안의 자료들을 프린트
                   break;
              case 0:
                   list_destroy(&yong);                         // 나갈때 할당된 메모리는 해제시키고 나감
                   return 0;
              default:
                   printf("try again..nn");                  // 잘못입력시 보여줌
                   break;
              }
       }
}
 

<list.h>
 
 
#ifndef LIST_H
#define LIST_H                               // 여러개의 헤더파일을 직접 만들어 사용할때 중복을 회피
#include <stdlib.h>
 
typedef struct ListElmt_{                  // 구조체 선언 name, tel 에 관한 char 포인터형
     char *name;
     char *tel;
     struct ListElmt_ *next;                 // 자기참조 구조체
}ListElmt;
 
typedef struct List_{                        // 구조체 선언 size 와 head, tail 을 가짐
     int  size;
     ListElmt *head;
     ListElmt *tail;
}List;
 
void list_init(List *list)                      // 초기화 시키는 함수, size는 0으로 하고 각각의 구조체 포인터는 NULL을 가진다
{
     list->size=0;
     list->head=NULL;
     list->tail=NULL;
}
 
void list_destroy(List *list)                // List를 삭제해주는 함수
{
     memset(list, 0, sizeof(List));      
}
 
int list_ins_next(List *list)
{
     char *addname;                        // name 과 tel 을 삽입할 포인터형 변수 선언
     char *addtel;
     ListElmt *new_element;             // 새로운 노드 선언

     if((new_element=(ListElmt *)malloc(sizeof(ListElmt))) == NULL)
          return -1;
     if((addname=(char *)malloc(sizeof(char)*20)) == NULL)
          return -1;
     if((addtel=(char *)malloc(sizeof(char)*20)) == NULL)
          return -1;                                                                  // 3개의 주소공간을 동적할당 시켜준다
 
     printf(" insert emp name => ");
     scanf("%s",addname);
     printf(" insert emp telephone => ");
     scanf("%s",addtel);                                                         // 2개의 변수에 값을 받아 오고

     new_element->name = (char *)addname;
     new_element->tel = (char *)addtel;                                  // 입력받은 값을 노드가 가리키고
     if(list->size==0)
         list->tail = new_element;                                             // 만약 첫번째 노드라면 tail이 새 노드를 가리킨다
     new_element->next = list->head;
     list->head = new_element;                                      // head가 가리키는 곳을 새 노드라 가리키고 새노드를 head가 가리킴

     list->size++;                                   // 사이즈 하나 증가
     return 0;
}
 
int list_rem_next(List *list)
{
     ListElmt *old_element;                          // 새노드 선언
     if(list->size==0)                                    // 크기가 0이면 지울 데이터가 없기 때문에 -1 리턴
          return -1;
     old_element = list->head;                      // head가 가리키는 곳을 새노드가 가리킨다
     list->head = list->head->next;               // head가 가리키는 노드의 next가 가리키는 곳을 head가 가리킨다
                                                               // 중간에 있는 노드는 사라진다..-_-
     if(list->size==1)                                    // 사이즈가 1개이면 더이상 데이터가 없어서 tail이 NULL을 가리킨다
          list->tail=NULL;
     free(old_element);                                // 중간매개체를 한 노드는 free 시켜준다
     list->size--;                                        // 사이즈 하나 줄어듬
     return 0;
}
 
void list_print(List *list)
{
     ListElmt *copy;                                   // 프린트 시켜주기 위한 노드 하나 생성
     copy = list->head;                               // head가 가리키는 곳을 copy가 가리킨다
     printf(" LIST");        
     while(copy != NULL)                           // copy 가 NULL을 가리키기 전까지 무한루프
     {
          printf(" --> %s,%s",copy->name,copy->tel);           // copy 가리키는 곳의 name 과 tel 을 프린트해준다
          copy = copy->next;                                              // copy가 가리키는 노드의 next가 가리키는 곳을 copy가 가리킨다
     }
     printf(" --> NULL n");
     return;
}

#endif
Posted by 용학도리
,