공부중
[자료구조]리스트(List) - 4 본문
앞 글에서 문제가 된 정적인 배열로는 필요로 하는 메모리 크기에 대해서 바로 바로 대처가 불가능했다.
그러한 문제 해결로 동적인 메모리 구성으로 된 소스를 보자
구조는 다음과 같다
소스코드
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 |