본문 바로가기
dev, tech/c, c++

단순 연결리스트를 이용한 명함 관리 프로그램

by 구띵 2006. 4. 14.

구조체와 같이 고정적인 길이를 갖는 자료를 디스크에 입출력하기 위한 함수의 선택

   -> fread() , fwrite() <stdio.h>

 

키보드로 자료를 입력 받기 위한 함수의 선택

   -> gets()<stdio.h>  or cgets() <conio.h> 

 

파일 열기, 닫기 함수

   -> fropen(), fclose() <stdio.h>

 

다른 내용들은 기존에 작성했던 함수들을 그대로 사용하면 된다.

----------------------------------------------------------------------------------------

 

/*
날짜 : 2006 / 4/ 14
제목 : 명함 관리
적용 알고리즘 : 단순 연결 리스트를 이용한 프로그램
                파일 입출력을 이용
*/

#include <stdio.h>
#include <conio.h>
#define NAME_MAX 10
#define COMPANY_MAX 35
#define PLUS_MAX (NAME_MAX + COMPANY_MAX)
/* gets()

키보드로부터 문자열을 입력 받는 함수
ENTER키에 의해 자동적으로 문자열에 종료 문자(NULL)을 붙여준다.

그러나, 입력되는 문자열의 길이를 제한할 수 없는 단점이 있다. 즉,
정해진 문자열의 길이를 넘도록 입력이 되면 에러가 발생

그래서, conio.h 에 있는 cgets()를 사용하면 된다.

// 연결리스트의 디스크 입출력

*/

typedef struct _node
{
    char name[NAME_MAX];
    char company[COMPANY_MAX];
    struct _node *next;
} node;

node *head, *tail;

void init_list();
void show_menu();
void select_job();
void input_card();
void show_list();
void write_card();
void read_card();
void delete_all();
node *search_card();
void delete_card();
void modify_card();

void init_list()
{
   
    head = (node *) malloc(sizeof(node));
    tail = (node *) malloc(sizeof(node));
   
    // 단순 연결리스트 이므로
    head ->next = tail;
    tail->next = tail;
   
    printf("initialize the list,...\n");
   
}
   
void show_menu()
{
    printf("---------------------------------------------------\n");
    printf("          simply linked list test program----------\n");
    printf("---------------------------------------------------\n");
    printf("------1. input the new name card-------------------\n");
    printf("------2. modify the name card----------------------\n");
    printf("------3. delete the name card----------------------\n");
    printf("------4. search the name card----------------------\n");
    printf("------5. delete all!-------------------------------\n");
    printf("------6. read the data file -----------------------\n");
    printf("------7. write to the data file--------------------\n");
    printf("------8. exit--------------------------------------\n");
    printf("------0. show the cuurent list---------------------\n");
    printf("---------------------------------------------------\n");
    printf("---------------------------------------------------\n");
    printf("---------------------------------------------------\n\n");
}
   
void select_job()
{
    int m;
   
    printf("select (1 ~ 8) : ");
    scanf("%d",&m);
   
    switch(m)
    {
        case 1: //input
            input_card();
            break;
        case 2: // modify
            modify_card();
            break;
        case 3: // delete
            printf("DELETE CARD\n");
            delete_card();
            break;
        case 4: //search
            printf("SEARCH CARD\n");
            search_card();
            break;
        case 5: // delete all
            delete_all();
            break;
        case 6: // read the data file
            read_card();
            break;
        case 7: // write to the data file
            write_card();
            break;
        case 8: // exit
            exit(-1);
        case 0: // show the current list
            show_list();
            break;
    }
}   

void delete_card()
{
    node *s,*t;
   
    s=search_card(); // 찾은 노드의 앞 원소를 가르키는 포인터를 변수에 저장
   
    if(s!=NULL){
        t=s->next; // t는 찾은 노드를 가르킴
       s->next = t->next;
       free(t);
       printf("deleted the card!");
    }
    else
        printf("return to the menu\n");
    
   
}

void modify_card()
{
   
   
   
   
}

node *search_card()
{
    char s[PLUS_MAX];
    node *t,*n;
    n=head;
    t=n->next;
   
    printf("input the name for search: ");
   
    scanf("%s",&s);
   
    //printf("DEBUG : %s",s);
   
    while((strcmp(s,t->name)!=0)&& t!=tail)
    {
        n=n->next;
        t=n->next;
    }
   
    if(t==tail)
    {
             printf("cannot find!\n");
             return NULL;
    }
    else
    {
        printf("here is...%s\n",t->name);
        return n; // 찾은 원소의 앞의 포인터를 반환
    }  
}

void read_card() //읽으면서 하나 일고 하나 삭제하고.....
{
    node *n,*s;
    FILE *p;
   
    // 파일 열기
    if((p=fopen("name_card.txt","rb"))==NULL)
    {
        printf("\n Error : Disk read failure\n");
       
        return;
    }
   
    delete_all(); //메모리상의 기존 모든 값을 삭제
   
    //이제 메모리에 적재하는 일만 남았다.
    s=head->next;
   
    while(1)
    {
    n=(node*)malloc(sizeof(node));
   
    if(!fread(n,PLUS_MAX,1,p))
        {
            free(n);
            break;
        }
    n->next = head->next;
    head->next = n;
    }
   
    fclose(p);
   
    }
   
void delete_all()
{
    node *t,*u;
   
    t=head->next;
   
    while(t!=tail)
    {
        u=t;
        t=t->next;
        free(u);
    }
   
    head->next = tail;
}  

void write_card(){
    node *n;
    FILE *p;
   
    if((p=fopen("name_card.txt","wb"))==NULL)
    {
        printf("\n Error : Disk write failure\n");
       
        return ;
    }
   
    n=head->next;
   
    while(n!=tail)
    {
        fwrite(n,PLUS_MAX,1,p);
        n=n->next;
    }
    fclose(p);
}
   
void show_list()
{
    node *t;
   
    t=head->next;
    printf("----------------------------------------------------------------\n");
    printf("-------- show the current list ---------------------------------\n");
    printf("----------------------------------------------------------------\n");
   
    while(t!=tail)
    {
        printf("%s | %s\n",t->name, t->company);
       
        t=t->next;
    }
   
    printf("---------------------------------- end of the list -------------\n");
   
}
   
void input_card()
{
    /*
    char name[10];
    char company[35];
    */
    node *n;
   
    n = (node *)malloc(sizeof(node));
    fflush(stdin);
    printf("INPUT CARD\n");
   
    printf("new name : ");
    gets(n->name);
   
    printf("new company: ");
    gets(n->company);
   
    n->next = head->next;
    head->next = n;
}

int main()
{
    init_list();
   
    while(1)
    {       
        show_menu();
        select_job();
    }
   
   
    system("PAUSE");
   
    return 0;
   
}

 

댓글