임베디드 개발(before)/IoT 임베디드 SW 개발자 양성과정

[22일차] 연결리스트(Linked List) & 스택(Stack)

주운녕 2020. 8. 11. 20:10

오늘은 연결리스트와 스택에 대해 강의가 진행되었다.

진도가 워낙 빠르게 나가다 보니, 따라가기가 어려웠다.

다행이 이전에 책으로 읽어둔 부분이라 개념적인 이해는 어렵지 않았지만, C로 직접 구현하는 부분은 남아서 자습해가며 거의 따로 공부했다.

스택부분도 다시 봐야하는데 오늘 업로드하기에는 시간이 부족하다.

따라서 오늘 이해한 부분까지인 단일 링크드 리스트까지만 업로드를 하고, 스택에 관한 공부는 따로 해야겠다..

 

진도가 워낙 빠르게 나가다 보니, 진도에 맞춰 공부내용을 모두 흡수해가며 따라가기에는 시간적인 한계가 있다..

게다가 그 내용을 블로그에 정리하려다 보니 날 것 그대로 정리되는 것은 둘째치고, 정리하느라 공부를 하지 못하는 것 같아 시간이 아깝다. 그렇다고 기록를 포기할 수는 없지만...

 

결국에는 시간을 좀 더 효율적으로 사용해야된다!!

수업시간에 최대한 이해를 하기위해 집중하자!!

수업이 끝난 뒤에는 알고리즘 문제 공부와, 그날 배운 내용을 정리하며 보내야 한다! 

수업내용에 대한 이해를 자습시간에 해버리면 밀리기 시작한다. 최대한 수업시간에 이해해서 흡수해버리기!!

또 매일 최소 30분!! 이력서를 작성하자!! 그냥 이력서 파일을 30분 동안 펴놓기만 해도 되니까 일단 시작하자!!

 

 

 

다음 코드는 단일 연결리스트를 C로 구현한 코드이다.

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

typedef struct _node{
    int data;
    struct _node *next;
} Node;

 Node *g_pHead;

 Node *CreateNode(int data);

 Node *Find(int data);

 void PushBack(Node *pNew);

 void PushFront(Node *pNew);

 Node *Insert(Node *pTarget, Node *pNew);

 void PopFront();

 void Popback();

 void Erase(Node *pTarget);

 void __print_list(void);

 int main(void) {

     Node *pCur = NULL;

    //노드 5개 연달아 추가
    pCur = Insert(g_pHead, CreateNode(10));
    pCur = Insert(pCur, CreateNode(20));
    pCur = Insert(pCur, CreateNode(30));
    pCur = Insert(pCur, CreateNode(40));
    pCur = Insert(pCur, CreateNode(50));

    __print_list();

    Erase(Find(20));
    Erase(Find(40));

    Erase(Find(77));
    PopFront();     
    PopFront();
    PopFront();
    PopFront();
    Popback();

    __print_list();

    //모든 노드 삭제
    while(g_pHead != NULL)
        PopFront();

     return 0;
 }

 Node *CreateNode(int data)
 {
     Node *pNode = (Node *)malloc(sizeof(Node));
     pNode->data = data;
     pNode->next = NULL;
     return pNode;
 }
 
 Node *Find(int data)
 {
     Node *p = g_pHead;

     while(p != NULL)
     {
         if(p->data == data)
            return p;

            p=p->next;
     }
     return NULL;
 }
 void PushBack(Node *pNew)
 {
     if(pNew == NULL)
        return;
        if(g_pHead == NULL)
        {
            g_pHead = pNew;
            return;
        }
        Node *p = g_pHead;

        while(p->next != NULL)
        p=p->next;
        p->next = pNew;
 }

 void PushFront(Node *pNew)
 {
     if(pNew == NULL)
        return;
    if(g_pHead == NULL)
        g_pHead = pNew;

        pNew->next = g_pHead;
        g_pHead = pNew;
 }

 Node *Insert(Node *pTarget, Node *pNew)
 {
     if(pNew == NULL)
        return NULL;
    if(pTarget == NULL)
    {
        PushBack(pNew);
        return pNew;
    }
    pNew->next = pTarget ->next;
    pTarget->next=pNew;

    return pNew;
 }

 void PopFront()
 {
     if(g_pHead == NULL)
        return;
    Node *pNext = g_pHead->next;
    free(g_pHead);
    g_pHead = pNext;
 }

 void Popback()
 {
     if(g_pHead == NULL)
        return;

    if(g_pHead->next == NULL)
    {
        free(g_pHead);
        g_pHead = NULL;
        return;
    }

    Node *p = g_pHead;
    while(p->next->next != NULL)
        p=p->next;

    free(p->next);
    p->next = NULL;
 }

 void Erase(Node *pTarget)
 {
     if( (g_pHead == NULL) || (pTarget == NULL))
        return;

    if(pTarget == g_pHead)
        PopFront();
    
    else if(pTarget->next == NULL)
        Popback();
    else
    {
        Node *pPre = g_pHead;
        while(pPre->next != pTarget)
            pPre = pPre->next;

        pPre->next = pTarget->next;
        free(pTarget);
    }
 }
 

 void __print_list(void)
 {
     Node *p = g_pHead;
     while(p)
     {
         printf("%d ", p->data);
         p = p->next;
     }
     printf("\n");
 }

 

 

출력 화면

 


* 개인적인 학습 목적으로 작성한 글이기에 내용에 잘못된 정보가 있을 수 있습니다.