본문 바로가기

코딩/c언어

[C언어] 구조체를 이용한 주소록 프로그램

고려사항

 

 

■∥ 출력 형태

이름        전화번호        주소                                    생일

홍길동    000-000-0000    대한민국                             x월x일

 

 

 

■∥ 주소록 프로그램의 기능

  1. 등록

  2. 출력

  3. 검색

  4. 삭제

  5. 종료

 

 

작동 개요

 

■∥ main : 구조체를 만들고 동적할당을 통해 주소록을 생성한다. 생성한 주소록에서 다음 주소록은 NULL로 초기화고 기능별로 함수를 작성하여 switch문을 통해 각각의 기능을 실행하게 된다.

 

■∥ Insert : 구조체에 데이터가 들어 있으면 다음 구조체로 이동하고, NULL값인 구조체에 동적 데이터를 할당한다. 할당한 구조체에 gets_s를 이용하여 데이터를 입력해주고 제어문을 통하여 계속 등록할지 여부를 판단한다.

 

■∥ Delete : 임시 구조체를 만들고 삭제할 사람의 이름을 입력받는다. while문과 if문을 조합하여 모든 구조체를 비교 범위로 포함시킨다. 검색은 strcmp를 이용하여 입력받은 이름과 등록되어있는 이름을 비교하는 방법을 이용한다. 같은 값을 찾게 되면 임시 구조체에 삭제할 구조체의 다음 구조체 내용을 넣어주고 메모리를 풀어준다. temp 값은 리턴해준다.

 

■∥ Display : '%-15s'처럼 공란을 삽입하여 출력하는 문자들을 정렬해주고, while문을 사용해 모든 구조체에 들어있는 데이터를 출력시켜준다.

 

■∥ Search : _name[15] 배열을 만들고, 찾을 사람의 이름을 입력받는다. 검색은 삭제에서 사용했던 while문과 if문의 조합을 이용한다. 같은 값을 찾으면 그 구조체의 데이터를 출력하게된다.

 

 

작업 소스

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
struct _addbook {
    char name[15];
    char phone[18];
    char address[50];
    char birthday[14];
    struct _addbook *link; 
};
typedef struct _addbook addbook;
 
void Insert(addbook*);   
void Delete(addbook*);
void Display(addbook*);
void Search(addbook*);
 
int main(void){
    addbook *ptr;
    int choice;
 
    ptr = (addbook *)malloc(sizeof(addbook));   
 
    ptr->link = NULL; 
    do {    
        printf("+------------+\n");
        printf("| 주  소  록 |\n");
        printf("+------------+\n");
        printf("|(1) 등   록 |\n");
        printf("|(2) 출   력 |\n");
        printf("|(3) 검   색 |\n");
        printf("|(4) 삭   제 |\n");
        printf("|(5) 종   료 |\n");
        printf("+------------+\n");
 
        printf("\n원하는 작업을 입력하십시오. : ");
        choice = getchar();
        fflush(stdin);
 
        switch (choice){
        case '1':
            printf("\n주소록 등록 작업입니다. 정보를 입력하십시오.\n");
            Insert(ptr);
            break;
        case '2':
            printf("\n주소록 출력 작업입니다. 현재 등록된 주소록은 아래와 같습니다.\n");
            Display(ptr->link);
            break;
        case '3':
            printf("\n주소록 검색 작업입니다. 정보를 입력하십시오.\n");
            Search(ptr);
            break;
        case '4':
            printf("\n주소록 삭제 작업입니다. 정보를 입력하십시오.\n");
            Delete(ptr);
            break;
        case '5':
            printf("\n종료합니다.\n");
            break;
        default:
            printf("\n잘못된 값을 입력하였습니다.\n");
        }
 
    } while (choice != '5');
}
 
 
 
 
 
void Insert(addbook *ptr){
    int re;
    while (ptr->link != NULL)
        ptr = ptr->link;    
 
    do{
        ptr->link = (addbook*)malloc(sizeof(addbook));   
        ptr = ptr->link;   
 
        printf("이름 : ");
        gets_s(ptr->name);
        printf("전화번호 : ");
        gets_s(ptr->phone);
        printf("주소 : ");
        gets_s(ptr->address);
        printf("생일 : ");
        gets_s(ptr->birthday);
        printf("\n|등록완료|\n");
 
        for (;;){
            printf("\n계속 등록하시겠습니까?(Y|N) : ");
            re = getchar();
            fflush(stdin);
            if (re != 'Y' && re != 'y' && re != 'N' && re != 'n'){
                printf("\n잘못된 값을 입력하였습니다.\n다시 입력하여 주십시오.\n\n");
                continue;
            }
            else
                break;
        }
    } while (re != 'n' && re != 'N');
 
    ptr->link = NULL;
    printf("\n");
}
 
 
void Delete(addbook *ptr){
    addbook *temp;
    char _name[15];
 
    printf("삭제할 사람의 성명 : ");
    gets_s(_name);
 
    while (ptr->link != NULL){
        temp = ptr;
        ptr = ptr->link;
 
        if (strcmp(_name, ptr->name) == 0){
            temp->link = ptr->link;
            free(ptr);
            break;
        }
    }
    return;
}
 
void Display(addbook *ptr){
    printf("|주소록|\n");
    printf("%-15s""성  명");
    printf("%-18s""전화번호");
    printf("%-50s""주  소");
    printf("%-14s\n""생  일");
 
    while (ptr != NULL){
        printf("%-15s", ptr->name);
        printf("%-18s", ptr->phone);
        printf("%-50s", ptr->address);
        printf("%-14s", ptr->birthday);
 
        ptr = ptr->link;
        printf("\n");
    }
    printf("\n");
}
 
 
void Search(addbook *ptr){
    char _name[15];
 
    printf("찾을 사람의 성명 : ");
    gets_s(_name);
 
    printf("\n|검색완료|\n");
    printf("%-15s""성  명");
    printf("%-18s""전화번호");
    printf("%-50s""주  소");
    printf("%-14s\n""생  일");
 
    while (ptr != NULL){
        if (strcmp(_name, ptr->name) == 0){
            printf("%-15s", ptr->name);
            printf("%-18s", ptr->phone);
            printf("%-50s", ptr->address);
            printf("%-14s", ptr->birthday);
            printf("\n\n");
        }
        ptr = ptr->link;
    }
}

 

 

도움받은 블로그 :(하늘과 나의 IT 이야기)http://promisej7.tistory.com/