C++

[강의] 12월 4일 수업정리

k-codestudy 2024. 12. 5. 03:06

LinkedList에 대한 수업을 들었다.

 

 

1. 연결 리스트 ( LinkedList )

1.1 ArrayList와의 차이점

 

1.1.1 메모리 관리

  • ArrayList: 메모리 크기를 미리 지정하고, 필요 시 배열 크기를 조정한다.
  • LinkedList: 메모리 크기를 미리 정하지 않고, 데이터가 추가될 때마다 동적으로 메모리를 할당한다.

1.1.2 구조

  • ArrayList: 연속된 메모리 블록에 데이터를 저장하며, 인덱스를 통해 빠르게 접근 가능하다.
  • LinkedList: 노드로 구성되며, 각 노드는 데이터와 다음 노드를 가리키는 포인터를 포함한다.

1.1.3 인덱스 접근

  • ArrayList는 인덱스를 통해 데이터에 직접 접근 가능하다.
  • LinkedList도 특정 구현에서 인덱스를 사용할 수 있지만, 실제로는 순차적으로 노드를 따라가며 데이터를 찾는다.

 

1.2 LinkedList 설명

 

1.2.1 구조적 특징

  • LinkedList는 헤드 노드(시작점)만 알고 있으며, 나머지 노드들은 포인터로 연결된다.
  • 따라서 특정 데이터를 찾으려면 처음부터 순차적으로 탐색해야 한다.

1.2.2 검색 효율

  • 데이터 검색은 순차 탐색 방식으로 이루어지며, 효율이 떨어진다.
  • 하지만 삽입 및 삭제는 특정 위치에서 수행할 경우 효율이 좋다.

1.2.3 사용 사례

  • 데이터의 순서가 중요하지 않거나, 삽입 및 삭제가 빈번히 발생하는 경우 적합하다.
  • 특정 상황에서는 Queue, Stack 같은 자료 구조로도 사용 가능하다.

1.2.4 한계

  • 순차 탐색만 가능하다는 점에서 검색 효율이 낮다.
  • 따라서, 순회가 필수적인 경우에만 LinkedList의 사용이 권장된다.

 

1.3 LinkedList 구현 

 

1.3.1 간단 구현 

// LinkedList.h
#pragma once
#include <stdio.h>

class C_LINKEDLIST
{
private:
	struct S_NODE
	{
		int nData;
		S_NODE* pNext;
	};
private:
	S_NODE* m_pBegin;
private:
	S_NODE* createNode(int nData);
public:
	C_LINKEDLIST() = default;
	void pushBack(int nData);
	void print();
};

// LinkedList.cpp
#include "linkedlist.h"

C_LINKEDLIST::S_NODE* C_LINKEDLIST::createNode(int nData) // 정의가 없다고 하는데 S_NODE는 struct안에있으니 네임스페이스를 붙여야한다 C_LINKEDLIST:: 이거 누구인지에 대한 것 

{
    S_NODE* pNode = new S_NODE{};
    pNode->nData = nData;
    pNode->pNext = nullptr;
    
    return pNode;
}

void C_LINKEDLIST::pushBack(int nData)
{
    if (!m_pBegin)
    {
        m_pBegin = createNode(nData);
        return;
    }

    S_NODE* pNode = m_pBegin;
    while (pNode->pNext)
    {
        pNode = pNode->pNext;
    }
    pNode->pNext = createNode(nData);
}

void C_LINKEDLIST::print()
{
    S_NODE* pNode = m_pBegin;
    
    while (pNode)
    {
        printf("%d ", pNode->nData);
        pNode = pNode->pNext;
    }
    printf("\n");
}

// main.cpp
#include <iostream>
#include "linkedlist.h"

int main()
{
    C_LINKEDLIST cList{};

    cList.pushBack(1);
    cList.pushBack(2);
    cList.pushBack(3);
    cList.pushBack(4);
    cList.pushBack(5);

    cList.print();
}

 

 

1.3.2  완성본 

// LinkedList.h
#pragma once
#include <stdio.h>

class C_LINKEDLIST
{
private:
	struct S_NODE
	{
		int nData;
		S_NODE* pNext;
	};
private:
	S_NODE* m_pBegin;
	S_NODE* m_pEnd;
private:
	S_NODE* createNode(int nData);
public:
	C_LINKEDLIST() = default;
	void pushBack(int nData);
	void pushFront(int nData);
	void print();
};

// LinkedList.cpp
#include "linkedlist.h"

C_LINKEDLIST::S_NODE* C_LINKEDLIST::createNode(int nData)
{
    S_NODE* pNode = new S_NODE{};
    pNode->nData = nData;
    pNode->pNext = nullptr;
    
    return pNode;
}

//void C_LINKEDLIST::pushBack(int nData) // 요약하지 않은 코드 
//{

//    if (!m_pBegin)
//    {
//        m_pBegin = createNode(nData);
//        m_pEnd = m_pBegin;
//        return;
//    }
//    m_pEnd->pNext = createNode(nData);
//    m_pEnd = m_pEnd->pNext;
//}

void C_LINKEDLIST::pushBack(int nData) // 요약, 완전
{
    S_NODE* pNode = createNode(nData);

    if (!m_pBegin)
        m_pBegin = pNode;
    else
        m_pEnd->pNext = pNode;
   
    m_pEnd = pNode;
}

void C_LINKEDLIST::pushFront(int nData) // 앞에서 삽입
{
    S_NODE* pNode = createNode(nData);
    if (!m_pBegin)
        m_pEnd = pNode;
    else
        pNode->pNext = m_pBegin;

    m_pBegin = pNode;
}

void C_LINKEDLIST::print()
{
    S_NODE* pNode = m_pBegin;
    
    while (pNode)
    {
        printf("%d ", pNode->nData);
        pNode = pNode->pNext;
    }
    printf("\n");
}

// main.cpp
#include <iostream>
#include "linkedlist.h"

int main()
{
    C_LINKEDLIST cList{};

    cList.pushBack(1);
    cList.pushBack(2);
    cList.pushBack(3);
    cList.pushBack(4);
    cList.pushBack(5);

    cList.print();
}