✨컴공주✨ [1052682] · MS 2021 · 쪽지

2022-09-19 03:09:34
조회수 1,420

컴공 일기186

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

스택, 큐, 리스트 등등... 오늘 자료구조만 하루 종일 만졌더니 뇌가 인텔 CPU가 된 기분입니다.

이제 그만하고 자야겠습니다. 



#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;

    }


    putchar('\n');

}


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

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 FindData(char* pszData)

{

    Node* pTmp = g_Head;

    while (pTmp != NULL)

    {

        if (strcmp(pTmp->szData, pszData) == 0)

            return 1;

        pTmp = pTmp->NextNode;

    }


    return 0;

}

//전반적 소감 : 더미 헤드를 추가하지 않으면 삭제할 노드의 전 노드를 찾아야 하는 노가다가 발생한다.

int DeleteData(char* pszData)

{

    Node* pTmp = g_Head;

    Node* pPrev = NULL;

    while (pTmp != NULL)

    {

        if (strcmp(pTmp->szData, pszData) == 0)

        {   

            //탐색 데이터를 헤드 노드가 안 갖고 있는 경우

            if (pPrev != NULL)

            {

                pPrev->NextNode = pTmp->NextNode;

            }


            //탐색 데이터를 헤드 노드가 갖고 있는 경우

            else

            {

                g_Head = pTmp->NextNode;

            }

        

            free(pTmp);

            return 1;

        }


        

        pPrev = pTmp;

        pTmp = pTmp->NextNode;

        

        

    }

}


void ReleaseList(void)

{

    Node* pTmp = g_Head;

    while (pTmp != NULL)

    {

        /*반복문 안에서 변수 선언하면 안 되지 않아? -> 최근엔 조금 애매해지긴 해졌다. 컴파일러 최적화 과정!*/

        Node* pDelete = pTmp;

        pTmp = pTmp->NextNode;


        printf("Delete: [%p] %s\n", pDelete, pDelete->szData);

        free(pDelete);

    }

}


int main()

{

    


    //List 테스트를 위한 코드

    InsertNewNode("TEST01");

    InsertNewNode("TEST02");

    InsertNewNode("TEST03");


    

    

    if (FindData("TEST01") == 1)

        printf("FindData(): TEST01 found\n");

    if (FindData("TEST02") == 1)

        printf("FindData(): TEST02 found\n");

    if (FindData("TEST03") == 1)

        printf("FindData(): TEST03 found\n");

    

    DeleteData("TEST01");

    DeleteData("TEST02");

    PrintList();


    ReleaseList();


    return 0;

}


0 XDK (+0)

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