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

2022-09-18 11:55:33
조회수 5,027

컴공 일기185

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

더블 포인터로 구현하는 링크드 리스트도 좋지만, 사실 이건 별 쓸 데가 없다고 봐야할 뿐더러, 성능의 문제나 코드의 직관성 측면에서도 더블 포인터를 남발하면 끝장난다. 따라서, 일단 전역변수 g_Head라는 노드를 만들어주고, 이 노드 뒤에 추가하는 방식으로 자료를 관리한다면, 코드의 직관성은 물론이고, 가독성도 높일 수 있다. 이렇게 되면, Node** 라는 더블포인팅을 할 이유가 아예 사라지니까. 


이 기법도 충분히 숙달되면 좋을 듯 싶다.


#include <stdio.h>

#include <stdlib.h>


typedef struct Node

{

    char szData[64];

    struct Node* NextNode;

}Node;


/*전역변수로 헤드를 선언해준다*/

Node* g_Head = NULL;


/*연결리스트 전체 노드 출력 함수*/

void PrintList(void)

{


    Node* Head = g_Head;

    while (Head != NULL)

    {

        printf("[%p] %s, next[%p]\n", 

            Head, Head->szData, Head->NextNode);

        Head = Head->NextNode;

    }

}


/*노드를 추가하는 함수*/

int InsertNewNode(char* pszData)

{

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

    

    /*기본적으로 memset으로 메모리 초기화를 꾀했다*/

    memset(pNode, 0, sizeof(Node));

    strcpy_s(pNode->szData, sizeof(pNode->szData), pszData);


    if (g_Head == NULL)

        g_Head = pNode;


    else {

        

        pNode->NextNode = g_Head;

        g_Head = pNode;

    }

    return 1;

}


int main()

{


    //List 테스트를 위한 코드

    InsertNewNode("TEST01");

    InsertNewNode("TEST02");

    InsertNewNode("TEST03");


    PrintList();

    return 0;

}


실행결과 : 


[0000027A05CAA550] TEST03, next[0000027A05CA3540]

[0000027A05CA3540] TEST02, next[0000027A05CA5190]

[0000027A05CA5190] TEST01, next[0000000000000000]

0 XDK (+0)

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