본문 바로가기
c언어

c언어 연결 리스트 응용해 보기(책 목록 관리 프로그램 만들기)

by 개발자 L 2023. 2. 28.
반응형

c언어 연결 리스트 응용해 보기(책 목록 관리 프로그램 만들기)

네 안녕하세요, 이번 포스팅에서는 연결 리스트를 응용해서 간단한 프로그램을 만들어보도록 하겠습니다.

연결 리스트로 자료 구조를 짜서 관리를 하는 경우가 정말 많으니까 잘 알아두셔야 합니다.

그럼 지금부터 시작하도록 하겠습니다.

 

1. 책 목록 관리 프로그램 작성하기

가장 많이 쓰이는 분야는 목록 관리 입니다.

연결 리스트로 관리를 하게 되면 관리가 정말 수월해지게 됩니다.

제가 바로 코드를 작성해서 보여드리도록 하겠습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define S_SIZE 50

typedef struct NODE
{
    char title[S_SIZE];
    int year;
    struct NODE* link;
}NODE;

int main()
{
    NODE* list = NULL;
    NODE* prev, * p, * next;
    char buffer[S_SIZE];
    int year;

    // 연결 리스트에 정보 입력
    while (1)
    {
        printf("책의 제목을 입력하세요 : (종료하려면 엔터)");
        gets_s(buffer, S_SIZE);

        if (buffer[0] == '\0')
        {
            break;
        }

        p = (NODE*)malloc(sizeof(NODE)); // 동적 메모리 할당

        strcpy(p->title, buffer);

        printf("책의 출판 연도를 입력하세요 : ");
        gets_s(buffer, S_SIZE);

        year = atoi(buffer);
        p->year = year;

        if (list = NULL)
        {
            list = p; // 리스ㅡ가 비어있으면 새로운 노드를 첫 노드로 만듦.
        }

        else
        {
            prev->link = p; // 노드가 비어 있지 않으면 새로운 노드를 이전 노드의 끝에 붙임.
        }

        p->link = NULL; // 새로운 노드의 링크 필드를 NULL로 설정
        prev = p;
    }

    printf("\n");

    // 연결 리스트에 있는 모든 정보 출력
    p = list;

    while (p != NULL)
    {
        printf("[%s, %d]->", p->title, p->year);

        p = p->link;
    }

    printf("\n");

    // 동적 할당 반납
    p = list;

    while (p != NULL)
    {
        next = p->link;

        free(p); // 동적 메모리 반납

        p = next;
    }

    return 0;
}

이렇게 작성을 했습니다.

그럼 실행 결과가 어떻게 되는가 보여드리겠습니다.

책의 제목을 입력하세요 : (종료하려면 엔터) 총, 균, 쇠
책의 출판 연도를 입력하세요 : 1997
책의 제목을 입력하세요 : (종료하려면 엔터) 갈매기의 꿈
책의 출판 연도를 입력하세요 : 갈매기의 꿈

[총, 균, 쇠, 1997]->[갈매기의 꿈 1970]

이런 식으로 나옵니다.

이제 이 코드에서 어떤 작업들이 수행이 되었는지 알려드리겠습니다.

 

1 - 1. 연결 리스트 생성하기

연결 리스트는 코드 내에 있는 while 루프를 이용하여 작성했습니다.

제목 대신에 엔터키를 누르면 프로그램이 종료가 되고,

그게 아니라면 책의 제목을 입력받습니다.

해당 코드는 아래와 같습니다.

    while (1)
    {
        printf("책의 제목을입력하세요 : (종료하려면 엔터)");
        gets_s(buffer, S_SIZE);

        if (buffer[0] == '\0')
        {
            break;
        ...
    }

이제 책 제목이 입력이 되었다면 malloc() 함수를 이용하여 구조체를 저장할 수 있는 동적 저장 공간을 할당받고,

이를 통해 구조체의 주소를 반환하고 해당 주소를 포인터 p에 저장합니다.

p = (NODE *)malloc(sizeof(NODE));

그다음에는 이 p를 통하여 사용자가 입력한 책의 제목을 복사하고,

사용자로부터 책의 제목을 입력받은 후, 이 역시 위와 같은 방법으로 복사합니다.

그리고 출판 연도는 정수형이기 때문에 atoi() 함수를 이용해서 문자열을 정수로 반환했습니다.

        strcpy(p->title, buffer);
        
        printf("책의 출판 연도를 입력하세요 : ");
        gets_s(buffer, S_SIZE);

        year = atoi(buffer);
        p->year = year;

이렇게 모든 정보가 저장이 되었다면 연결 리스트의 끝에 해당 노드를 연결합니다.

만일에 연결 리스트에 노드가 하나도 없는 상태라면 이 도는가 연결 리스트의 첫 번째 노드가 되어야 할 것이고,

노드가 있다면 그 노드에 연결이 됩니다.

해당 코드는 이렇습니다.

        if(list = NULL)
        {
            list = p; // 리스ㅡ가 비어있으면 새로운 노드를 첫 노드로 만듦.
        }

        else
        {
            prev->link = p; // 노드가 비어 있지 않으면 새로운 노드를 이전 도느의 끝에 붙임.
        }

이제 현재 처리하고 있는 구조체가 해당 연결 리스트의 꼬리 부분인 것을 표시하기 위해서 NULL로 설정해 줍니다.

p->link = NULL;

마지막으로 다음번의 반복 루프에서는 현재 구조체가 이전 구조체가 되기 때문에 p를 prev에 대입을 시켜줍니다.

prev = p;
반응형

 

1 - 2. 연결 리스트의 노드 방문하기

연결 리스트가 생성이 되면 보통 연결 리스트상의 노드들을 방문하면서 여러 가지 처리를 하게 됩니다.

해당 코드에서는 그냥 연결 리스트 상의 노드가 가지고 있는 값들만 출력했습니다.

제가 작성한 코드 내에서는 list가 헤드 포인터에 해당하므로, list를 p에 대입을 시킵니다.

p = list;

이 p는 연결 리스트의 첫 번째 노드를 가리키고 있으므로,

p가 가지고 있는 첫 번째 노드가 가지고 있는 정보들을 화면에 출력하게 됩니다.

    while(p != NULL)
    {
        printf("[%s, %d]->", p->title, p->year);
    }

두 번째 노드를 접근해서 출력해 주기 위해서는 첫 노드의 link에 두 번째 노드 주소가 저장되어 있습니다.

그래서 p->link를 while 루프 안에 대입을 해줍니다.

p = p->link;

이러고 나면 남은 주소가 없으므로 NULL이 나오면서 종료가 됩니다.

 

1 - 3. 연결 리스트의 노드 삭제하기

연결 리스트를 사용하고 나면 반드시 메모리를 반납해야 합니다.

    p = list;

    while(p != NULL)
    {
        next = p->link;

        free(p); // 동적 메모리 반납

        p = next;
    }

이 과정도 똑같이 NULL이 나올 때까지 반복합니다.

그리고 동적 메모리가 반납이 되면 p->link를 참조할 수 없게 되므로,

free()를 호출해 반납하기 전에 next 포인터에 저장합니다.

 

여기까지 연결 리스트를 응용해 봤습니다.

다음 포스팅에서는 동적 메모리를 이용해서 여러 가지 문제들을 풀어보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글