공부중

[자료구조] 리스트(List) - 5 본문

Programing/자료구조

[자료구조] 리스트(List) - 5

곤란 2013. 1. 2. 16:04
반응형

 

앞 글에서 나온 소스를 설명 해보고자 한다.

 

먼저 앞의 소스코드에서 데이터를 담을 때 마다 동적으로 메모리를 잡아주고

필요 없을 시 삭제하고 하였다.

 

이것을 간단한 비유를 들어보자.

 

Node.h

#pragma once

 

class Node

{

public:

    Node();

    ~Node();

 

private:

 

    friend class CNodeManager;

    int nSaveNUM;

    Node *Next;

};

이 Node클래스를 화물 컨테이너에 비유를 해보자.

 

직접 그림을 그리긴 했지만 ..

기차가 맞으니 오해는 없길 바랍니다.

 

화물 컨테이너가 하나도 없을 때 기차의 모습은 이러할 것이다.

 

여기에 화물이 1개가 추가 되었을 때 이러한 모습일 것이다.

 

그리고 컨테이너 안에는 데이터가 들어가 있을 것이다.

 

 

또한 이 기차는 필요한 화물 량에 따라서 추가가 되고 삭제가 될 것이다.

 

 

따라서 위의 Node 클래스의 nSaveNUM 변수는 컨테이너 안에 물건을 넣듯 값을 저장할 수가 있고

Node형 포인터 Next는 위의 기차가 줄줄이 이어진 것처럼 바로 다른 Node를 가리킬 수 있다.

 

필요할 때 마다 화물을 연결하고 컨테이너 안에 물건을 넣고 연결한다

필요할 때 마다 Node형 클래스의 객체(이하 노드)를 하나씩 동적으로 할당하여 줄줄이 연결한다.

 

 

이러한 개념이 이해가 되었으면 삽입 부분을 살펴보자

NodeManager.h

#pragma once

 

#include "Node.h"

 

enum eChoiceMenu

{

    eInsert = 1,

    eDel,

    ePrint,

    eExit,

};

 

class CNodeManager

{

public:

    CNodeManager();

    ~CNodeManager();

 

    int Start();

 

    void PrintNode();                    //노드 출력

    

 

private:

 

    friend Node;

    Node *Head;

    Node *Tail;

 

    void InsertNode();                    //노드 삽입

    void DeleteNode();                    //노드 삭제

 

    void AllDelete();                    //모든 노드 삭제

 

    int GetData();                    //노드에 들어갈 데이터 받기

 

};

먼저 노드들을 관리할 노드매니저 클래스다.

 

여기서 Head와 Tail에서 (노드의 머리와 노드의 꼬리)

Head는 해당 리스트의 머리부분(맨 앞 부분)을 가리키는 포인터 변수이다.

Tail은 해당 리스트의 꼬리부분(맨 뒷 부분)을 가리키는 포인터 변수이다.

 

 

NodeManager.cpp - void CNodeManager::InsertNode()

void CNodeManager::InsertNode()

{

    Node *newNode = new Node;

    newNode->nSaveNUM = this->GetData();

 

    if( NULL == this->Head )

    {//헤드가 NULL일 경우 (아무런 노드가 없을 경우)

        this->Head = newNode;    

    }

    else

    {//Tail은 항상 마지막 노드를 가리키므로...

        this->Tail->Next = newNode;

    }

 

    this->Tail = newNode;    

    //노드 추가후 Tail을 마지막 노드를 가리키게 설정

 

}

이 부분이 노드매니저의 노드 삽입부분이다.

 

현재 Head와 Tail은 이렇게 NULL을 가리키고 있다.

 

첫번째 노드가 추가 될 때를 살펴보면

1. Node *newNode = new Node;

newNode->nSaveNUM = this->GetData();

 

 

2. if( NULL == this->Head )

{//헤드가 NULL일 경우 (아무런 노드가 없을 경우)

    this->Head = newNode;    

}

 

 

 

3. this->Tail = newNode;    

 

그리고 두번째 이후의 노드 추가를 살펴보면 ..

 

 

1. Node *newNode = new Node;

newNode->nSaveNUM = this->GetData();

 

2. else

{//Tail은 항상 마지막 노드를 가리키므로...

    this->Tail->Next = newNode;

}

 

3. this->Tail = newNode;    

 

이 그림들을 보고 삽입부분에 대한 이해를 마치고

다음글에서 데이터 조회 및 삭제부분을 살펴 보겠습니다.

반응형