공부중

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

Programing/자료구조

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

곤란 2012. 12. 28. 21:00
반응형

 

순차리스트(배열을 기반으로 구성된 리스트)를 한번 짜보앗는데..

 

생각보다 엄청 오래걸렸다…

 

계속 짜서 코딩 실력좀 올려야 겟다 ㅠ..

 

배열로 된 리스트를 구성할 예정이고 그 배열 안에 동물객체를 넣어서 관리하는걸 짜보려고 한다.

 

구조는 아래의 그림과 같다.

 

소스코드

ArrayManager.h

#pragma once

 

#include "Animal.h"

 

enum eChoiceMenu

{

    eFirst=-1,

    eAdd = 1,

    eDel = 2,

    ePrint = 3,

    eExit = 4,

    eOther,

};

 

class CArrayManager

{

public:

 

    CArrayManager();

    ~CArrayManager();

 

    int Start();

 

    int Choice();

 

    void Add( );

    void Del( );

    void DelAll();

    void Sort( int nGetIndex );

    void ArrayPrint();

    void Exit();

 

private:

 

    static const int ArrayMIN = 0;

    static const int ArrayMAX = 10;

 

    int nIndex;            //배열이 가리키는 부분을 알려줄 인덱스저장변수

 

    static CAnimal *ArrayList[ArrayMAX];

    //static을 사용할경우 자동으로 NULL이 된다.

 

};

ArrayManager.cpp

#include <iostream>

 

#include "Animal.h"

#include "ArrayManager.h"

 

CAnimal* CArrayManager::ArrayList[ArrayMAX];

//해당 배열을 찾게 하기 위한 선언

 

CArrayManager::CArrayManager()

{

    this->nIndex = ArrayMIN;

    //this->ArrayList = ;

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

}

 

CArrayManager::~CArrayManager()

{

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

}

 

int CArrayManager::Start()

{

    int nChoiceMenu = eFirst;

    while(true)

    {

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

        std::cin>>nChoiceMenu;

        switch ( nChoiceMenu )

        {

        case eAdd:

            this->Add();

            nChoiceMenu = eFirst;

            break;

        case eDel:

            this->Del();

            nChoiceMenu = eFirst;

            break;

        case ePrint:

            this->ArrayPrint();

            nChoiceMenu = eFirst;

            break;

        case eExit:

            this->Exit();

            return eExit;

        default:

            std::cout<<"다시 선택해 주세요"<<std::endl;

            nChoiceMenu = eFirst;

            break;

        }

    }

}

 

void CArrayManager::Add( )

{

    int nKind = this->Choice();

 

    if( ArrayMIN <= (this->nIndex) && ArrayMAX > (this->nIndex) )    

    {//범위 내로 선택하였을시

        switch (nKind)

        {

        case eDog:

            ArrayList[nIndex] = new CDog;        //강아지 생성

            ++(this->nIndex);

            break;

        case eCat:

            ArrayList[nIndex] = new CCat;        //고양이 생성

            ++(this->nIndex);

            break;

        case eHamster:

            ArrayList[nIndex] = new CHamster;    //햄스터 생성

            ++(this->nIndex);

            break;

        default:    //만일을 대비한 오류예외

            std::cout<<"Err - ArrayManager other nKind"<<std::endl;

            break;

        }

    }

    else

    {

        std::cout<<"가득차서 더이상 넣을수 없습니다."<<std::endl;

    }

}

 

void CArrayManager::Del( )

{

    int nDelIndex = eFirst;

 

    std::cout<<"삭제하려는 블럭을 선택해 주세요"<<std::endl;

    std::cout<<"1부터 10까지 입니다."<<std::endl;

    std::cin>>nDelIndex;

 

    if( ArrayMIN+1 > nDelIndex || ArrayMAX < nDelIndex )

    {//범위에서 벗어낫을시

        std::cout<<"범위에서 벗어났습니다."<<std::endl;

    }

    else if( NULL == ArrayList[nDelIndex-1] )

    {//해당 위치가 널포인터일때..

        std::cout<<"해당위치는 비어있습니다."<<std::endl;

    }

    else

    {

        delete ArrayList[nDelIndex-1];        //삭제

        ArrayList[nDelIndex-1] = NULL;        //삭제 후 널포인터로

        this->Sort(nDelIndex-1);            //삭제 후 정렬

    }

 

}

 

void CArrayManager::DelAll()

{//모두 지우기

    for (int nDelIndex = ArrayMIN; nDelIndex < ArrayMAX-1; ++nDelIndex)

    {

        if( NULL == ArrayList[nDelIndex] )

        {

            std::cout<<nDelIndex<<"번쨰 는 비어있음"<<std::endl;

        }

        else

        {

            delete ArrayList[nDelIndex];

            std::cout<<nDelIndex<<"번쨰 삭제 완료"<<std::endl;

        }

    }

 

    std::cout<<"모든 객체 삭제 완료"<<std::endl;

 

}

 

void CArrayManager::Sort( int nGetIndex )

{

    //std::cout<<"정렬"<<std::endl;

    for ( ; nGetIndex < ArrayMAX; nGetIndex++)

    {

        if( ArrayMAX < nGetIndex || NULL == ArrayList[nGetIndex+1] )

        {//널포인터일 경우 (정렬이 끝날경우 - 다중삭제가 아니므로.)

            std::cout<<" 정렬 끝 "<<std::endl;

        }

        else

        {

            ArrayList[nGetIndex] = ArrayList[nGetIndex+1];

            std::cout<<nGetIndex+1<<"를 "<<nGetIndex<<"로 이동"<<std::endl;

            if( ArrayMAX != nGetIndex+1 )

            {

                ArrayList[nGetIndex+1] = NULL;

            }

        }

    }

    (this->nIndex)--;        //클래스에서 가리키는 인덱스를 감소시켜줌.

}

 

void CArrayManager::ArrayPrint()

{

    for ( int nCycleIndex = ArrayMIN ; nCycleIndex < this->nIndex ; ++nCycleIndex)

    {

        if( NULL == ArrayList[nCycleIndex] )

        {//메모리가 비었을시.

            std::cout<<"해당 메모리는 비었습니다."<<std::endl;

        }

        else

        {

            std::cout<<"배열리스트의"<<nCycleIndex<<"번째 동물"<<std::endl;

            ArrayList[nCycleIndex]->Action();

        }

    }

}

 

void CArrayManager::Exit()

{

    std::cout<<"종료"<<std::endl;

    this->DelAll();

}

 

int CArrayManager::Choice()

{

    int nChoice = eFirst;

    while(true)

    {

        std::cout<<"어떤 동물을 선택하시겠습니까?"<<std::endl;

        std::cout<<"1. 강아지 , 2. 고양이 , 3. 햄스터"<<std::endl;

        std::cin>>nChoice;

        switch (nChoice)

        {

        case eDog:

            return nChoice;

        case eCat:

            return nChoice;

        case eHamster:

            return eHamster;

        default:

            std::cout<<"잘못 선택하셧습니다."<<std::endl;

            break;

        }

    }

}

Animal.h

#pragma once

 

enum eAnimal

{

    eDog = 1,

    eCat,

    eHamster,

};

 

class CAnimal

{

public:

    CAnimal();

    ~CAnimal();

    virtual void Action() = 0;

private:

 

};

 

class CDog : public CAnimal

{

public:

 

    CDog();

    ~CDog();

 

    void Action();

 

private:

 

};

 

class CCat : public CAnimal

{

public:

 

    CCat();

    ~CCat();

 

    void Action();

 

private:

 

};

class CHamster : public CAnimal

{

public:

    

    CHamster();

    ~CHamster();

 

    void Action();

 

private:

 

};

Animal.cpp

#include <iostream>

 

#include "Animal.h"

 

CAnimal::CAnimal()

{

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

}

 

CAnimal::~CAnimal()

{

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

}

 

CDog::CDog()

{

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

}

 

CDog::~CDog()

{

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

}

 

void CDog::Action()

{

    std::cout<<"왈왈"<<std::endl;

}

 

CCat::CCat()

{

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

}

 

CCat::~CCat()

{

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

}

 

void CCat::Action()

{

    std::cout<<"야옹"<<std::endl;

}

 

CHamster::CHamster()

{

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

}

 

CHamster::~CHamster()

{

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

}

 

void CHamster::Action()

{

    std::cout<<"뀨뀨"<<std::endl;

}

main.cpp

#include <iostream>

 

#include <crtdbg.h>

//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 함수 사용필요한 헤더.

 

#include "ArrayManager.h"

 

 

int main()

{

    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    //프로세스가 종료될시 출력창으로 메모리 누수 결과를 출력해줌

 

    CArrayManager ArrayList;

 

    ArrayList.Start();

 

    return 0;

}

 

출력 결과

반응형