✨컴공주✨ [1052682] · MS 2021 (수정됨) · 쪽지

2022-06-26 01:09:37
조회수 127

컴공 일기89

게시글 주소: https://orbi.kr/00057316993

#include <stdio.h>

#include <stdlib.h>


struct Node

{

    int Data;

    struct Node* NextNode;


    //단방향 연결 리스트

};


Node* SLL_CreateNode(int NewData)

{

    Node* NewNode = (Node*)malloc(sizeof(Node));

    //자동 메모리가 아니라 자유 저장소 쪽으로 관리하는 것이 당연한 미덕이다.


    NewNode->Data = NewData;

    NewNode->NextNode = NULL;


    return NewNode;

}


void SLL_DestroyNode(Node* Node)

{

    free(Node);

}


void SLL_AppendNode(Node** Head, Node* NewNode)

{

    if ((*Head) == NULL)

    {

        *Head = NewNode;

    }

    else

    {

        Node* Tail = *Head;

        while (Tail->NextNode != NULL)

        {

            Tail = Tail->NextNode;

        }


        Tail->NextNode = NewNode;

    }

}


Node* SLL_GetNodeAt(Node* Head, int Location)

{

    //자유 저장소에서 메모리가 관리되고 있다는 사실을 명심, 또 명심! (malloc을 사용했으므로)

    Node* Current = Head;


    while (Current != NULL && (--Location) >= 0)

    {

        Current = Current->NextNode;

    }


    return Current;

}


int main()

{

    Node* List = NULL;

    Node* NewNode = NULL;

    Node* GetNode = NULL;


    NewNode = SLL_CreateNode(117);

    SLL_AppendNode(&List, NewNode);


    NewNode = SLL_CreateNode(119);

    SLL_AppendNode(&List, NewNode);


    GetNode = SLL_GetNodeAt(List, 1);

    printf("%d\n", GetNode->Data);

}


어디가서 코딩 좀 한다고 하려면, 눈감고 만들줄 알아야 하는 기초적인 C언어 주소록 예제가 되겠습니다.

여러가지 고민해 볼 것들이 많습니다만... 아무래도 메모리가 어떻게 관리되고 있는지를 명확히 알아야 처음부터 끝까지 명백한 채로 코딩을 할 수 있을 겁니다. 이게, malloc 함수를 왜 써야만 하는가에 대한 물음을 못하면, 구현할 때 segmentation fault를 낼 거예요. 한 5월 말 즈음 컴공 일기에 구현한 주소록인데, 탐색 기능만 아주 간단하게 추가한 것입니다. 다만, 앞서 말했듯 메모리를 관리하는 방식에 대한 이해가 중요한 것이지요. 이 맥락만 알고 있으면  주소록 탐색, 삭제, 추가...웬만한 기능들을 오류없이 구현할 수 있을 겁니다.



0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.