공부중
[자료구조] 리스트(List) - 2 본문
순차리스트(배열을 기반으로 구성된 리스트)를 한번 짜보앗는데..
생각보다 엄청 오래걸렸다…
계속 짜서 코딩 실력좀 올려야 겟다 ㅠ..
배열로 된 리스트를 구성할 예정이고 그 배열 안에 동물객체를 넣어서 관리하는걸 짜보려고 한다.
구조는 아래의 그림과 같다.
소스코드
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; } |
출력 결과
'Programing > 자료구조' 카테고리의 다른 글
[자료구조] 리스트(List) - 5 (0) | 2013.01.02 |
---|---|
[자료구조]리스트(List) - 4 (0) | 2013.01.02 |
[자료구조] 리스트(List) - 3 (0) | 2013.01.02 |
[자료구조] 리스트(List) - 1 (0) | 2012.12.17 |
[자료구조] 자료구조가 뭐에용?? (0) | 2012.12.13 |