공부중

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

Programing/자료구조

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

곤란 2013. 1. 2. 13:47
반응형

 

앞 글에서 문제가 된 정적인 배열로는 필요로 하는 메모리 크기에 대해서 바로 바로 대처가 불가능했다.

 

그러한 문제 해결로 동적인 메모리 구성으로 된 소스를 보자

 

구조는 다음과 같다

 

 

소스코드

Node.h

#pragma once

 

class Node

{

public:

    Node();

    ~Node();

 

private:

 

    friend class CNodeManager;

    int nSaveNUM;

    Node *Next;

};

Node.cpp

#include <iostream>

 

#include "Node.h"

 

Node::Node()

{

    std::cout<<"노드 생성자"<<std::endl;

 

    this->nSaveNUM = 0;                //저장할 값 초기화

 

    this->Next = NULL;                //다음노드를 가리킬

    std::cout<<"Next값 NULL로 초기화 완료"<<std::endl;

}

 

Node::~Node()

{

    std::cout<<"노드 소멸자"<<std::endl;

}

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();                    //노드에 들어갈 데이터 받기

 

};

NodeManager.cpp

#include <iostream>

 

#include "Node.h"

#include "NodeManager.h"

 

 

CNodeManager::CNodeManager()

{

    std::cout<<"CNodeManager 생성자"<<std::endl;

 

    Head = NULL;

    Tail = NULL;

 

    std::cout<<"Head와 Tail NULL로 초기화 완료"<<std::endl;

}

 

CNodeManager::~CNodeManager()

{

    std::cout<<"CNodeManager 소멸자"<<std::endl;

}

 

int CNodeManager::Start()

{

    int nGetMenu = 0;

 

    while( true )

    {

        std::cout<<"메뉴를 선택해 주세요"<<std::endl;

        std::cout<<"1. 추가 2. 삭제 3. 출력 .4 종료"<<std::endl;

        std::cin>>nGetMenu;

        switch (nGetMenu)

        {

        case eInsert:

            this->InsertNode();

            break;

 

        case eDel:

            this->DeleteNode();

            break;

 

        case ePrint:

            this->PrintNode();

            break;

 

        case eExit:

            this->AllDelete();

            return eExit;

 

        default:

            std::cout<<"잘못 선택하였습니다 다시 선택해 주세요"<<std::endl;

            break;

        }

 

    }

}

 

int CNodeManager::GetData()

{

    int nGetNumber = 0;

 

    std::cout<<"저장할 숫자를 입력해 주세요"<<std::endl;

    std::cin>>nGetNumber;

 

    return nGetNumber;

 

}

 

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을 마지막 노드를 가리키게 설정

 

}

 

void CNodeManager::DeleteNode()

{

    if( NULL == this->Head )

    {//노드가 하나도 없을 경우

        std::cout<<"노드가 존재하지 않습니다."<<std::endl;

    }

    else

    {

        Node *TempNode = Head->Next;    //Head가 가리키는 다음을 복사(처음의 다음부분)

        std::cout<<Head->nSaveNUM<<"값 삭제 시도...";

        delete Head;                    //Head가 가리키는 맨 처음을 삭제

        std::cout<<"삭제 성공"<<std::endl;

        Head = TempNode;                //이것으로 Head는 삭제전 부분의 다음 부분을 가리킴

    }

}

 

void CNodeManager::PrintNode()

{

    if( NULL == Head )

    {

        std::cout<<"노드가 없습니다."<<std::endl;

    }

    else

    {

        int nCount = 1;

 

        Node *TempNode = Head;

        while ( NULL != TempNode )

        {

            std::cout<<nCount<<"번째 값 : "<<TempNode->nSaveNUM<<std::endl;

            nCount++;

            TempNode = TempNode->Next;

        }

    }

}

 

void CNodeManager::AllDelete()

{

    std::cout<<"모두 삭제 시작"<<std::endl;

    while ( NULL != Head )

    {//Head가 NULL일때 모든 노드가 삭제 됨

        this->DeleteNode();

    }

}

main.cpp

#include <iostream>

 

#include "NodeManager.h"

 

 

int main()

{

    

    CNodeManager Manager;

 

    Manager.Start();

 

    return 0;

}

 

출력 결과

 

꽤 길게 나온 소스코드 양이다..

 

먼저 배열로 이루어진 구성과는 달리

메모리를 필요로 할 때 마다

동적으로 메모리를 잡아주고 삭제하고를 하고 있다.

 

설명은 다음글에..

 

 

반응형

'Programing > 자료구조' 카테고리의 다른 글

[자료구조] 리스트(List) - 6  (0) 2013.01.02
[자료구조] 리스트(List) - 5  (0) 2013.01.02
[자료구조] 리스트(List) - 3  (0) 2013.01.02
[자료구조] 리스트(List) - 2  (0) 2012.12.28
[자료구조] 리스트(List) - 1  (0) 2012.12.17