반응형

지금까지 학습한 것을 토대로 하여 영화에 대한 정보를 연결 리스트로 저장하고 출력하는 프로그램을 작성하여 보자.


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 40
typedef struct NODE{
    char name[SIZE];
    int year;
    struct NODE *link;
}NODE;
int menu();
void add(NODE **list, NODE **prev);
void printing(NODE **list);
void exit1(NODE **list,NODE **next);
int main(void)
{
    int cho=0;
    NODE *list=NULL;
    NODE *p,*next,*prev;
    while((cho=menu())!=3){
    getchar();
    if(cho==1)
    {
        add(&list,&prev);
    }
    else if(cho==2)
    {
        printing(&list);
    }
    else if(cho==3)
    {
        exit1(&list,&next);
    break;
    }
    }
    return 0;
}
int menu()
{
    int men=0;
    printf("----------------------\n");
    printf("1. 영화 정보 추가\n");
    printf("2. 영화 정보 출력\n");
    printf("3. 종료\n");
    printf("----------------------\n");
    printf("번호를 선택하세요: ");
    scanf("%d",&men);
    return men;
}
void add(NODE **list, NODE **prev)
{
    NODE *p=NULL;
    p=(NODE*)malloc(sizeof(NODE));
        printf("영화의 제목을 입력하세요: ");
        gets(p->name);
        printf("영화의 개봉 연도를 입력하세요: ");
        scanf("%d",&(p->year));
        if(*list==NULL)
        {*list=p;}
        else
        {(*prev)->link=p;}
            p->link=NULL;
            *prev=p;
}
void printing(NODE **list)
{
    NODE *p=NULL;
    p=*list;
    while(p!=NULL)
    {
        printf("제목: %s\n",p->name);
        printf("년도: %d\n",p->year);
        p=p->link;
    }
}
void exit1(NODE **list,NODE **next)
{
    NODE *p=NULL;
    p=*list;
    while(p!=NULL)
    {
        *next=p->link;
        free(p);
        p=*next;
    }
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

전화 번호부 작성  (2) 2017.02.25
양의 정수 저장  (0) 2017.02.22
단어 입력 받기  (0) 2017.02.21
주소록 저장  (0) 2017.02.21
문자열 동적 메모리  (0) 2017.02.21
반응형

전화 번호부를 연결 리스트를 이용하여 만들어보자. 사용자가 전화 번호를 입력하면 연결리스트의 끝에 추가한다. 탐색 기능도 추가하라.


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 30
typedef struct NODE {
    char name[SIZE];
    char num[SIZE];
    struct NODE *link;
}NODE;
int menu();
void initialize(NODE **list, NODE **next);
void add(NODE **list, NODE **prev);
void search(NODE **next, NODE **list);
void exit1(NODE **next, NODE **list);
int main(void)
{
    NODE *list = NULL;
    NODE *prev, *next;
    int men = 0;
    prev = NULL; next = NULL;
    while ((men = menu()) != 4)
    {
        getchar();
        if (men == 1)
        {
            initialize(&list, &next);
        }
        else if (men == 2)
        {
            add(&list, &prev);
        }
        else if (men == 3)
        {
            search(&next, &list);
        }
    }
    exit1(&next, &list);
    return 0;
}
int menu()
{
    int a = 0;
    printf("연결 리스트를 이용한 전화 번호부 메뉴\n");
    printf("-------------------------\n");
    printf("1. 초기화\n");
    printf("2. 전화 번호 추가\n");
    printf("3. 전화 번호 탐색\n");
    printf("4. 종료\n");
    printf("-------------------------\n");
    scanf("%d"&a);
    return a;
}
void initialize(NODE **list, NODE **next)
{
    NODE *p;
    p = *list;
    while (p != NULL)
    {
        *next = p->link;
        free(p);
        p = *next;
    }
    printf("초기화가 완료되었습니다.\n");
}
void add(NODE **list, NODE **prev)
{
    NODE *p;
    p = (NODE*)malloc(sizeof(NODE));
    printf("이름: ");
    gets(p->name);
    printf("번호: ");
    gets(p->num);
    if (*list == NULL)
    {
        *list = p;
    }
    else
    {
        (*prev)->link = p;
    }
    p->link = NULL;
    *prev = p;
}
void search(NODE **next, NODE **list)
{
    NODE *p;
    char nam[SIZE];
    printf("찾을 이름: ");
    gets(nam);
    p = *list;
    while (p != NULL)
    {
        *next = p->link;
        if (strcmp(p->name, nam) == 0)
        {
            printf("전화 번호는 %s입니다.\n", p->num);
            break;
        }
        p = *next;
    }
}
void exit1(NODE **next, NODE **list)
{
    NODE *p;
    p = *list;
    while (p != NULL)
    {
        *next = p->link;
        free(p);
        p = *next;
    }
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

영화 목록 만들기  (2) 2017.02.25
양의 정수 저장  (0) 2017.02.22
단어 입력 받기  (0) 2017.02.21
주소록 저장  (0) 2017.02.21
문자열 동적 메모리  (0) 2017.02.21
반응형

길이가 100인 n개의 문자열을 저장하는데 필요한 동적 메모리를 할당해보자.


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
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int count=0;
    char **p=NULLint i;
    printf("문자열의 개수: ");
    scanf("%d",&count);
    p=(char**)malloc(sizeof(char*)*count);
    for(i=0;i<count;i++)
    {
        p[i]=(char*)malloc(sizeof(char)*100);
    }
    getchar();
    for(i=0;i<count;i++)
    {
    printf("문자열을 입력하세요: ");
    gets(p[i]);
    }
    printf("\n");
    for(i=0;i<count;i++)
    {
    puts(p[i]);
    }
    for(i=0;i<count;i++)
    {
    free(p[i]);
    }
    free(p);
    return 0;
}
cs

p에 동적메모리 할당할 때는 실제 메모리크기는 sizeof(char*) * count 이고
p[i]에 동적메모리 할당할 때 실제 메모리크기는 sizeof(char) * 100 이라는 것을 조심해야합니다.
p와 p[i]는 포인터인고 p[i]는 문자열을 가리키고 p는 문자열의 이름(즉 문자열의 주소)를 가리킵니다.
따라서 크기를 매우 조심해야합니다. 안그러면 오류가 발생합니다. (한마디로 2만큼 받아오고 4만큼 반납을 못시킨다는 말임)

참고 블로그 : http://bozeury.tistory.com/19




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

단어 입력 받기  (0) 2017.02.21
주소록 저장  (0) 2017.02.21
양의 정수들의 합  (0) 2017.02.21
명령어 라인으로 텍스트 파일 합치기  (0) 2017.02.18
단어 바꾸기  (0) 2017.02.18
반응형
문자열의 배열을 인수로 받아서 저장된 문자열을 전부 출력하는 pr_str_array() 함수를 작성하여 테스트하여 보자. pr_str_array()는 다음과 같은 원형을 가진다.
void pr_str_array(char **dp, int n);


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
#include <stdio.h>
#define SIZE 10
void pr_str_array(char **dp, int n);
int main(void)
{
    char *p[SIZE]={"넌 알 필요 없다!",
    "알 필요 없다고?",
    "하이구래! 하이구래!",
    "타즈딩고!",
    "둠 해머를 위하여!",
    "감사합니다!",
    "이게 아닌데..",
    "네 영혼에..",
    "용족들은 예의가 없단 말이야~",
    "바람이여~"};
    pr_str_array(p,SIZE);
    return 0;
}
void pr_str_array(char **dp, int n)
{
    char i;
    for(i=0;i<n;i++)
    {
    printf("%d번째 문자열 : %s\n",i,*(dp+i)); //포인터배열의 이름에서 크기만큼 증가시켜야함
    }
}



char *p[10] 이라고 선언을 했다면 각각의 배열 p[0]부터 p[9]는 포인터겠죠. 그렇기 때문에 배열의 이름 p가 이중포인터가 됩니다.

그래서 그 이중포인터인 배열의 이름 p에서 크기만큼 더해주면 모든 배열 포인터 (문자열의 배열)을 출력할 수가 있을 것입니다.

반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

내림차순 정렬  (0) 2017.01.06
가장 큰 값  (0) 2017.01.05
2차원 배열 합  (0) 2017.01.04
속담 선택기  (0) 2017.01.04
데이터베이스  (0) 2017.01.03

+ Recent posts